Skip to content

Commit

Permalink
Enhancement: Integration of StoriesResolvedApi for automatic relati…
Browse files Browse the repository at this point in the history
…on resolution (#5)
  • Loading branch information
silasjoisten authored Jan 21, 2025
1 parent 7c007f6 commit 7aaf971
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 1 deletion.
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,26 @@ final class PurgeVarnishHandler implements WebhookHandlerInterface
}
```

#### Auto resolve relations


If you want to update relations automatically, you can enable this with the following configuration:

```yaml
# config/packages/storyblok.yaml
storyblok:
# ...
auto_resolve_relations: true
```

This will replace `StoriesApi` to `StoriesResolvedApi`. The `StoriesResolvedApi` will automatically resolve relations.

> [!WARNING]
> Maximum 50 different relations can be resolved in one request. See
> [Storyblok docs](https://www.storyblok.com/docs/api/content-delivery/v2/stories/retrieve-a-single-story)
> for more information


#### Best Practices

- **Handle Only Necessary Events**: Use the `supports` method to filter only the Webhook events your handler should
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"php": ">=8.3",
"oskarstark/enum-helper": "^1.5",
"psr/log": "^3.0",
"storyblok/php-content-api-client": "^0.1.0",
"storyblok/php-content-api-client": "^0.2.0",
"symfony/config": "^6.0 || ^7.0",
"symfony/dependency-injection": "^6.0 || ^7.0",
"symfony/framework-bundle": "^6.0 || ^7.0",
Expand Down
3 changes: 3 additions & 0 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public function getConfigTreeBuilder(): TreeBuilder
->defaultValue('published')
->cannotBeEmpty()
->end()
->booleanNode('auto_resolve_relations')
->defaultValue(false)
->end()
->end()
;

Expand Down
23 changes: 23 additions & 0 deletions src/DependencyInjection/StoryblokExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@

use Storyblok\Api\AssetsApi;
use Storyblok\Api\AssetsApiInterface;
use Storyblok\Api\Resolver\ResolverInterface;
use Storyblok\Api\Resolver\StoryResolver;
use Storyblok\Api\StoriesApi;
use Storyblok\Api\StoriesApiInterface;
use Storyblok\Api\StoriesResolvedApi;
use Storyblok\Api\StoryblokClient;
use Storyblok\Api\StoryblokClientInterface;
use Storyblok\Bundle\DataCollector\StoryblokCollector;
Expand Down Expand Up @@ -65,6 +70,24 @@ class: TraceableHttpClient::class,
],
));
}

if (true === $config['auto_resolve_relations']) {
$storiesApi = new Definition(StoriesApi::class, [
'$client' => $container->getDefinition(StoryblokClient::class),
'$version' => $container->getParameter('storyblok_api.version'),
]);

$resolver = new Definition(StoryResolver::class);
$container->setAlias(ResolverInterface::class, StoryResolver::class);

$resolvedStoriesApi = new Definition(StoriesResolvedApi::class, [
'$storiesApi' => $storiesApi,
'$resolver' => $resolver,
]);

$container->setDefinition(StoriesResolvedApi::class, $resolvedStoriesApi);
$container->setAlias(StoriesApiInterface::class, StoriesResolvedApi::class);
}
}

private function configureAssetsApi(ContainerBuilder $container): void
Expand Down
4 changes: 4 additions & 0 deletions tests/Unit/DependencyInjection/ConfigurationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,20 @@ public function values(): void
$token = $faker->uuid();
$secret = $faker->uuid();
$version = $faker->randomElement(['draft', 'published']);
$autoResolve = $faker->boolean();

self::assertProcessedConfigurationEquals([
['base_uri' => $url],
['token' => $token],
['webhook_secret' => $secret],
['version' => $version],
['auto_resolve_relations' => $autoResolve],
], [
'base_uri' => $url,
'token' => $token,
'webhook_secret' => $secret,
'version' => $version,
'auto_resolve_relations' => $autoResolve,
]);
}

Expand All @@ -64,6 +67,7 @@ public function defaults(): void
'token' => $token,
'webhook_secret' => null,
'version' => 'published',
'auto_resolve_relations' => false,
]);
}

Expand Down
28 changes: 28 additions & 0 deletions tests/Unit/DependencyInjection/StoryblokExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
use PHPUnit\Framework\TestCase;
use Storyblok\Api\AssetsApi;
use Storyblok\Api\AssetsApiInterface;
use Storyblok\Api\Resolver\ResolverInterface;
use Storyblok\Api\StoriesResolvedApi;
use Storyblok\Api\StoryblokClientInterface;
use Storyblok\Bundle\DataCollector\StoryblokCollector;
use Storyblok\Bundle\DependencyInjection\StoryblokExtension;
Expand Down Expand Up @@ -167,4 +169,30 @@ public function loadWithAssetsToken(): void

self::assertSame($token, $builder->getParameter('storyblok_api.assets_token'));
}

/**
* @test
*/
public function loadWithAutoResolveStoriesTrue(): void
{
$faker = self::faker();

$extension = new StoryblokExtension();
$builder = new ContainerBuilder();
$builder->setParameter('kernel.debug', true);

$config = [
['base_uri' => $faker->url()],
['token' => $faker->uuid()],
['auto_resolve_relations' => true],
];

$extension->load(
$config,
$builder,
);

self::assertTrue($builder->hasAlias(ResolverInterface::class));
self::assertTrue($builder->hasDefinition(StoriesResolvedApi::class));
}
}

0 comments on commit 7aaf971

Please sign in to comment.