Skip to content

Commit

Permalink
Rewording parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
darkweak committed Nov 12, 2021
1 parent 8fcbcad commit 599dd48
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 160 deletions.
Expand Up @@ -224,12 +224,9 @@ private function registerCommonConfiguration(ContainerBuilder $container, array
$container->setParameter('api_platform.http_cache.validation.header', $config['http_cache']['validation']['header']);
$container->setParameter('api_platform.http_cache.validation.separator', $config['http_cache']['validation']['separator']);
$container->setParameter('api_platform.http_cache.invalidation.type', $config['http_cache']['invalidation']['type']);
$container->setParameter('api_platform.http_cache.invalidation.purger.souinBaseHost', $config['http_cache']['invalidation']['purger']['souinBaseHost']);
$container->setParameter('api_platform.http_cache.invalidation.purger.souinBaseApiPath', $config['http_cache']['invalidation']['purger']['souinBaseApiPath']);
$container->setParameter('api_platform.http_cache.invalidation.purger.souinApiSouinPath', $config['http_cache']['invalidation']['purger']['souinApiSouinPath']);
$container->setParameter('api_platform.http_cache.invalidation.purger.souinApiAuthenticationPath', $config['http_cache']['invalidation']['purger']['souinApiAuthenticationPath']);
$container->setParameter('api_platform.http_cache.invalidation.purger.username', $config['http_cache']['invalidation']['purger']['username']);
$container->setParameter('api_platform.http_cache.invalidation.purger.password', $config['http_cache']['invalidation']['purger']['password']);
$container->setParameter('api_platform.http_cache.invalidation.purger.dsn', $config['http_cache']['invalidation']['purger']['dsn']);
$container->setParameter('api_platform.http_cache.invalidation.purger.path', $config['http_cache']['invalidation']['purger']['path']);
$container->setParameter('api_platform.http_cache.invalidation.purger.token', $config['http_cache']['invalidation']['purger']['token']);

$container->setAlias('api_platform.operation_path_resolver.default', $config['default_operation_path_resolver']);
$container->setAlias('api_platform.path_segment_name_generator', $config['path_segment_name_generator']);
Expand Down Expand Up @@ -625,12 +622,9 @@ private function registerHttpCacheConfiguration(ContainerBuilder $container, arr
case 'souin':
$container->getDefinition('api_platform.http_cache.purger.souin')->setArguments([
$definitions,
$config['http_cache']['invalidation']['purger']['souinBaseHost'],
$config['http_cache']['invalidation']['purger']['souinBaseApiPath'],
$config['http_cache']['invalidation']['purger']['souinApiSouinPath'],
$config['http_cache']['invalidation']['purger']['souinApiAuthenticationPath'],
$config['http_cache']['invalidation']['purger']['username'],
$config['http_cache']['invalidation']['purger']['password'],
$config['http_cache']['invalidation']['purger']['dsn'],
$config['http_cache']['invalidation']['purger']['path'],
$config['http_cache']['invalidation']['purger']['token'],
]);
$container->setAlias('api_platform.http_cache.purger', 'api_platform.http_cache.purger.souin');
break;
Expand Down
Expand Up @@ -430,29 +430,17 @@ private function addHttpCacheSection(ArrayNodeDefinition $rootNode): void
->addDefaultsIfNotSet()
->info('Define the purger configuration.')
->children()
->scalarNode('souinBaseHost')
->scalarNode('dsn')
->defaultValue('')
->info('Souin base host')
->info('Purger dsn')
->end()
->scalarNode('souinBaseApiPath')
->scalarNode('path')
->defaultValue('')
->info('Souin base API path')
->info('Purger API path')
->end()
->scalarNode('souinApiSouinPath')
->scalarNode('token')
->defaultValue('')
->info('Souin API path under the Souin base API path')
->end()
->scalarNode('souinApiAuthenticationPath')
->defaultValue('')
->info('Souin authentication API path')
->end()
->scalarNode('username')
->defaultValue('')
->info('Username to use to log in to the Souin API if secured')
->end()
->scalarNode('password')
->defaultValue('')
->info('Password to use to log in to the Souin API if secured')
->info('JWT token to use if the provider API if secured')
->end()
->end()
->end()
Expand Down
80 changes: 10 additions & 70 deletions src/Core/HttpCache/SouinPurger.php
Expand Up @@ -36,17 +36,11 @@ class SouinPurger implements PurgerInterface
// Clients to send cache invalidation
private $clients;

// User credentials if Souin is protected by JWT
private $password;
private $username;

// Souin relative paths
private $souinApiAuthenticationPath;
private $souinApiSouinPath;
private $souinBaseApiPath;
private $souinBaseHost;
private $dsn;
private $path;

// User token dynamically assigned
// Souin token if mandatory
private $token;

/**
Expand All @@ -55,75 +49,22 @@ class SouinPurger implements PurgerInterface
public function __construct(
array $clients,
LoggerInterface $logger,
string $souinBaseHost,
string $souinBaseApiPath,
string $souinApiSouinPath,
string $souinApiAuthenticationPath,
string $username,
string $password
string $dsn,
string $path,
string $token
) {
$this->clients = $clients;
$this->logger = $logger;
$this->password = $password;
$this->souinBaseHost = $souinBaseHost;
$this->souinBaseApiPath = $souinBaseApiPath;
$this->souinApiSouinPath = $souinApiSouinPath;
$this->souinApiAuthenticationPath = $souinApiAuthenticationPath;
$this->username = $username;
}

private function getBaseUrl(): string
{
return $this->souinBaseHost.$this->souinBaseApiPath;
}

private function getSouinApiUrl(): string
{
return $this->getBaseUrl().$this->souinApiSouinPath;
}

private function getSouinAuthenticationUrl(): string
{
return $this->getBaseUrl().$this->souinApiAuthenticationPath;
$this->dsn = $dsn;
$this->path = $path;
$this->token = $token;
}

private function getParametersFromIris(array $iris): string
{
return implode(self::SEPARATOR, $iris);
}

public function login(): void
{
if ($this->username && $this->password) {
try {
$response = $this->clients[0]->request(
Request::METHOD_POST,
$this->getSouinAuthenticationUrl().'/login',
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'username' => $this->username,
'passsword' => $this->password,
],
]
);
$cookies = $response->getHeader('Set-Cookie');
foreach ($cookies as $cookie) {
$splitCookie = str_split($cookie);
if (self::SOUIN_COOKIE_NAME !== $splitCookie[0]) {
continue;
}

$this->token = $splitCookie[1] ?? '';
}
} catch (GuzzleException $e) {
$this->logger->warning($e->getMessage());
}
}
}

/**
* @param array|string[] $iris
*
Expand Down Expand Up @@ -154,7 +95,7 @@ private function banRegex(string $regex): void
try {
$client->request(
Request::METHOD_PURGE,
$this->getSouinApiUrl(),
$this->dsn . $this->path,
['headers' => array_merge(
[
'Surrogate-Key' => $regex,
Expand All @@ -179,7 +120,6 @@ public function purge(array $iris)
return;
}

$this->login();
foreach ($this->getChunkedRegex($iris) as $chunkedRegex) {
$this->banRegex($chunkedRegex);
}
Expand Down
Expand Up @@ -242,24 +242,18 @@ public function testLoadSouinConfig()
$config = self::DEFAULT_CONFIG;
$config['api_platform']['enable_swagger'] = true;
$config['api_platform']['http_cache']['invalidation']['type'] = 'souin';
$config['api_platform']['http_cache']['invalidation']['purger']['souinBaseHost'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['souinBaseApiPath'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['souinApiSouinPath'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['souinApiAuthenticationPath'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['username'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['password'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['dsn'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['path'] = '';
$config['api_platform']['http_cache']['invalidation']['purger']['token'] = '';
$containerBuilderProphecy = $this->getBaseContainerBuilderProphecy(['orm'], $config);
$containerBuilderProphecy->hasParameter('kernel.debug')->willReturn(true);
$containerBuilderProphecy->getParameter('kernel.debug')->willReturn(false);
$containerBuilder = $containerBuilderProphecy->reveal();

$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.type', 'souin')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.souinBaseHost', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.souinBaseApiPath', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.souinApiSouinPath', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.souinApiAuthenticationPath', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.username', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.password', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.dsn', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.path', '')->shouldBeCalled();
$containerBuilderProphecy->setParameter('api_platform.http_cache.invalidation.purger.token', '')->shouldBeCalled();
$containerBuilderProphecy->setAlias('api_platform.http_cache.purger', 'api_platform.http_cache.purger.souin')->shouldBeCalled();

$this->extension->load($config, $containerBuilder);
Expand Down Expand Up @@ -1095,12 +1089,9 @@ private function getPartialContainerBuilderProphecy($configuration = null)
'api_platform.http_cache.invalidation.xkey.enabled' => false,
'api_platform.http_cache.invalidation.xkey.glue' => ' ',
'api_platform.http_cache.invalidation.http_tags.enabled' => true,
'api_platform.http_cache.invalidation.purger.souinBaseHost' => '',
'api_platform.http_cache.invalidation.purger.souinBaseApiPath' => '',
'api_platform.http_cache.invalidation.purger.souinApiSouinPath' => '',
'api_platform.http_cache.invalidation.purger.souinApiAuthenticationPath' => '',
'api_platform.http_cache.invalidation.purger.username' => '',
'api_platform.http_cache.invalidation.purger.password' => '',
'api_platform.http_cache.invalidation.purger.dsn' => '',
'api_platform.http_cache.invalidation.purger.path' => '',
'api_platform.http_cache.invalidation.purger.token' => '',
'api_platform.asset_package' => null,
'api_platform.defaults' => ['attributes' => []],
'api_platform.enable_entrypoint' => true,
Expand Down
Expand Up @@ -196,12 +196,9 @@ private function runDefaultConfigTests(array $doctrineIntegrationsToLoad = ['orm
'enabled' => true,
],
'purger' => [
'souinBaseHost' => '',
'souinBaseApiPath' => '',
'souinApiSouinPath' => '',
'souinApiAuthenticationPath' => '',
'username' => '',
'password' => '',
'dsn' => '',
'path' => '',
'token' => '',
],
'type' => '',
],
Expand Down
49 changes: 13 additions & 36 deletions tests/Core/HttpCache/SouinPurgerTest.php
Expand Up @@ -43,7 +43,7 @@ public function testPurge()
$clientProphecy2->request('PURGE', '', ['headers' => ['Surrogate-Key' => '/foo, /bar']])->willReturn(new Response())->shouldBeCalled();

$loggerProphecy = $this->prophesize(LoggerInterface::class);
$purger = new SouinPurger([$clientProphecy1->reveal(), $clientProphecy2->reveal()], $loggerProphecy->reveal(), '', '', '', '', '', '');
$purger = new SouinPurger([$clientProphecy1->reveal(), $clientProphecy2->reveal()], $loggerProphecy->reveal(), '', '', '');
$purger->purge(['/foo']);
$purger->purge(['/foo' => '/foo', '/bar' => '/bar']);
}
Expand All @@ -54,7 +54,7 @@ public function testEmptyTags()
$clientProphecy1->request()->shouldNotBeCalled();
$loggerProphecy = $this->prophesize(LoggerInterface::class);

$purger = new SouinPurger([$clientProphecy1->reveal()], $loggerProphecy->reveal(), '', '', '', '', '', '');
$purger = new SouinPurger([$clientProphecy1->reveal()], $loggerProphecy->reveal(), '', '', '');
$purger->purge([]);
}

Expand Down Expand Up @@ -102,7 +102,7 @@ public function getConfig($option = null)
}
};
$loggerProphecy = $this->prophesize(LoggerInterface::class);
$purger = new SouinPurger([$client], $loggerProphecy->reveal(), '', '', '', '', '', '');
$purger = new SouinPurger([$client], $loggerProphecy->reveal(), '', '', '');
$purger->purge($this->generateXResourcesTags(200));

self::assertSame([
Expand All @@ -111,7 +111,7 @@ public function getConfig($option = null)
], $client->sentRegexes);
}

public function testPurgeWithLogin()
public function testPurgeWithAuth()
{
$client = new class() implements ClientInterface {
public $requests = [];
Expand Down Expand Up @@ -145,33 +145,21 @@ public function getConfig($option = null)
};
$loggerProphecy = $this->prophesize(LoggerInterface::class);

$purger = new SouinPurger([$client], $loggerProphecy->reveal(), 'http://dummy_host', '/dummy_api_path', '/souin_api', '/authentication_api', 'user', 'passw0rd');
$purger = new SouinPurger([$client], $loggerProphecy->reveal(), 'http://dummy_host', '/dummy_api_path/souin_api', 'souin_auth_cookie');
$purger->purge(['/foo']);
self::assertSame([
'POST',
'http://dummy_host/dummy_api_path/authentication_api/login',
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'username' => 'user',
'passsword' => 'passw0rd',
],
],
], $client->requests[0]);
self::assertSame([
'PURGE',
'http://dummy_host/dummy_api_path/souin_api',
[
'headers' => [
'Surrogate-Key' => '/foo',
'Cookie' => 'souin-authorization-token=souin_auth_cookie',
],
],
], $client->requests[1]);
], $client->requests[0]);
}

public function testPurgeWithOneLoginAndMultipleClients()
public function testPurgeWithOneAuthAndMultipleClients()
{
$client1 = new class() implements ClientInterface {
public $requests = [];
Expand Down Expand Up @@ -235,36 +223,25 @@ public function getConfig($option = null)
};
$loggerProphecy = $this->prophesize(LoggerInterface::class);

$purger = new SouinPurger([$client1, $client2], $loggerProphecy->reveal(), 'http://dummy_host', '/dummy_api_path', '/souin_api', '/authentication_api', 'user', 'passw0rd');
$purger = new SouinPurger([$client1, $client2], $loggerProphecy->reveal(), 'http://dummy_host', '/dummy_api_path/souin_api', 'souin_auth_cookie');
$purger->purge(['/foo']);
self::assertSame([
'POST',
'http://dummy_host/dummy_api_path/authentication_api/login',
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'username' => 'user',
'passsword' => 'passw0rd',
],
],
], $client1->requests[0]);
self::assertSame([
'PURGE',
'http://dummy_host/dummy_api_path/souin_api',
[
'headers' => [
'Surrogate-Key' => '/foo',
'Cookie' => 'souin-authorization-token=souin_auth_cookie',
],
],
], $client1->requests[1]);
], $client1->requests[0]);
self::assertSame([
'PURGE',
'http://dummy_host/dummy_api_path/souin_api',
[
'headers' => [
'Surrogate-Key' => '/foo',
'Cookie' => 'souin-authorization-token=souin_auth_cookie',
],
],
], $client2->requests[0]);
Expand Down Expand Up @@ -310,7 +287,7 @@ public function getConfig($option = null)
$loggerProphecy = $this->prophesize(LoggerInterface::class);
$loggerProphecy->warning('')->shouldBeCalled();

$purger = new SouinPurger([$client], $loggerProphecy->reveal(), 'http://dummy_host', '/dummy_api_path', '/souin_api', '/authentication_api', 'user', 'passw0rd');
$purger = new SouinPurger([$client], $loggerProphecy->reveal(), 'http://dummy_host', '/dummy_api_path', 'souin_auth_cookie');
$purger->purge(['/foo']);
}
}

0 comments on commit 599dd48

Please sign in to comment.