Skip to content

Commit 9e61e92

Browse files
committed
feat(graphql): fixed code style and a bug in collection cache handling
1 parent e57e105 commit 9e61e92

File tree

4 files changed

+47
-39
lines changed

4 files changed

+47
-39
lines changed

src/GraphQl/Serializer/ItemNormalizer.php

+11-10
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public function normalize(mixed $object, ?string $format = null, array $context
108108
$data[self::ITEM_IDENTIFIERS_KEY] = $this->identifiersExtractor->getIdentifiersFromItem($object, $context['operation'] ?? null);
109109
}
110110

111-
if (isset($context['graphql_operation_name']) && $context['graphql_operation_name'] === 'mercure_subscription' && is_object($object) && isset($data['id']) && !isset($data['_id'])) {
111+
if (isset($context['graphql_operation_name']) && 'mercure_subscription' === $context['graphql_operation_name'] && \is_object($object) && isset($data['id']) && !isset($data['_id'])) {
112112
$data['_id'] = $data['id'];
113113
$data['id'] = $this->iriConverter->getIriFromResource($object);
114114
}
@@ -128,18 +128,18 @@ protected function normalizeCollectionOfRelations(ApiProperty $propertyMetadata,
128128
}
129129

130130
// Handle relationships for mercure subscriptions
131-
if ($operation instanceof QueryCollection && $context['graphql_operation_name'] === 'mercure_subscription' && $attributeValue instanceof Collection && !$attributeValue->isEmpty()) {
131+
if ($operation instanceof QueryCollection && 'mercure_subscription' === $context['graphql_operation_name'] && $attributeValue instanceof Collection && !$attributeValue->isEmpty()) {
132132
$relationContext = $context;
133133
// Grab collection attributes
134134
$relationContext['attributes'] = $context['attributes']['collection'];
135135
// Iterate over the collection and normalize each item
136-
$data['collection'] = $attributeValue
137-
->map(fn($item) => $this->normalize($item, $format, $relationContext))
136+
$data['collection'] = $attributeValue
137+
->map(fn ($item) => $this->normalize($item, $format, $relationContext))
138138
// Convert the collection to an array
139139
->toArray();
140+
140141
// Handle pagination if it's enabled in the query
141-
$data = $this->addPagination($attributeValue, $data, $context);
142-
return $data;
142+
return $this->addPagination($attributeValue, $data, $context);
143143
}
144144

145145
// to-many are handled directly by the GraphQL resolver
@@ -150,19 +150,20 @@ private function addPagination(Collection $collection, array $data, array $conte
150150
{
151151
if ($context['attributes']['paginationInfo'] ?? false) {
152152
$data['paginationInfo'] = [];
153-
if (array_key_exists('hasNextPage', $context['attributes']['paginationInfo'])) {
153+
if (\array_key_exists('hasNextPage', $context['attributes']['paginationInfo'])) {
154154
$data['paginationInfo']['hasNextPage'] = $collection->count() > ($context['pagination']['itemsPerPage'] ?? 10);
155155
}
156-
if (array_key_exists('itemsPerPage', $context['attributes']['paginationInfo'])) {
156+
if (\array_key_exists('itemsPerPage', $context['attributes']['paginationInfo'])) {
157157
$data['paginationInfo']['itemsPerPage'] = $context['pagination']['itemsPerPage'] ?? 10;
158158
}
159-
if (array_key_exists('lastPage', $context['attributes']['paginationInfo'])) {
159+
if (\array_key_exists('lastPage', $context['attributes']['paginationInfo'])) {
160160
$data['paginationInfo']['lastPage'] = (int) ceil($collection->count() / ($context['pagination']['itemsPerPage'] ?? 10));
161161
}
162-
if (array_key_exists('totalCount', $context['attributes']['paginationInfo'])) {
162+
if (\array_key_exists('totalCount', $context['attributes']['paginationInfo'])) {
163163
$data['paginationInfo']['totalCount'] = $collection->count();
164164
}
165165
}
166+
166167
return $data;
167168
}
168169

src/GraphQl/Subscription/SubscriptionIdentifierGenerator.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public function generateSubscriptionIdentifier(array $fields): string
3131
private function removeTypename(array $data): array
3232
{
3333
foreach ($data as $key => $value) {
34-
if ($key === '__typename') {
34+
if ('__typename' === $key) {
3535
unset($data[$key]);
36-
} elseif (is_array($value)) {
36+
} elseif (\is_array($value)) {
3737
$data[$key] = $this->removeTypename($value);
3838
}
3939
}

src/GraphQl/Subscription/SubscriptionManager.php

+25-24
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public function retrieveSubscriptionId(array $context, ?array $result, ?Operatio
8282
public function getPushPayloads(object $object, string $type): array
8383
{
8484
if ('delete' === $type) {
85-
$payloads = $this->getDeletePushPayloads($object);
85+
$payloads = $this->getDeletePushPayloads($object);
8686
} else {
8787
$payloads = $this->getCreatedOrUpdatedPayloads($object);
8888
}
@@ -119,10 +119,11 @@ private function encodeIriToCacheKey(string $iri): string
119119

120120
private function getResourceId(mixed $privateField, object $previousObject): string
121121
{
122-
$id = $previousObject->{'get' . ucfirst($privateField)}()->getId();
122+
$id = $previousObject->{'get'.ucfirst($privateField)}()->getId();
123123
if ($id instanceof \Stringable) {
124-
return (string)$id;
124+
return (string) $id;
125125
}
126+
126127
return $id;
127128
}
128129

@@ -172,35 +173,35 @@ private function getCreatedOrUpdatedPayloads(object $object): array
172173
$payloads[] = [$subscriptionId, $data];
173174
}
174175
}
176+
175177
return $payloads;
176178
}
177179

178180
private function getDeletePushPayloads(object $object): array
179181
{
180182
$iri = $object->id;
181-
$subscriptions = $this->getSubscriptionsFromIri($iri);
182-
if ($subscriptions === []) {
183-
// Get subscriptions from collection Iri
184-
$subscriptions = $this->getSubscriptionsFromIri($this->getCollectionIri($iri));
185-
}
183+
$subscriptions = array_merge(
184+
$this->getSubscriptionsFromIri($iri),
185+
$this->getSubscriptionsFromIri($this->getCollectionIri($iri))
186+
);
186187

187188
$payloads = [];
188189
foreach ($subscriptions as [$subscriptionId, $subscriptionFields, $subscriptionResult]) {
189190
$payloads[] = [$subscriptionId, ['type' => 'delete', 'payload' => $object]];
190191
}
191192
$this->removeItemFromSubscriptionCache($iri);
193+
192194
return $payloads;
193195
}
194196

195197
private function updateSubscriptionItemCacheData(
196-
string $iri,
197-
array $fields,
198-
?array $result,
199-
bool $private,
200-
array $privateFields,
201-
?object $previousObject
202-
): string
203-
{
198+
string $iri,
199+
array $fields,
200+
?array $result,
201+
bool $private,
202+
array $privateFields,
203+
?object $previousObject,
204+
): string {
204205
$subscriptionsCacheItem = $this->subscriptionsCache->getItem($this->encodeIriToCacheKey($iri));
205206
$subscriptions = [];
206207
if ($subscriptionsCacheItem->isHit()) {
@@ -219,25 +220,24 @@ private function updateSubscriptionItemCacheData(
219220
unset($result['clientSubscriptionId']);
220221
if ($private && $privateFields && $previousObject) {
221222
foreach ($privateFields as $privateField) {
222-
unset($result['__private_field_' . $privateField]);
223+
unset($result['__private_field_'.$privateField]);
223224
}
224225
}
225226
$subscriptions[] = [$subscriptionId, $fields, $result];
226227
$subscriptionsCacheItem->set($subscriptions);
227228
$this->subscriptionsCache->save($subscriptionsCacheItem);
229+
228230
return $subscriptionId;
229231
}
230232

231-
232-
233233
private function updateSubscriptionCollectionCacheData(
234234
string $iri,
235-
array $fields,
236-
): string
237-
{
235+
array $fields,
236+
): string {
238237
$subscriptionCollectionCacheItem = $this->subscriptionsCache->getItem(
239238
$this->encodeIriToCacheKey($this->getCollectionIri($iri)),
240239
);
240+
$collectionSubscriptions = [];
241241
if ($subscriptionCollectionCacheItem->isHit()) {
242242
$collectionSubscriptions = $subscriptionCollectionCacheItem->get();
243243
foreach ($collectionSubscriptions as [$subscriptionId, $subscriptionFields]) {
@@ -247,9 +247,10 @@ private function updateSubscriptionCollectionCacheData(
247247
}
248248
}
249249
$subscriptionId = $this->subscriptionIdentifierGenerator->generateSubscriptionIdentifier($fields + ['__collection' => true]);
250-
$subscriptions[] = [$subscriptionId, $fields, []];
251-
$subscriptionCollectionCacheItem->set($subscriptions);
250+
$collectionSubscriptions[] = [$subscriptionId, $fields];
251+
$subscriptionCollectionCacheItem->set($collectionSubscriptions);
252252
$this->subscriptionsCache->save($subscriptionCollectionCacheItem);
253+
253254
return $subscriptionId;
254255
}
255256
}

src/GraphQl/Tests/Subscription/SubscriptionManagerTest.php

+9-3
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,19 @@ public function testGetPushPayloadsHit(): void
201201
$this->iriConverterProphecy->getIriFromResource($object)->willReturn('/dummies/2');
202202

203203
$cacheItemProphecy = $this->prophesize(CacheItemInterface::class);
204-
$cacheItemProphecy->isHit()->willReturn(true)->shouldBeCalledTimes(2);
204+
$cacheItemProphecy->isHit()->willReturn(true);
205205
$cacheItemProphecy->get()->willReturn([
206206
['subscriptionIdFoo', ['fieldsFoo'], ['resultFoo']],
207207
['subscriptionIdBar', ['fieldsBar'], ['resultBar']],
208208
]);
209+
$cacheItemProphecyCollection = $this->prophesize(CacheItemInterface::class);
210+
$cacheItemProphecyCollection->isHit()->willReturn(true);
211+
$cacheItemProphecyCollection->get()->willReturn([
212+
['subscriptionIdFoo', ['fieldsFoo'], []],
213+
['subscriptionIdBar', ['fieldsBar'], []],
214+
]);
209215
$this->subscriptionsCacheProphecy->getItem('_dummies_2')->willReturn($cacheItemProphecy->reveal());
210-
$this->subscriptionsCacheProphecy->getItem('_dummies')->willReturn($cacheItemProphecy->reveal());
216+
$this->subscriptionsCacheProphecy->getItem('_dummies')->willReturn($cacheItemProphecyCollection->reveal());
211217

212218
$this->normalizeProcessor->process(
213219
$object,
@@ -227,6 +233,6 @@ public function testGetPushPayloadsHit(): void
227233
['resultBar', 'clientSubscriptionId' => 'client-subscription-id']
228234
);
229235

230-
$this->assertEquals([['subscriptionIdFoo', ['newResultFoo']]], $this->subscriptionManager->getPushPayloads($object, 'update'));
236+
$this->assertEquals([['subscriptionIdFoo', ['newResultFoo']], ['subscriptionIdFoo', ['newResultFoo']]], $this->subscriptionManager->getPushPayloads($object, 'update'));
231237
}
232238
}

0 commit comments

Comments
 (0)