@@ -131,7 +131,7 @@ private function encodeIriToCacheKey(string $iri): string
131131    private  function  getResourceId (mixed  $ privateField , object   $ previousObject ): string 
132132    {
133133        $ id  = $ previousObject ->{'get ' .ucfirst ($ privateField )}()->getId ();
134-         if  ($ id  instanceof  \Stringable) {
134+         if  ($ id  instanceof  \Stringable ||  is_numeric ( $ id ) ) {
135135            return  (string ) $ id ;
136136        }
137137
@@ -149,39 +149,61 @@ private function getCreatedOrUpdatedPayloads(object $object): array
149149        $ resourceMetadata  = $ this  ->resourceMetadataCollectionFactory ->create ($ resourceClass );
150150        $ shortName  = $ resourceMetadata ->getOperation ()->getShortName ();
151151
152-         $ mercure  = $ resourceMetadata ->getOperation ()->getMercure () ?? false ;
153-         $ private  = $ mercure ['private ' ] ?? false ;
154-         $ privateFieldsConfig  = $ mercure ['private_fields ' ] ?? [];
155-         $ privateFieldData  = [];
156-         if  ($ private  && $ privateFieldsConfig ) {
157-             foreach  ($ privateFieldsConfig  as  $ privateField ) {
158-                 $ privateFieldData ['__private_field_ ' .$ privateField ] = $ this  ->getResourceId ($ privateField , $ object );
159-             }
160-         }
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- 
169152        $ payloads  = [];
170-         foreach  ($ subscriptions  as  [$ subscriptionId , $ subscriptionFields , $ subscriptionResult ]) {
171-             if  ($ privateFieldData ) {
172-                 $ fieldDiff  = array_intersect_assoc ($ subscriptionFields , $ privateFieldData );
173-                 if  ($ fieldDiff  !== $ privateFieldData ) {
153+         foreach  ($ resourceMetadata  as  $ apiResource ) {
154+             foreach  ($ apiResource ->getGraphQlOperations () as  $ operation ) {
155+                 if  (!$ operation  instanceof  Subscription) {
174156                    continue ;
175157                }
176-             }
177-             $ resolverContext  = ['fields '  => $ subscriptionFields , 'is_collection '  => false , 'is_mutation '  => false , 'is_subscription '  => true ];
178-             $ operation  = (new  Subscription ())->withName ('mercure_subscription ' )->withShortName ($ shortName );
179-             $ data  = $ this  ->normalizeProcessor ->process ($ object , $ operation , [], $ resolverContext );
180- 
181-             unset($ data ['clientSubscriptionId ' ]);
158+                 $ mercure  = $ resourceMetadata ->getOperation ()->getMercure () ?? false ;
159+                 $ operationMercure  = $ operation ->getMercure () ?? false ;
160+                 if  ($ mercure  !== false  && $ operationMercure  !== false ) {
161+                     /** @noinspection SlowArrayOperationsInLoopInspection */ 
162+                     $ mercure  = array_merge ($ mercure , $ operationMercure );
163+                 }
164+                 $ private  = $ mercure ['private ' ] ?? false ;
165+                 $ privateFieldsConfig  = $ mercure ['private_fields ' ] ?? [];
166+                 $ privateFieldData  = [];
167+                 if  ($ private  && $ privateFieldsConfig ) {
168+                     foreach  ($ privateFieldsConfig  as  $ privateField ) {
169+                         $ privateFieldData ['__private_field_ '  . $ privateField ] = $ this  ->getResourceId (
170+                             $ privateField ,
171+                             $ object
172+                         );
173+                     }
174+                 }
182175
183-             if  ($ data  !== $ subscriptionResult ) {
184-                 $ payloads [] = [$ subscriptionId , $ data ];
176+                 $ iri  = $ this  ->iriConverter ->getIriFromResource ($ object );
177+                 // Add collection subscriptions 
178+                 $ subscriptions  = array_merge (
179+                     $ this  ->getSubscriptionsFromIri ($ this  ->getCollectionIri ($ iri ), $ privateFieldData ),
180+                     $ this  ->getSubscriptionsFromIri ($ iri )
181+                 );
182+ 
183+                 foreach  ($ subscriptions  as  [$ subscriptionId , $ subscriptionFields , $ subscriptionResult ]) {
184+                     if  ($ privateFieldData ) {
185+                         $ fieldDiff  = array_intersect_assoc ($ subscriptionFields , $ privateFieldData );
186+                         if  ($ fieldDiff  !== $ privateFieldData ) {
187+                             continue ;
188+                         }
189+                     }
190+                     $ resolverContext  = [
191+                         'fields '           => $ subscriptionFields ,
192+                         'is_collection '    => false ,
193+                         'is_mutation '      => false ,
194+                         'is_subscription '  => true 
195+                     ];
196+                     $ subscriptionOperation  = (new  Subscription ())->withName ('mercure_subscription ' )->withShortName (
197+                         $ shortName
198+                     );
199+                     $ data  = $ this  ->normalizeProcessor ->process ($ object , $ subscriptionOperation , [], $ resolverContext );
200+ 
201+                     unset($ data ['clientSubscriptionId ' ]);
202+ 
203+                     if  ($ data  !== $ subscriptionResult ) {
204+                         $ payloads [] = [$ subscriptionId , $ data ];
205+                     }
206+                 }
185207            }
186208        }
187209
0 commit comments