1: <?php declare(strict_types=1);
2:
3: namespace Salient\Contract\Sync;
4:
5: use Salient\Contract\Core\HasProvider;
6: use Salient\Contract\Core\TextComparisonAlgorithm;
7: use Salient\Contract\Core\TextComparisonFlag;
8: use Salient\Contract\Iterator\FluentIteratorInterface;
9:
10: /**
11: * Provides an entity-agnostic interface to a SyncProviderInterface's
12: * implementation of sync operations for an entity
13: *
14: * @template TEntity of SyncEntityInterface
15: *
16: * @extends HasProvider<SyncProviderInterface>
17: */
18: interface SyncEntityProviderInterface extends HasProvider
19: {
20: /**
21: * Get the sync entity being serviced
22: *
23: * @return class-string<TEntity>
24: */
25: public function entity(): string;
26:
27: /**
28: * Perform an arbitrary sync operation on one or more backend entities
29: *
30: * @internal
31: *
32: * @param SyncOperation::* $operation
33: * @param mixed ...$args
34: * @return FluentIteratorInterface<array-key,TEntity>|TEntity
35: * @phpstan-return (
36: * $operation is SyncOperation::*_LIST
37: * ? FluentIteratorInterface<array-key,TEntity>
38: * : TEntity
39: * )
40: */
41: public function run($operation, ...$args);
42:
43: /**
44: * Add an entity to the backend
45: *
46: * @param TEntity $entity
47: * @param mixed ...$args
48: * @return TEntity
49: */
50: public function create($entity, ...$args): SyncEntityInterface;
51:
52: /**
53: * Get an entity from the backend
54: *
55: * @param int|string|null $id
56: * @param mixed ...$args
57: * @return TEntity
58: */
59: public function get($id, ...$args): SyncEntityInterface;
60:
61: /**
62: * Update an entity in the backend
63: *
64: * @param TEntity $entity
65: * @param mixed ...$args
66: * @return TEntity
67: */
68: public function update($entity, ...$args): SyncEntityInterface;
69:
70: /**
71: * Delete an entity from the backend
72: *
73: * @param TEntity $entity
74: * @param mixed ...$args
75: * @return TEntity
76: */
77: public function delete($entity, ...$args): SyncEntityInterface;
78:
79: /**
80: * Add a list of entities to the backend
81: *
82: * @param iterable<TEntity> $entities
83: * @param mixed ...$args
84: * @return FluentIteratorInterface<array-key,TEntity>
85: */
86: public function createList(iterable $entities, ...$args): FluentIteratorInterface;
87:
88: /**
89: * Get a list of entities from the backend
90: *
91: * @param mixed ...$args
92: * @return FluentIteratorInterface<array-key,TEntity>
93: */
94: public function getList(...$args): FluentIteratorInterface;
95:
96: /**
97: * Update a list of entities in the backend
98: *
99: * @param iterable<TEntity> $entities
100: * @param mixed ...$args
101: * @return FluentIteratorInterface<array-key,TEntity>
102: */
103: public function updateList(iterable $entities, ...$args): FluentIteratorInterface;
104:
105: /**
106: * Delete a list of entities from the backend
107: *
108: * @param iterable<TEntity> $entities
109: * @param mixed ...$args
110: * @return FluentIteratorInterface<array-key,TEntity>
111: */
112: public function deleteList(iterable $entities, ...$args): FluentIteratorInterface;
113:
114: /**
115: * Perform an arbitrary sync operation on a list of backend entities and
116: * return an array
117: *
118: * @internal
119: *
120: * @param SyncOperation::*_LIST $operation
121: * @param mixed ...$args
122: * @return array<TEntity>
123: */
124: public function runA($operation, ...$args): array;
125:
126: /**
127: * Add a list of entities to the backend and return an array
128: *
129: * @param iterable<TEntity> $entities
130: * @param mixed ...$args
131: * @return array<TEntity>
132: */
133: public function createListA(iterable $entities, ...$args): array;
134:
135: /**
136: * Get a list of entities from the backend as an array
137: *
138: * @param mixed ...$args
139: * @return array<TEntity>
140: */
141: public function getListA(...$args): array;
142:
143: /**
144: * Update a list of entities in the backend and return an array
145: *
146: * @param iterable<TEntity> $entities
147: * @param mixed ...$args
148: * @return array<TEntity>
149: */
150: public function updateListA(iterable $entities, ...$args): array;
151:
152: /**
153: * Delete a list of entities from the backend and return an array
154: *
155: * @param iterable<TEntity> $entities
156: * @param mixed ...$args
157: * @return array<TEntity>
158: */
159: public function deleteListA(iterable $entities, ...$args): array;
160:
161: /**
162: * Use a property of the entity class to resolve names to entities
163: *
164: * @param int-mask-of<TextComparisonAlgorithm::*|TextComparisonFlag::*> $algorithm
165: * @param array<TextComparisonAlgorithm::*,float>|float|null $uncertaintyThreshold
166: * @param string|null $weightProperty If multiple entities are equally
167: * similar to a given name, the one with the highest weight is preferred.
168: * @return SyncEntityResolverInterface<TEntity>
169: */
170: public function getResolver(
171: ?string $nameProperty = null,
172: int $algorithm = TextComparisonAlgorithm::SAME,
173: $uncertaintyThreshold = null,
174: ?string $weightProperty = null,
175: bool $requireOneMatch = false
176: ): SyncEntityResolverInterface;
177:
178: /**
179: * Perform sync operations on the backend directly, ignoring any entities in
180: * the entity store
181: *
182: * @return $this
183: */
184: public function online();
185:
186: /**
187: * Perform "get" operations on the entity store, throwing an exception if
188: * entities have never been synced with the backend
189: *
190: * @return $this
191: */
192: public function offline();
193:
194: /**
195: * Retrieve entities directly from the backend unless it cannot be reached
196: * or the entity store's copies are sufficiently fresh
197: *
198: * @return $this
199: */
200: public function offlineFirst();
201:
202: /**
203: * Do not resolve deferred entities or relationships
204: *
205: * @return $this
206: */
207: public function doNotResolve();
208:
209: /**
210: * Resolve deferred entities and relationships immediately
211: *
212: * @return $this
213: */
214: public function resolveEarly();
215:
216: /**
217: * Resolve deferred entities and relationships after reaching the end of
218: * each stream of entity data
219: *
220: * @return $this
221: */
222: public function resolveLate();
223:
224: /**
225: * Do not hydrate entities returned by the backend
226: *
227: * @return $this
228: */
229: public function doNotHydrate();
230:
231: /**
232: * Apply the given hydration policy to entities returned by the backend
233: *
234: * @param HydrationPolicy::* $policy
235: * @param class-string<SyncEntityInterface>|null $entity
236: * @param array<int<1,max>>|int<1,max>|null $depth
237: * @return $this
238: */
239: public function hydrate(
240: int $policy = HydrationPolicy::EAGER,
241: ?string $entity = null,
242: $depth = null
243: );
244: }
245: