From e7a51eea3e97e3da042b8a2342f44a32d13754bf Mon Sep 17 00:00:00 2001 From: tleon Date: Thu, 15 Feb 2024 14:55:28 +0100 Subject: [PATCH 1/5] chore(api): update hook with custom operation & add hook list operation --- src/ApiPlatform/Resources/Hook.php | 38 +++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/ApiPlatform/Resources/Hook.php b/src/ApiPlatform/Resources/Hook.php index dd4817c..df8895f 100644 --- a/src/ApiPlatform/Resources/Hook.php +++ b/src/ApiPlatform/Resources/Hook.php @@ -31,18 +31,20 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\Get; -use ApiPlatform\Metadata\Put; use PrestaShop\PrestaShop\Core\Domain\Hook\Command\UpdateHookStatusCommand; use PrestaShop\PrestaShop\Core\Domain\Hook\Exception\HookNotFoundException; use PrestaShop\PrestaShop\Core\Domain\Hook\Query\GetHook; use PrestaShop\PrestaShop\Core\Domain\Hook\Query\GetHookStatus; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSGet; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSPartialUpdate; +use PrestaShopBundle\ApiPlatform\Metadata\DQBPaginatedList; use PrestaShopBundle\ApiPlatform\Processor\CommandProcessor; +use PrestaShopBundle\ApiPlatform\Provider\QueryListProvider; use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; #[ApiResource( operations: [ - new Get( + new CQRSGet( uriTemplate: '/hook-status/{id}', requirements: ['id' => '\d+'], openapiContext: [ @@ -67,28 +69,30 @@ ], exceptionToStatus: [HookNotFoundException::class => 404], provider: QueryProvider::class, - extraProperties: [ - 'CQRSQuery' => GetHookStatus::class, - 'scopes' => ['hook_read'], - ] + CQRSQuery: GetHookStatus::class, + scopes: ['hook_read'] ), - new Put( + new CQRSPartialUpdate( uriTemplate: '/hook-status', processor: CommandProcessor::class, - extraProperties: [ - 'CQRSCommand' => UpdateHookStatusCommand::class, - 'scopes' => ['hook_write'], - ] + CQRSCommand: UpdateHookStatusCommand::class, + scopes: ['hook_write'] ), - new Get( + new CQRSGet( uriTemplate: '/hooks/{id}', requirements: ['id' => '\d+'], exceptionToStatus: [HookNotFoundException::class => 404], provider: QueryProvider::class, - extraProperties: [ - 'CQRSQuery' => GetHook::class, - 'scopes' => ['hook_read'], - ] + CQRSQuery: GetHook::class, + scopes: ['hook_read'] + ), + // PR module + inte module + convertir en custom ce qu'il reste en natif + new DQBPaginatedList( + uriTemplate: '/hooks', + provider: QueryListProvider::class, + scopes: ['hook_read'], + ApiResourceMapping: ['[id_hook]' => '[id]'], + queryBuilder: 'prestashop.core.api.query_builder.hook' ), ], )] From fdc4b267730791edaa3a6b009bed3c2e3b05568d Mon Sep 17 00:00:00 2001 From: tleon Date: Thu, 15 Feb 2024 14:56:16 +0100 Subject: [PATCH 2/5] chore(api): update api access with custom operation --- src/ApiPlatform/Resources/ApiClient.php | 47 +++++++++---------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/src/ApiPlatform/Resources/ApiClient.php b/src/ApiPlatform/Resources/ApiClient.php index 78a906d..5580062 100644 --- a/src/ApiPlatform/Resources/ApiClient.php +++ b/src/ApiPlatform/Resources/ApiClient.php @@ -30,21 +30,21 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\Delete; -use ApiPlatform\Metadata\Get; -use ApiPlatform\Metadata\Post; -use ApiPlatform\Metadata\Put; use PrestaShop\PrestaShop\Core\Domain\ApiClient\Command\AddApiClientCommand; use PrestaShop\PrestaShop\Core\Domain\ApiClient\Command\DeleteApiClientCommand; use PrestaShop\PrestaShop\Core\Domain\ApiClient\Command\EditApiClientCommand; use PrestaShop\PrestaShop\Core\Domain\ApiClient\Exception\ApiClientNotFoundException; use PrestaShop\PrestaShop\Core\Domain\ApiClient\Query\GetApiClientForEditing; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSCreate; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSDelete; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSGet; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSPartialUpdate; use PrestaShopBundle\ApiPlatform\Processor\CommandProcessor; use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; #[ApiResource( operations: [ - new Get( + new CQRSGet( uriTemplate: '/api-client/{apiClientId}', requirements: ['apiClientId' => '\d+'], openapiContext: [ @@ -68,13 +68,10 @@ ], ], provider: QueryProvider::class, - extraProperties: [ - 'query' => GetApiClientForEditing::class, - 'CQRSQuery' => GetApiClientForEditing::class, - 'scopes' => ['api_client_read'], - ] + CQRSQuery: GetApiClientForEditing::class, + scopes: ['api_client_read'] ), - new Delete( + new CQRSDelete( uriTemplate: '/api-client/{apiClientId}', requirements: ['apiClientId' => '\d+'], openapiContext: [ @@ -99,32 +96,22 @@ ], output: false, provider: QueryProvider::class, - extraProperties: [ - 'query' => DeleteApiClientCommand::class, - 'CQRSQuery' => DeleteApiClientCommand::class, - 'scopes' => ['api_client_write'], - ] + CQRSQuery: DeleteApiClientCommand::class, + scopes: ['api_client_write'] ), - new Post( + new CQRSCreate( uriTemplate: '/api-client', processor: CommandProcessor::class, - extraProperties: [ - 'command' => AddApiClientCommand::class, - 'CQRSCommand' => AddApiClientCommand::class, - 'scopes' => ['api_client_write'], - ] + CQRSCommand: AddApiClientCommand::class, + scopes: ['api_client_write'] ), - new Put( + new CQRSPartialUpdate( uriTemplate: '/api-client/{apiClientId}', read: false, processor: CommandProcessor::class, - extraProperties: [ - 'command' => EditApiClientCommand::class, - 'query' => GetApiClientForEditing::class, - 'CQRSCommand' => EditApiClientCommand::class, - 'CQRSQuery' => GetApiClientForEditing::class, - 'scopes' => ['api_client_write'], - ] + CQRSCommand: EditApiClientCommand::class, + CQRSQuery: GetApiClientForEditing::class, + scopes: ['api_client_write'] ), ], exceptionToStatus: [ApiClientNotFoundException::class => 404], From 713c6aaae59925317df339313ef85cfb36e785b1 Mon Sep 17 00:00:00 2001 From: tleon Date: Thu, 15 Feb 2024 14:57:37 +0100 Subject: [PATCH 3/5] chore(api): update cart rules with custom operation --- src/ApiPlatform/Resources/CartRule.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ApiPlatform/Resources/CartRule.php b/src/ApiPlatform/Resources/CartRule.php index ab54b38..693af79 100644 --- a/src/ApiPlatform/Resources/CartRule.php +++ b/src/ApiPlatform/Resources/CartRule.php @@ -29,16 +29,16 @@ namespace PrestaShop\Module\APIResources\ApiPlatform\Resources; use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\Put; use PrestaShop\PrestaShop\Core\Domain\CartRule\Command\EditCartRuleCommand; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSPartialUpdate; use PrestaShopBundle\ApiPlatform\Processor\CommandProcessor; #[ApiResource( operations: [ - new Put( + new CQRSPartialUpdate( uriTemplate: '/cart-rule', processor: CommandProcessor::class, - extraProperties: ['CQRSCommand' => EditCartRuleCommand::class] + CQRSCommand: EditCartRuleCommand::class ), ], )] From 34f1b21cd02f1cbfbdad3ac9dec177b713f51441 Mon Sep 17 00:00:00 2001 From: tleon Date: Thu, 15 Feb 2024 16:18:50 +0100 Subject: [PATCH 4/5] chore(api): update product search with custom operation --- src/ApiPlatform/Resources/FoundProduct.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/ApiPlatform/Resources/FoundProduct.php b/src/ApiPlatform/Resources/FoundProduct.php index 2118975..b42aab6 100644 --- a/src/ApiPlatform/Resources/FoundProduct.php +++ b/src/ApiPlatform/Resources/FoundProduct.php @@ -30,13 +30,13 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\GetCollection; use PrestaShop\PrestaShop\Core\Domain\Product\Query\SearchProducts; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSQueryCollection; use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; #[ApiResource( operations: [ - new GetCollection( + new CQRSQueryCollection( uriTemplate: '/products/search/{phrase}/{resultsLimit}/{isoCode}', openapiContext: [ 'parameters' => [ @@ -75,9 +75,7 @@ ], ], provider: QueryProvider::class, - extraProperties: [ - 'CQRSQuery' => SearchProducts::class, - ] + CQRSQuery: SearchProducts::class ), ], )] From b38eae7088ca2033ff01c4236995e5e8e63ce7e7 Mon Sep 17 00:00:00 2001 From: tleon Date: Thu, 15 Feb 2024 16:48:14 +0100 Subject: [PATCH 5/5] chore(api): list integration test --- src/ApiPlatform/Resources/ApiClient.php | 6 -- src/ApiPlatform/Resources/CartRule.php | 6 +- src/ApiPlatform/Resources/FoundProduct.php | 2 - src/ApiPlatform/Resources/Hook.php | 10 +-- tests/Integration/ApiPlatform/GetHookTest.php | 70 +++++++++++++++++++ 5 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/ApiPlatform/Resources/ApiClient.php b/src/ApiPlatform/Resources/ApiClient.php index 5580062..77ab06a 100644 --- a/src/ApiPlatform/Resources/ApiClient.php +++ b/src/ApiPlatform/Resources/ApiClient.php @@ -39,8 +39,6 @@ use PrestaShopBundle\ApiPlatform\Metadata\CQRSDelete; use PrestaShopBundle\ApiPlatform\Metadata\CQRSGet; use PrestaShopBundle\ApiPlatform\Metadata\CQRSPartialUpdate; -use PrestaShopBundle\ApiPlatform\Processor\CommandProcessor; -use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; #[ApiResource( operations: [ @@ -67,7 +65,6 @@ ], ], ], - provider: QueryProvider::class, CQRSQuery: GetApiClientForEditing::class, scopes: ['api_client_read'] ), @@ -95,20 +92,17 @@ ], ], output: false, - provider: QueryProvider::class, CQRSQuery: DeleteApiClientCommand::class, scopes: ['api_client_write'] ), new CQRSCreate( uriTemplate: '/api-client', - processor: CommandProcessor::class, CQRSCommand: AddApiClientCommand::class, scopes: ['api_client_write'] ), new CQRSPartialUpdate( uriTemplate: '/api-client/{apiClientId}', read: false, - processor: CommandProcessor::class, CQRSCommand: EditApiClientCommand::class, CQRSQuery: GetApiClientForEditing::class, scopes: ['api_client_write'] diff --git a/src/ApiPlatform/Resources/CartRule.php b/src/ApiPlatform/Resources/CartRule.php index 693af79..b4ae8aa 100644 --- a/src/ApiPlatform/Resources/CartRule.php +++ b/src/ApiPlatform/Resources/CartRule.php @@ -30,14 +30,12 @@ use ApiPlatform\Metadata\ApiResource; use PrestaShop\PrestaShop\Core\Domain\CartRule\Command\EditCartRuleCommand; -use PrestaShopBundle\ApiPlatform\Metadata\CQRSPartialUpdate; -use PrestaShopBundle\ApiPlatform\Processor\CommandProcessor; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSUpdate; #[ApiResource( operations: [ - new CQRSPartialUpdate( + new CQRSUpdate( uriTemplate: '/cart-rule', - processor: CommandProcessor::class, CQRSCommand: EditCartRuleCommand::class ), ], diff --git a/src/ApiPlatform/Resources/FoundProduct.php b/src/ApiPlatform/Resources/FoundProduct.php index b42aab6..ebb6cf6 100644 --- a/src/ApiPlatform/Resources/FoundProduct.php +++ b/src/ApiPlatform/Resources/FoundProduct.php @@ -32,7 +32,6 @@ use ApiPlatform\Metadata\ApiResource; use PrestaShop\PrestaShop\Core\Domain\Product\Query\SearchProducts; use PrestaShopBundle\ApiPlatform\Metadata\CQRSQueryCollection; -use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; #[ApiResource( operations: [ @@ -74,7 +73,6 @@ ], ], ], - provider: QueryProvider::class, CQRSQuery: SearchProducts::class ), ], diff --git a/src/ApiPlatform/Resources/Hook.php b/src/ApiPlatform/Resources/Hook.php index df8895f..8c98dbb 100644 --- a/src/ApiPlatform/Resources/Hook.php +++ b/src/ApiPlatform/Resources/Hook.php @@ -36,11 +36,9 @@ use PrestaShop\PrestaShop\Core\Domain\Hook\Query\GetHook; use PrestaShop\PrestaShop\Core\Domain\Hook\Query\GetHookStatus; use PrestaShopBundle\ApiPlatform\Metadata\CQRSGet; -use PrestaShopBundle\ApiPlatform\Metadata\CQRSPartialUpdate; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSUpdate; use PrestaShopBundle\ApiPlatform\Metadata\DQBPaginatedList; -use PrestaShopBundle\ApiPlatform\Processor\CommandProcessor; use PrestaShopBundle\ApiPlatform\Provider\QueryListProvider; -use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; #[ApiResource( operations: [ @@ -68,13 +66,11 @@ ], ], exceptionToStatus: [HookNotFoundException::class => 404], - provider: QueryProvider::class, CQRSQuery: GetHookStatus::class, scopes: ['hook_read'] ), - new CQRSPartialUpdate( + new CQRSUpdate( uriTemplate: '/hook-status', - processor: CommandProcessor::class, CQRSCommand: UpdateHookStatusCommand::class, scopes: ['hook_write'] ), @@ -82,11 +78,9 @@ uriTemplate: '/hooks/{id}', requirements: ['id' => '\d+'], exceptionToStatus: [HookNotFoundException::class => 404], - provider: QueryProvider::class, CQRSQuery: GetHook::class, scopes: ['hook_read'] ), - // PR module + inte module + convertir en custom ce qu'il reste en natif new DQBPaginatedList( uriTemplate: '/hooks', provider: QueryListProvider::class, diff --git a/tests/Integration/ApiPlatform/GetHookTest.php b/tests/Integration/ApiPlatform/GetHookTest.php index 550302b..e6c109f 100644 --- a/tests/Integration/ApiPlatform/GetHookTest.php +++ b/tests/Integration/ApiPlatform/GetHookTest.php @@ -69,4 +69,74 @@ public function testGetHook(): void $hook->delete(); } + + public function testListHooks(): void + { + $hooks = $this->generateHooks(); + $bearerToken = $this->getBearerToken([ + 'hook_read', + 'hook_write', + ]); + + $response = static::createClient()->request('GET', '/api/hooks', ['auth_bearer' => $bearerToken]); + self::assertResponseStatusCodeSame(200); + self::assertCount(50, json_decode($response->getContent())->items); + $totalItems = json_decode($response->getContent())->totalItems; + + $response = static::createClient()->request('GET', '/api/hooks?limit=10', ['auth_bearer' => $bearerToken]); + self::assertResponseStatusCodeSame(200); + self::assertCount(10, json_decode($response->getContent())->items); + + $response = static::createClient()->request('GET', '/api/hooks?limit=1&orderBy=id_hook&sortOrder=desc', ['auth_bearer' => $bearerToken]); + self::assertResponseStatusCodeSame(200); + self::assertCount(1, json_decode($response->getContent())->items); + $returnedHook = json_decode($response->getContent()); + self::assertEquals('id_hook', $returnedHook->orderBy); + self::assertEquals('desc', $returnedHook->sortOrder); + self::assertEquals(1, $returnedHook->limit); + self::assertEquals([], $returnedHook->filters); + self::assertEquals('testHook50', $returnedHook->items[0]->name); + self::assertTrue($returnedHook->items[0]->active); + + $response = static::createClient()->request('GET', '/api/hooks?filters[name]=testHook', ['auth_bearer' => $bearerToken]); + self::assertResponseStatusCodeSame(200); + self::assertCount(50, json_decode($response->getContent())->items); + foreach (json_decode($response->getContent())->items as $key => $item) { + self::assertEquals('testHook' . $key, $item->name); + } + + $newHook = new \Hook(); + $newHook->name = 'testHook51'; + $newHook->active = true; + $newHook->add(); + $hooks[] = $newHook; + + $response = static::createClient()->request('GET', '/api/hooks', ['auth_bearer' => $bearerToken]); + self::assertResponseStatusCodeSame(200); + self::assertEquals($totalItems + 1, json_decode($response->getContent())->totalItems); + + static::createClient()->request('GET', '/api/hooks'); + self::assertResponseStatusCodeSame(401); + + foreach ($hooks as $hook) { + $hook->delete(); + } + } + + /** + * @return \Hook[] + */ + protected function generateHooks(): array + { + $hooks = []; + for ($i = 0; $i <= 50; ++$i) { + $hook = new \Hook(); + $hook->name = 'testHook' . $i; + $hook->active = true; + $hook->add(); + $hooks[] = $hook; + } + + return $hooks; + } }