@@ -42,28 +42,33 @@ public function __construct(private readonly CacheItemPoolInterface $subscriptio
42
42
43
43
public function retrieveSubscriptionId (array $ context , ?array $ result , ?Operation $ operation = null ): ?string
44
44
{
45
- /** @var ResolveInfo $info */
46
- $ info = $ context ['info ' ];
47
- $ fields = $ info ->getFieldSelection (\PHP_INT_MAX );
48
- $ this ->arrayRecursiveSort ($ fields , 'ksort ' );
49
45
$ iri = $ operation ? $ this ->getIdentifierFromOperation ($ operation , $ context ['args ' ] ?? []) : $ this ->getIdentifierFromContext ($ context );
50
46
if (empty ($ iri )) {
51
47
return null ;
52
48
}
53
49
50
+ /** @var ResolveInfo $info */
51
+ $ info = $ context ['info ' ];
52
+ $ fields = $ info ->getFieldSelection (\PHP_INT_MAX );
53
+ $ this ->arrayRecursiveSort ($ fields , 'ksort ' );
54
+
54
55
$ options = $ operation ? ($ operation ->getMercure () ?? false ) : false ;
55
56
$ private = $ options ['private ' ] ?? false ;
56
57
$ privateFields = $ options ['private_fields ' ] ?? [];
57
58
$ previousObject = $ context ['graphql_context ' ]['previous_object ' ] ?? null ;
59
+ $ privateFieldData = [];
58
60
if ($ private && $ privateFields && $ previousObject ) {
59
61
foreach ($ options ['private_fields ' ] as $ privateField ) {
60
- $ fields ['__private_field_ ' .$ privateField ] = $ this ->getResourceId ($ privateField , $ previousObject );
62
+ $ fieldData = $ this ->getResourceId ($ privateField , $ previousObject );
63
+ $ fields ['__private_field_ ' .$ privateField ] = $ fieldData ;
64
+ $ privateFieldData [] = $ fieldData ;
61
65
}
62
66
}
63
67
if ($ operation instanceof Subscription && $ operation ->isCollection ()) {
64
68
$ subscriptionId = $ this ->updateSubscriptionCollectionCacheData (
65
69
$ iri ,
66
70
$ fields ,
71
+ $ privateFieldData
67
72
);
68
73
} else {
69
74
$ subscriptionId = $ this ->updateSubscriptionItemCacheData (
@@ -93,9 +98,15 @@ public function getPushPayloads(object $object, string $type): array
93
98
/**
94
99
* @return array<array>
95
100
*/
96
- private function getSubscriptionsFromIri (string $ iri ): array
101
+ private function getSubscriptionsFromIri (string $ iri, array $ fields = [] ): array
97
102
{
98
- $ subscriptionsCacheItem = $ this ->subscriptionsCache ->getItem ($ this ->encodeIriToCacheKey ($ iri ));
103
+ $ subscriptionsCacheItem = $ this ->subscriptionsCache ->getItem (
104
+ $ this ->generatePrivateCacheKeyPart (
105
+ $ this ->encodeIriToCacheKey ($ iri ),
106
+ $ fields
107
+ )
108
+
109
+ );
99
110
100
111
if ($ subscriptionsCacheItem ->isHit ()) {
101
112
return $ subscriptionsCacheItem ->get ();
@@ -134,13 +145,6 @@ private function getCollectionIri(string $iri): string
134
145
135
146
private function getCreatedOrUpdatedPayloads (object $ object ): array
136
147
{
137
- $ iri = $ this ->iriConverter ->getIriFromResource ($ object );
138
- // Add collection subscriptions
139
- $ subscriptions = array_merge (
140
- $ this ->getSubscriptionsFromIri ($ this ->getCollectionIri ($ iri )),
141
- $ this ->getSubscriptionsFromIri ($ iri )
142
- );
143
-
144
148
$ resourceClass = $ this ->getObjectClass ($ object );
145
149
$ resourceMetadata = $ this ->resourceMetadataCollectionFactory ->create ($ resourceClass );
146
150
$ shortName = $ resourceMetadata ->getOperation ()->getShortName ();
@@ -155,6 +159,13 @@ private function getCreatedOrUpdatedPayloads(object $object): array
155
159
}
156
160
}
157
161
162
+ $ iri = $ this ->iriConverter ->getIriFromResource ($ object );
163
+ // Add collection subscriptions
164
+ $ subscriptions = array_merge (
165
+ $ this ->getSubscriptionsFromIri ($ this ->getCollectionIri ($ iri ), $ privateFieldData ),
166
+ $ this ->getSubscriptionsFromIri ($ iri )
167
+ );
168
+
158
169
$ payloads = [];
159
170
foreach ($ subscriptions as [$ subscriptionId , $ subscriptionFields , $ subscriptionResult ]) {
160
171
if ($ privateFieldData ) {
@@ -182,12 +193,13 @@ private function getDeletePushPayloads(object $object): array
182
193
$ iri = $ object ->id ;
183
194
$ subscriptions = array_merge (
184
195
$ this ->getSubscriptionsFromIri ($ iri ),
185
- $ this ->getSubscriptionsFromIri ($ this ->getCollectionIri ($ iri ))
196
+ $ this ->getSubscriptionsFromIri ($ this ->getCollectionIri ($ iri ), $ object -> private ),
186
197
);
187
198
188
199
$ payloads = [];
200
+ $ payload = ['type ' => 'delete ' , 'payload ' => ['id ' => $ object ->id , 'iri ' => $ object ->iri , 'type ' => $ object ->type ]];
189
201
foreach ($ subscriptions as [$ subscriptionId , $ subscriptionFields , $ subscriptionResult ]) {
190
- $ payloads [] = [$ subscriptionId , [ ' type ' => ' delete ' , ' payload ' => $ object ] ];
202
+ $ payloads [] = [$ subscriptionId , $ payload ];
191
203
}
192
204
$ this ->removeItemFromSubscriptionCache ($ iri );
193
205
@@ -216,12 +228,14 @@ private function updateSubscriptionItemCacheData(
216
228
}
217
229
}
218
230
219
- $ subscriptionId = $ this ->subscriptionIdentifierGenerator ->generateSubscriptionIdentifier ($ fields );
220
231
unset($ result ['clientSubscriptionId ' ]);
221
232
if ($ private && $ privateFields && $ previousObject ) {
233
+ $ subscriptionId = $ this ->subscriptionIdentifierGenerator ->generateSubscriptionIdentifier ($ fields );
222
234
foreach ($ privateFields as $ privateField ) {
223
235
unset($ result ['__private_field_ ' .$ privateField ]);
224
236
}
237
+ } else {
238
+ $ subscriptionId = $ this ->subscriptionIdentifierGenerator ->generateSubscriptionIdentifier ($ fields );
225
239
}
226
240
$ subscriptions [] = [$ subscriptionId , $ fields , $ result ];
227
241
$ subscriptionsCacheItem ->set ($ subscriptions );
@@ -232,10 +246,15 @@ private function updateSubscriptionItemCacheData(
232
246
233
247
private function updateSubscriptionCollectionCacheData (
234
248
string $ iri ,
235
- array $ fields ,
249
+ array $ fields ,
250
+ array $ privateFieldData ,
236
251
): string {
252
+
237
253
$ subscriptionCollectionCacheItem = $ this ->subscriptionsCache ->getItem (
238
- $ this ->encodeIriToCacheKey ($ this ->getCollectionIri ($ iri )),
254
+ $ this ->generatePrivateCacheKeyPart (
255
+ $ this ->encodeIriToCacheKey ($ this ->getCollectionIri ($ iri )),
256
+ $ privateFieldData
257
+ ),
239
258
);
240
259
$ collectionSubscriptions = [];
241
260
if ($ subscriptionCollectionCacheItem ->isHit ()) {
@@ -253,4 +272,13 @@ private function updateSubscriptionCollectionCacheData(
253
272
254
273
return $ subscriptionId ;
255
274
}
275
+
276
+ private function generatePrivateCacheKeyPart (string $ iriKey , array $ fields = []): string
277
+ {
278
+ if (empty ($ fields )) {
279
+ return $ iriKey ;
280
+ }
281
+ return $ iriKey .'_ ' .implode ('_ ' , $ fields );
282
+ }
283
+
256
284
}
0 commit comments