diff --git a/src/ApiPlatform/Resources/ApiClient.php b/src/ApiPlatform/Resources/ApiClient.php index 78a906d..77ab06a 100644 --- a/src/ApiPlatform/Resources/ApiClient.php +++ b/src/ApiPlatform/Resources/ApiClient.php @@ -30,21 +30,19 @@ 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\Processor\CommandProcessor; -use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSCreate; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSDelete; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSGet; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSPartialUpdate; #[ApiResource( operations: [ - new Get( + new CQRSGet( uriTemplate: '/api-client/{apiClientId}', requirements: ['apiClientId' => '\d+'], openapiContext: [ @@ -67,14 +65,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: [ @@ -98,33 +92,20 @@ ], ], 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], diff --git a/src/ApiPlatform/Resources/CartRule.php b/src/ApiPlatform/Resources/CartRule.php index ab54b38..b4ae8aa 100644 --- a/src/ApiPlatform/Resources/CartRule.php +++ b/src/ApiPlatform/Resources/CartRule.php @@ -29,16 +29,14 @@ 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\Processor\CommandProcessor; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSUpdate; #[ApiResource( operations: [ - new Put( + new CQRSUpdate( uriTemplate: '/cart-rule', - processor: CommandProcessor::class, - extraProperties: ['CQRSCommand' => EditCartRuleCommand::class] + CQRSCommand: EditCartRuleCommand::class ), ], )] diff --git a/src/ApiPlatform/Resources/FoundProduct.php b/src/ApiPlatform/Resources/FoundProduct.php index 2118975..ebb6cf6 100644 --- a/src/ApiPlatform/Resources/FoundProduct.php +++ b/src/ApiPlatform/Resources/FoundProduct.php @@ -30,13 +30,12 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\GetCollection; use PrestaShop\PrestaShop\Core\Domain\Product\Query\SearchProducts; -use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSQueryCollection; #[ApiResource( operations: [ - new GetCollection( + new CQRSQueryCollection( uriTemplate: '/products/search/{phrase}/{resultsLimit}/{isoCode}', openapiContext: [ 'parameters' => [ @@ -74,10 +73,7 @@ ], ], ], - provider: QueryProvider::class, - extraProperties: [ - 'CQRSQuery' => SearchProducts::class, - ] + CQRSQuery: SearchProducts::class ), ], )] diff --git a/src/ApiPlatform/Resources/Hook.php b/src/ApiPlatform/Resources/Hook.php index dd4817c..8c98dbb 100644 --- a/src/ApiPlatform/Resources/Hook.php +++ b/src/ApiPlatform/Resources/Hook.php @@ -31,18 +31,18 @@ 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\Processor\CommandProcessor; -use PrestaShopBundle\ApiPlatform\Provider\QueryProvider; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSGet; +use PrestaShopBundle\ApiPlatform\Metadata\CQRSUpdate; +use PrestaShopBundle\ApiPlatform\Metadata\DQBPaginatedList; +use PrestaShopBundle\ApiPlatform\Provider\QueryListProvider; #[ApiResource( operations: [ - new Get( + new CQRSGet( uriTemplate: '/hook-status/{id}', requirements: ['id' => '\d+'], openapiContext: [ @@ -66,29 +66,27 @@ ], ], exceptionToStatus: [HookNotFoundException::class => 404], - provider: QueryProvider::class, - extraProperties: [ - 'CQRSQuery' => GetHookStatus::class, - 'scopes' => ['hook_read'], - ] + CQRSQuery: GetHookStatus::class, + scopes: ['hook_read'] ), - new Put( + new CQRSUpdate( 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'] + ), + new DQBPaginatedList( + uriTemplate: '/hooks', + provider: QueryListProvider::class, + scopes: ['hook_read'], + ApiResourceMapping: ['[id_hook]' => '[id]'], + queryBuilder: 'prestashop.core.api.query_builder.hook' ), ], )] 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; + } }