Skip to content

Commit decfc5b

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

File tree

4 files changed

+44
-35
lines changed

4 files changed

+44
-35
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

+22-20
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,14 +173,15 @@ 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;
181183
$subscriptions = $this->getSubscriptionsFromIri($iri);
182-
if ($subscriptions === []) {
184+
if ([] === $subscriptions) {
183185
// Get subscriptions from collection Iri
184186
$subscriptions = $this->getSubscriptionsFromIri($this->getCollectionIri($iri));
185187
}
@@ -189,18 +191,18 @@ private function getDeletePushPayloads(object $object): array
189191
$payloads[] = [$subscriptionId, ['type' => 'delete', 'payload' => $object]];
190192
}
191193
$this->removeItemFromSubscriptionCache($iri);
194+
192195
return $payloads;
193196
}
194197

195198
private function updateSubscriptionItemCacheData(
196-
string $iri,
197-
array $fields,
198-
?array $result,
199-
bool $private,
200-
array $privateFields,
201-
?object $previousObject
202-
): string
203-
{
199+
string $iri,
200+
array $fields,
201+
?array $result,
202+
bool $private,
203+
array $privateFields,
204+
?object $previousObject,
205+
): string {
204206
$subscriptionsCacheItem = $this->subscriptionsCache->getItem($this->encodeIriToCacheKey($iri));
205207
$subscriptions = [];
206208
if ($subscriptionsCacheItem->isHit()) {
@@ -219,25 +221,24 @@ private function updateSubscriptionItemCacheData(
219221
unset($result['clientSubscriptionId']);
220222
if ($private && $privateFields && $previousObject) {
221223
foreach ($privateFields as $privateField) {
222-
unset($result['__private_field_' . $privateField]);
224+
unset($result['__private_field_'.$privateField]);
223225
}
224226
}
225227
$subscriptions[] = [$subscriptionId, $fields, $result];
226228
$subscriptionsCacheItem->set($subscriptions);
227229
$this->subscriptionsCache->save($subscriptionsCacheItem);
230+
228231
return $subscriptionId;
229232
}
230233

231-
232-
233234
private function updateSubscriptionCollectionCacheData(
234235
string $iri,
235-
array $fields,
236-
): string
237-
{
236+
array $fields,
237+
): string {
238238
$subscriptionCollectionCacheItem = $this->subscriptionsCache->getItem(
239239
$this->encodeIriToCacheKey($this->getCollectionIri($iri)),
240240
);
241+
$collectionSubscriptions = [];
241242
if ($subscriptionCollectionCacheItem->isHit()) {
242243
$collectionSubscriptions = $subscriptionCollectionCacheItem->get();
243244
foreach ($collectionSubscriptions as [$subscriptionId, $subscriptionFields]) {
@@ -247,9 +248,10 @@ private function updateSubscriptionCollectionCacheData(
247248
}
248249
}
249250
$subscriptionId = $this->subscriptionIdentifierGenerator->generateSubscriptionIdentifier($fields + ['__collection' => true]);
250-
$subscriptions[] = [$subscriptionId, $fields, []];
251-
$subscriptionCollectionCacheItem->set($subscriptions);
251+
$collectionSubscriptions[] = [$subscriptionId, $fields];
252+
$subscriptionCollectionCacheItem->set($collectionSubscriptions);
252253
$this->subscriptionsCache->save($subscriptionCollectionCacheItem);
254+
253255
return $subscriptionId;
254256
}
255257
}

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)