diff --git a/spec/AkeneoPimClientSpec.php b/spec/AkeneoPimClientSpec.php index 1d70aba9..49435c74 100644 --- a/spec/AkeneoPimClientSpec.php +++ b/spec/AkeneoPimClientSpec.php @@ -31,6 +31,7 @@ use Akeneo\Pim\ApiClient\Api\MediaFileApiInterface; use Akeneo\Pim\ApiClient\Api\ProductApiInterface; use Akeneo\Pim\ApiClient\Api\ProductDraftApiInterface; +use Akeneo\Pim\ApiClient\Api\ProductDraftUuidApiInterface; use Akeneo\Pim\ApiClient\Api\ProductModelApiInterface; use Akeneo\Pim\ApiClient\Api\ProductModelDraftApiInterface; use Akeneo\Pim\ApiClient\Api\ProductUuidApiInterface; @@ -81,6 +82,7 @@ function let( AssetAttributeOptionApiInterface $assetAttributeOptionApi, AssetMediaFileApiInterface $assetMediaFileApi, ProductUuidApiInterface $productUuidApi, + ProductDraftUuidApiInterface $productDraftUuidApi, AppCatalogApiInterface $appCatalogApi, AppCatalogProductApiInterface $appCatalogProductApi ) { @@ -120,6 +122,7 @@ function let( $assetAttributeOptionApi, $assetMediaFileApi, $productUuidApi, + $productDraftUuidApi, $appCatalogApi, $appCatalogProductApi ); @@ -300,6 +303,11 @@ function it_gets_product_uuid_api(ProductUuidApiInterface $productUuidApi) $this->getProductUuidApi()->shouldReturn($productUuidApi); } + function it_gets_product_draft_uuid_api(ProductDraftUuidApiInterface $productDraftUuidApi) + { + $this->getProductDraftUuidApi()->shouldReturn($productDraftUuidApi); + } + function it_gets_app_catalog_api(AppCatalogApiInterface $appCatalogApi) { $this->getAppCatalogApi()->shouldReturn($appCatalogApi); diff --git a/spec/Api/ProductDraftUuidApiSpec.php b/spec/Api/ProductDraftUuidApiSpec.php new file mode 100644 index 00000000..8272b602 --- /dev/null +++ b/spec/Api/ProductDraftUuidApiSpec.php @@ -0,0 +1,59 @@ +beConstructedWith($resourceClient, $pageFactory, $cursorFactory); + } + + function it_is_initializable() + { + $this->shouldHaveType(ProductDraftUuidApi::class); + $this->shouldImplement(ProductDraftUuidApiInterface::class); + $this->shouldImplement(GettableResourceInterface::class); + } + + function it_gets_a_product_draft($resourceClient) + { + $draft = [ + 'uuid' => '944ca210-d8e0-4c57-9529-741e17e95c8d', + 'family' => 'bar', + 'parent' => null, + 'groups' => [], + 'categories' => [], + 'enabled' => true, + 'values' => [], + 'created' => 'this is a date formatted to ISO-8601', + 'updated' => 'this is a date formatted to ISO-8601', + 'associations' => [], + 'metadata' => [ + 'workflow_status' => 'draft_in_progress', + ], + ]; + + $resourceClient->getResource(ProductDraftUuidApi::PRODUCT_DRAFT_UUID_URI, ['944ca210-d8e0-4c57-9529-741e17e95c8d'])->willReturn($draft); + + $this->get('944ca210-d8e0-4c57-9529-741e17e95c8d')->shouldReturn($draft); + } + + function it_submits_a_product_draft_for_approval($resourceClient) + { + $resourceClient->createResource(ProductDraftUuidApi::PRODUCT_PROPOSAL_UUID_URI, ['944ca210-d8e0-4c57-9529-741e17e95c8d'])->willReturn(201); + + $this->submitForApproval('944ca210-d8e0-4c57-9529-741e17e95c8d')->shouldReturn(201); + } +} diff --git a/src/AkeneoPimClient.php b/src/AkeneoPimClient.php index 6fc7bac7..4611fce4 100644 --- a/src/AkeneoPimClient.php +++ b/src/AkeneoPimClient.php @@ -29,6 +29,7 @@ use Akeneo\Pim\ApiClient\Api\MediaFileApiInterface; use Akeneo\Pim\ApiClient\Api\ProductApiInterface; use Akeneo\Pim\ApiClient\Api\ProductDraftApiInterface; +use Akeneo\Pim\ApiClient\Api\ProductDraftUuidApiInterface; use Akeneo\Pim\ApiClient\Api\ProductModelApiInterface; use Akeneo\Pim\ApiClient\Api\ProductModelDraftApiInterface; use Akeneo\Pim\ApiClient\Api\ProductUuidApiInterface; @@ -87,6 +88,7 @@ class AkeneoPimClient implements AkeneoPimClientInterface private AppCatalogProductApiInterface $appCatalogProductApi; private ProductUuidApiInterface $productUuidApi; + private ProductDraftUuidApiInterface $productDraftUuidApi; public function __construct( Authentication $authentication, @@ -124,6 +126,7 @@ public function __construct( AssetAttributeOptionApiInterface $assetAttributeOptionApi, AssetMediaFileApiInterface $assetMediaFileApi, ProductUuidApiInterface $productUuidApi, + ProductDraftUuidApiInterface $productDraftUuidApi, AppCatalogApiInterface $appCatalogApi, AppCatalogProductApiInterface $appCatalogProductApi ) { @@ -162,6 +165,7 @@ public function __construct( $this->assetAttributeOptionApi = $assetAttributeOptionApi; $this->assetMediaFileApi = $assetMediaFileApi; $this->productUuidApi = $productUuidApi; + $this->productDraftUuidApi = $productDraftUuidApi; $this->appCatalogApi = $appCatalogApi; $this->appCatalogProductApi = $appCatalogProductApi; } @@ -454,6 +458,14 @@ public function getProductUuidApi(): ProductUuidApiInterface return $this->productUuidApi; } + /** + * {@inheritDoc} + */ + public function getProductDraftUuidApi(): ProductDraftUuidApiInterface + { + return $this->productDraftUuidApi; + } + /** * {@inheritDoc} */ diff --git a/src/AkeneoPimClientBuilder.php b/src/AkeneoPimClientBuilder.php index 0e38d3a6..be777a0f 100644 --- a/src/AkeneoPimClientBuilder.php +++ b/src/AkeneoPimClientBuilder.php @@ -29,6 +29,7 @@ use Akeneo\Pim\ApiClient\Api\MeasurementFamilyApi; use Akeneo\Pim\ApiClient\Api\ProductApi; use Akeneo\Pim\ApiClient\Api\ProductDraftApi; +use Akeneo\Pim\ApiClient\Api\ProductDraftUuidApi; use Akeneo\Pim\ApiClient\Api\ProductMediaFileApi; use Akeneo\Pim\ApiClient\Api\ProductModelApi; use Akeneo\Pim\ApiClient\Api\ProductModelDraftApi; @@ -251,6 +252,7 @@ protected function buildAuthenticatedClient(Authentication $authentication): Ake new AssetAttributeOptionApi($resourceClient), new AssetMediaFileApi($resourceClient, $fileSystem), new ProductUuidApi($resourceClient, $pageFactory, $cursorFactory), + new ProductDraftUuidApi($resourceClient, $pageFactory, $cursorFactory), new AppCatalogApi($resourceClient, $pageFactory, $cursorFactory), new AppCatalogProductApi($resourceClient, $pageFactory, $cursorFactory) ); diff --git a/src/AkeneoPimClientInterface.php b/src/AkeneoPimClientInterface.php index c28c9e55..df81a3f9 100644 --- a/src/AkeneoPimClientInterface.php +++ b/src/AkeneoPimClientInterface.php @@ -29,6 +29,7 @@ use Akeneo\Pim\ApiClient\Api\MediaFileApiInterface; use Akeneo\Pim\ApiClient\Api\ProductApiInterface; use Akeneo\Pim\ApiClient\Api\ProductDraftApiInterface; +use Akeneo\Pim\ApiClient\Api\ProductDraftUuidApiInterface; use Akeneo\Pim\ApiClient\Api\ProductModelApiInterface; use Akeneo\Pim\ApiClient\Api\ProductModelDraftApiInterface; use Akeneo\Pim\ApiClient\Api\ProductUuidApiInterface; @@ -120,6 +121,8 @@ public function getAssetMediaFileApi(): AssetMediaFileApiInterface; public function getProductUuidApi() : ProductUuidApiInterface; + public function getProductDraftUuidApi() : ProductDraftUuidApiInterface; + public function getAppCatalogApi(): AppCatalogApiInterface; public function getAppCatalogProductApi(): AppCatalogProductApiInterface; diff --git a/src/Api/ProductDraftUuidApi.php b/src/Api/ProductDraftUuidApi.php new file mode 100644 index 00000000..75c1c9d8 --- /dev/null +++ b/src/Api/ProductDraftUuidApi.php @@ -0,0 +1,49 @@ +resourceClient = $resourceClient; + $this->pageFactory = $pageFactory; + $this->cursorFactory = $cursorFactory; + } + + /** + * {@inheritdoc} + */ + public function get(string $uuid): array + { + return $this->resourceClient->getResource(static::PRODUCT_DRAFT_UUID_URI, [$uuid]); + } + + /** + * {@inheritdoc} + */ + public function submitForApproval(string $uuid): int + { + return $this->resourceClient->createResource(static::PRODUCT_PROPOSAL_UUID_URI, [$uuid]); + } +} diff --git a/src/Api/ProductDraftUuidApiInterface.php b/src/Api/ProductDraftUuidApiInterface.php new file mode 100644 index 00000000..7f513dde --- /dev/null +++ b/src/Api/ProductDraftUuidApiInterface.php @@ -0,0 +1,19 @@ +server->setResponseOfPath( + '/'.sprintf(ProductDraftUuidApi::PRODUCT_DRAFT_UUID_URI, '12951d98-210e-4bRC-ab18-7fdgf1bd14f3'), + new ResponseStack( + new Response($this->getProductDraft(), [], HttpClient::HTTP_OK) + ) + ); + + $api = $this->createClientByPassword()->getProductDraftUuidApi(); + $product = $api->get('12951d98-210e-4bRC-ab18-7fdgf1bd14f3'); + + Assert::assertSame('GET', $this->server->getLastRequest()->jsonSerialize()[RequestInfo::JSON_KEY_METHOD]); + Assert::assertEquals($product, json_decode($this->getProductDraft(), true)); + } + + public function test_get_unknown_product() + { + $this->server->setResponseOfPath( + '/'.sprintf(ProductDraftUuidApi::PRODUCT_DRAFT_UUID_URI, '12951d98-210e-4bRC-ab18-7fdgf1bd14f3'), + new ResponseStack( + new Response('{"code": 404, "message":"Resource `12951d98-210e-4bRC-ab18-7fdgf1bd14f3` does not exist."}', [], 404) + ) + ); + + $this->expectException(\Akeneo\Pim\ApiClient\Exception\NotFoundHttpException::class); + $this->expectExceptionMessage('Resource `12951d98-210e-4bRC-ab18-7fdgf1bd14f3` does not exist.'); + + $api = $this->createClientByPassword()->getProductDraftUuidApi(); + $api->get('12951d98-210e-4bRC-ab18-7fdgf1bd14f3'); + } + + private function getProductDraft(): string + { + return <<