Skip to content

Commit ea245c8

Browse files
authored
feat: Introduce allByUuids() (#35)
1 parent d8b1391 commit ea245c8

File tree

5 files changed

+91
-0
lines changed

5 files changed

+91
-0
lines changed

README.md

+16
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,22 @@ $response = $storiesApi->allByContentType('custom_content_type', new StoriesRequ
324324
));
325325
```
326326

327+
### Get multiple stories by multiple uuid's (`array`)
328+
329+
```php
330+
use Storyblok\Api\StoriesApi;
331+
use Storyblok\Api\StoryblokClient;
332+
use Storyblok\Api\Request\StoriesRequest;
333+
use Storyblok\Api\Domain\Value\Uuid;
334+
335+
$client = new StoryblokClient(/* ... */);
336+
337+
$storiesApi = new StoriesApi($client);
338+
$response = $storiesApi->allByUuids([new Uuid(/** ... */), new Uuid(/** ... */)], new StoriesRequest(
339+
language: 'de',
340+
));
341+
```
342+
327343
### Get by uuid (`Storyblok\Api\Domain\Value\Uuid`)
328344

329345
```php

src/StoriesApi.php

+29
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,35 @@ public function allByContentType(string $contentType, ?StoriesRequest $request =
8181
);
8282
}
8383

84+
public function allByUuids(array $uuids, bool $keepOrder = true, ?StoriesRequest $request = null): StoriesResponse
85+
{
86+
Assert::allIsInstanceOf($uuids, Uuid::class);
87+
88+
$request ??= new StoriesRequest();
89+
90+
$uuids = \implode(',', \array_map(static fn (Uuid $uuid) => $uuid->value, $uuids));
91+
92+
$query = ['by_uuids' => $uuids];
93+
94+
if ($keepOrder) {
95+
$query = ['by_uuids_ordered' => $uuids];
96+
}
97+
98+
$response = $this->client->request('GET', self::ENDPOINT, [
99+
'query' => [
100+
...$request->toArray(),
101+
...$query,
102+
'version' => null !== $request->version ? $request->version->value : $this->version->value,
103+
],
104+
]);
105+
106+
return new StoriesResponse(
107+
Total::fromHeaders($response->getHeaders()),
108+
$request->pagination,
109+
$response->toArray(),
110+
);
111+
}
112+
84113
public function bySlug(string $slug, ?StoryRequest $request = null): StoryResponse
85114
{
86115
Assert::stringNotEmpty($slug);

src/StoriesApiInterface.php

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public function all(?StoriesRequest $request = null): StoriesResponse;
3131

3232
public function allByContentType(string $contentType, ?StoriesRequest $request = null): StoriesResponse;
3333

34+
/**
35+
* @param Uuid[] $uuids
36+
*/
37+
public function allByUuids(array $uuids, bool $keepOrder = true, ?StoriesRequest $request = null): StoriesResponse;
38+
3439
public function bySlug(string $slug, ?StoryRequest $request = null): StoryResponse;
3540

3641
public function byUuid(Uuid $uuid, ?StoryRequest $request = null): StoryResponse;

src/StoriesResolvedApi.php

+26
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,32 @@ public function allByContentType(string $contentType, ?StoriesRequest $request =
8484
);
8585
}
8686

87+
public function allByUuids(array $uuids, bool $keepOrder = true, ?StoriesRequest $request = null): StoriesResponse
88+
{
89+
$response = $this->storiesApi->allByUuids($uuids, $keepOrder, $request);
90+
91+
if (null === $request || 0 === $request->withRelations->count()) {
92+
return $response;
93+
}
94+
95+
$stories = [];
96+
97+
foreach ($response->stories as $story) {
98+
$stories[] = $this->resolver->resolve($story, $response->rels);
99+
}
100+
101+
return new StoriesResponse(
102+
$response->total,
103+
$response->pagination,
104+
[
105+
'cv' => $response->cv,
106+
'rels' => $response->rels,
107+
'links' => $response->links,
108+
'stories' => $stories,
109+
],
110+
);
111+
}
112+
87113
public function bySlug(string $slug, ?StoryRequest $request = null): StoryResponse
88114
{
89115
$response = $this->storiesApi->bySlug($slug, $request);

tests/Integration/StoriesApiTest.php

+15
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,21 @@ public function allStoriesByContentTypeAreRetrievedSuccessfully(): void
6161
self::assertSame(1, $response->total->value);
6262
}
6363

64+
#[Test]
65+
public function allStoriesByUuidsAreRetrievedSuccessfully(): void
66+
{
67+
$client = StoryblokFakeClient::willRespond(
68+
self::faker()->storiesResponse(),
69+
['total' => 1],
70+
);
71+
$api = new StoriesApi($client);
72+
73+
$response = $api->allByUuids([new Uuid(self::faker()->uuid())]);
74+
75+
self::assertInstanceOf(StoriesResponse::class, $response);
76+
self::assertSame(1, $response->total->value);
77+
}
78+
6479
#[Test]
6580
public function storyBySlugIsRetrievedSuccessfully(): void
6681
{

0 commit comments

Comments
 (0)