@@ -50,6 +50,7 @@ public function retrieveSubscriptionId(array $context, ?array $result, ?Operatio
50
50
if (empty ($ iri )) {
51
51
return null ;
52
52
}
53
+
53
54
$ options = $ operation ->getMercure () ?? false ;
54
55
$ private = $ options ['private ' ] ?? false ;
55
56
$ privateFields = $ options ['private_fields ' ] ?? [];
@@ -59,33 +60,21 @@ public function retrieveSubscriptionId(array $context, ?array $result, ?Operatio
59
60
$ fields ['__private_field_ ' .$ privateField ] = $ this ->getResourceId ($ privateField , $ previousObject );
60
61
}
61
62
}
62
- $ subscriptionsCacheItem = $ this ->subscriptionsCache ->getItem ($ this ->encodeIriToCacheKey ($ iri ));
63
- $ subscriptions = [];
64
- if ($ subscriptionsCacheItem ->isHit ()) {
65
- $ subscriptions = $ subscriptionsCacheItem ->get ();
66
- foreach ($ subscriptions as [$ subscriptionId , $ subscriptionFields , $ subscriptionResult ]) {
67
- if ($ subscriptionFields === $ fields ) {
68
- return $ subscriptionId ;
69
- }
70
- }
71
- }
72
-
73
- $ subscriptionId = $ this ->subscriptionIdentifierGenerator ->generateSubscriptionIdentifier ($ fields );
74
- unset($ result ['clientSubscriptionId ' ]);
75
- if ($ private && $ privateFields && $ previousObject ) {
76
- foreach ($ options ['private_fields ' ] as $ privateField ) {
77
- unset($ result ['__private_field_ ' .$ privateField ]);
78
- }
63
+ if ($ operation ->isCollection ()) {
64
+ $ subscriptionId = $ this ->updateSubscriptionCollectionCacheData (
65
+ $ iri ,
66
+ $ fields ,
67
+ );
68
+ } else {
69
+ $ subscriptionId = $ this ->updateSubscriptionItemCacheData (
70
+ $ iri ,
71
+ $ fields ,
72
+ $ result ,
73
+ $ private ,
74
+ $ privateFields ,
75
+ $ previousObject
76
+ );
79
77
}
80
- $ subscriptions [] = [$ subscriptionId , $ fields , $ result ];
81
- $ subscriptionsCacheItem ->set ($ subscriptions );
82
- $ this ->subscriptionsCache ->save ($ subscriptionsCacheItem );
83
-
84
- $ this ->updateSubscriptionCollectionCacheData (
85
- $ iri ,
86
- $ fields ,
87
- $ subscriptions ,
88
- );
89
78
90
79
return $ subscriptionId ;
91
80
}
@@ -123,25 +112,9 @@ private function removeItemFromSubscriptionCache(string $iri): void
123
112
}
124
113
}
125
114
126
- private function updateSubscriptionCollectionCacheData (
127
- ?string $ iri ,
128
- array $ fields ,
129
- array $ subscriptions ,
130
- ): void
115
+ private function encodeIriToCacheKey (string $ iri ): string
131
116
{
132
- $ subscriptionCollectionCacheItem = $ this ->subscriptionsCache ->getItem (
133
- $ this ->encodeIriToCacheKey ($ this ->getCollectionIri ($ iri )),
134
- );
135
- if ($ subscriptionCollectionCacheItem ->isHit ()) {
136
- $ collectionSubscriptions = $ subscriptionCollectionCacheItem ->get ();
137
- foreach ($ collectionSubscriptions as [$ subscriptionId , $ subscriptionFields , $ subscriptionResult ]) {
138
- if ($ subscriptionFields === $ fields ) {
139
- return ;
140
- }
141
- }
142
- }
143
- $ subscriptionCollectionCacheItem ->set ($ subscriptions );
144
- $ this ->subscriptionsCache ->save ($ subscriptionCollectionCacheItem );
117
+ return str_replace ('/ ' , '_ ' , $ iri );
145
118
}
146
119
147
120
private function getResourceId (mixed $ privateField , object $ previousObject ): string
@@ -161,11 +134,11 @@ private function getCollectionIri(string $iri): string
161
134
private function getCreatedOrUpdatedPayloads (object $ object ): array
162
135
{
163
136
$ iri = $ this ->iriConverter ->getIriFromResource ($ object );
164
- $ subscriptions = $ this -> getSubscriptionsFromIri ( $ iri );
165
- if ( $ subscriptions === []) {
166
- // Get subscriptions from collection Iri
167
- $ subscriptions = $ this ->getSubscriptionsFromIri ($ this -> getCollectionIri ( $ iri ));
168
- }
137
+ // Add collection subscriptions
138
+ $ subscriptions = array_merge (
139
+ $ this -> getSubscriptionsFromIri ( $ this -> getCollectionIri ( $ iri )),
140
+ $ this ->getSubscriptionsFromIri ($ iri )
141
+ );
169
142
170
143
$ resourceClass = $ this ->getObjectClass ($ object );
171
144
$ resourceMetadata = $ this ->resourceMetadataCollectionFactory ->create ($ resourceClass );
@@ -190,7 +163,7 @@ private function getCreatedOrUpdatedPayloads(object $object): array
190
163
}
191
164
}
192
165
$ resolverContext = ['fields ' => $ subscriptionFields , 'is_collection ' => false , 'is_mutation ' => false , 'is_subscription ' => true ];
193
- $ operation = (new Subscription ())->withName ('update_subscription ' )->withShortName ($ shortName );
166
+ $ operation = (new Subscription ())->withName ('mercure_subscription ' )->withShortName ($ shortName );
194
167
$ data = $ this ->normalizeProcessor ->process ($ object , $ operation , [], $ resolverContext );
195
168
196
169
unset($ data ['clientSubscriptionId ' ]);
@@ -219,8 +192,64 @@ private function getDeletePushPayloads(object $object): array
219
192
return $ payloads ;
220
193
}
221
194
222
- private function encodeIriToCacheKey (string $ iri ): string
195
+ private function updateSubscriptionItemCacheData (
196
+ string $ iri ,
197
+ array $ fields ,
198
+ ?array $ result ,
199
+ bool $ private ,
200
+ array $ privateFields ,
201
+ ?object $ previousObject
202
+ ): string
223
203
{
224
- return str_replace ('/ ' , '_ ' , $ iri );
204
+ $ subscriptionsCacheItem = $ this ->subscriptionsCache ->getItem ($ this ->encodeIriToCacheKey ($ iri ));
205
+ $ subscriptions = [];
206
+ if ($ subscriptionsCacheItem ->isHit ()) {
207
+ /*
208
+ * @var array<array{string, array<string, string|array>, array<string, string|array>}>
209
+ */
210
+ $ subscriptions = $ subscriptionsCacheItem ->get ();
211
+ foreach ($ subscriptions as [$ subscriptionId , $ subscriptionFields , $ subscriptionResult ]) {
212
+ if ($ subscriptionFields === $ fields ) {
213
+ return $ subscriptionId ;
214
+ }
215
+ }
216
+ }
217
+
218
+ $ subscriptionId = $ this ->subscriptionIdentifierGenerator ->generateSubscriptionIdentifier ($ fields );
219
+ unset($ result ['clientSubscriptionId ' ]);
220
+ if ($ private && $ privateFields && $ previousObject ) {
221
+ foreach ($ privateFields as $ privateField ) {
222
+ unset($ result ['__private_field_ ' . $ privateField ]);
223
+ }
224
+ }
225
+ $ subscriptions [] = [$ subscriptionId , $ fields , $ result ];
226
+ $ subscriptionsCacheItem ->set ($ subscriptions );
227
+ $ this ->subscriptionsCache ->save ($ subscriptionsCacheItem );
228
+ return $ subscriptionId ;
229
+ }
230
+
231
+
232
+
233
+ private function updateSubscriptionCollectionCacheData (
234
+ string $ iri ,
235
+ array $ fields ,
236
+ ): string
237
+ {
238
+ $ subscriptionCollectionCacheItem = $ this ->subscriptionsCache ->getItem (
239
+ $ this ->encodeIriToCacheKey ($ this ->getCollectionIri ($ iri )),
240
+ );
241
+ if ($ subscriptionCollectionCacheItem ->isHit ()) {
242
+ $ collectionSubscriptions = $ subscriptionCollectionCacheItem ->get ();
243
+ foreach ($ collectionSubscriptions as [$ subscriptionId , $ subscriptionFields ]) {
244
+ if ($ subscriptionFields === $ fields ) {
245
+ return $ subscriptionId ;
246
+ }
247
+ }
248
+ }
249
+ $ subscriptionId = $ this ->subscriptionIdentifierGenerator ->generateSubscriptionIdentifier ($ fields + ['__collection ' => true ]);
250
+ $ subscriptions [] = [$ subscriptionId , $ fields , []];
251
+ $ subscriptionCollectionCacheItem ->set ($ subscriptions );
252
+ $ this ->subscriptionsCache ->save ($ subscriptionCollectionCacheItem );
253
+ return $ subscriptionId ;
225
254
}
226
255
}
0 commit comments