Skip to content

Commit 5d13790

Browse files
committed
Implement the batch create and update endpoints for Channel Currency Assignments #53
1 parent 32a2852 commit 5d13790

File tree

4 files changed

+131
-8
lines changed

4 files changed

+131
-8
lines changed

src/BigCommerce/Api/Channels/ChannelCurrencyAssignmentsApi.php

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,28 @@
22

33
namespace BigCommerce\ApiV3\Api\Channels;
44

5+
use BigCommerce\ApiV3\Api\Generic\BatchCreateResource;
56
use BigCommerce\ApiV3\Api\Generic\BatchUpdateResource;
67
use BigCommerce\ApiV3\Api\Generic\CreateResource;
78
use BigCommerce\ApiV3\Api\Generic\DeleteResource;
89
use BigCommerce\ApiV3\Api\Generic\GetAllResources;
910
use BigCommerce\ApiV3\Api\Generic\UpdateResource;
1011
use BigCommerce\ApiV3\Api\Generic\V3ApiBase;
12+
use BigCommerce\ApiV3\ResourceModels\Channel\ChannelCurrencyAssignment;
1113
use BigCommerce\ApiV3\ResponseModels\Channel\ChannelCurrencyAssignmentsResponse;
1214
use BigCommerce\ApiV3\ResponseModels\PaginatedResponse;
13-
use BigCommerce\ApiV3\ResponseModels\SingleResourceResponse;
1415

1516
/**
1617
* Channel Currency Assignments API
1718
*
19+
* Example for finding all the currency assignments. Note that the parent id is effectively just a filter.
1820
*
21+
* ```php
22+
* $api = new BigCommerce\ApiV3\Client($_ENV['hash'], $_ENV['CLIENT_ID'], $_ENV['ACCESS_TOKEN']);
23+
*
24+
* $allCurrencyAssignments = $api->channels()->currencyAssignments()->getAll()->getCurrencyAssignments();
25+
* $channelCurrencyAssignments = $api->channel(1)->currencyAssignments()->getAll()->getCurrencyAssignments();
26+
* ```
1927
*/
2028
class ChannelCurrencyAssignmentsApi extends V3ApiBase
2129
{
@@ -24,24 +32,38 @@ class ChannelCurrencyAssignmentsApi extends V3ApiBase
2432
use UpdateResource;
2533
use CreateResource;
2634
use BatchUpdateResource;
27-
28-
// batchcreate?
35+
use BatchCreateResource;
2936

3037
private const CURRENCY_ASSIGNMENTS_ENDPOINT = 'channels/currency-assignments';
3138
private const CURRENCY_ASSIGNMENT_ENDPOINT = 'channels/%d/currency-assignments';
3239

3340

34-
public function create(): ChannelCurrencyAssignmentsResponse
41+
public function create(ChannelCurrencyAssignment $currencyAssignment): ChannelCurrencyAssignmentsResponse
42+
{
43+
return new ChannelCurrencyAssignmentsResponse($this->createResource($currencyAssignment));
44+
}
45+
46+
public function update(ChannelCurrencyAssignment $currencyAssignment): ChannelCurrencyAssignmentsResponse
3547
{
48+
return new ChannelCurrencyAssignmentsResponse($this->updateResource($currencyAssignment));
3649
}
3750

38-
public function update(): ChannelCurrencyAssignmentsResponse
51+
/**
52+
* @param ChannelCurrencyAssignment[] $resources
53+
* @return ChannelCurrencyAssignmentsResponse
54+
*/
55+
public function batchCreate(array $resources): PaginatedResponse
3956
{
57+
return ChannelCurrencyAssignmentsResponse::buildFromMultipleResponses($this->batchCreateResource($resources));
4058
}
4159

60+
/**
61+
* @param ChannelCurrencyAssignment[] $resources
62+
* @return ChannelCurrencyAssignmentsResponse
63+
*/
4264
public function batchUpdate(array $resources): ChannelCurrencyAssignmentsResponse
4365
{
44-
// TODO: Implement batchUpdate() method.
66+
return ChannelCurrencyAssignmentsResponse::buildFromMultipleResponses($this->batchUpdateResource($resources));
4567
}
4668

4769
public function getAll(array $filters = [], int $page = 1, int $limit = 250): ChannelCurrencyAssignmentsResponse
@@ -64,7 +86,6 @@ public function multipleResourceUrl(): string
6486
{
6587
return $this->getParentResourceId() ? $this->singleResourceUrl() : $this->multipleResourcesEndpoint();
6688
}
67-
6889
public function singleResourceUrl(): string
6990
{
7091
return sprintf(self::CURRENCY_ASSIGNMENT_ENDPOINT, $this->getParentResourceId());
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace BigCommerce\ApiV3\Api\Generic;
4+
5+
use BigCommerce\ApiV3\Client;
6+
use BigCommerce\ApiV3\ResponseModels\PaginatedResponse;
7+
use GuzzleHttp\RequestOptions;
8+
use Psr\Http\Message\ResponseInterface;
9+
10+
trait BatchCreateResource
11+
{
12+
abstract public function batchCreate(array $resources): PaginatedResponse;
13+
abstract protected function multipleResourcesEndpoint(): string;
14+
abstract public function getClient(): Client;
15+
16+
protected function maxCreateBatchSize(): int
17+
{
18+
return 10;
19+
}
20+
21+
/**
22+
* @param array $resources
23+
* @return ResponseInterface[]
24+
*/
25+
protected function batchCreateResource(array $resources): array
26+
{
27+
$chunks = array_chunk($resources, $this->maxCreateBatchSize());
28+
$responses = [];
29+
foreach ($chunks as $chunk) {
30+
$responses[] = $this->getClient()->getRestClient()->post(
31+
$this->multipleResourcesEndpoint(),
32+
[
33+
RequestOptions::JSON => $chunk,
34+
]
35+
);
36+
}
37+
38+
return $responses;
39+
}
40+
}

src/BigCommerce/ResponseModels/Channel/ChannelCurrencyAssignmentsResponse.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
namespace BigCommerce\ApiV3\ResponseModels\Channel;
44

55
use BigCommerce\ApiV3\ResourceModels\Channel\ChannelCurrencyAssignment;
6+
use BigCommerce\ApiV3\ResponseModels\PaginatedBatchableResponse;
67
use BigCommerce\ApiV3\ResponseModels\PaginatedResponse;
78

8-
class ChannelCurrencyAssignmentsResponse extends PaginatedResponse
9+
class ChannelCurrencyAssignmentsResponse extends PaginatedBatchableResponse
910
{
1011
/**
1112
* @return ChannelCurrencyAssignment[]

tests/BigCommerce/Api/Channels/ChannelCurrencyAssignmentsApiTest.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace BigCommerce\Tests\Api\Channels;
44

5+
use BigCommerce\ApiV3\ResourceModels\Channel\ChannelCurrencyAssignment;
56
use BigCommerce\Tests\BigCommerceApiTest;
67

78
class ChannelCurrencyAssignmentsApiTest extends BigCommerceApiTest
@@ -24,4 +25,64 @@ public function testCanGetAllChannelsCurrencyAssignments()
2425
$this->assertEquals('channels/currency-assignments', $this->getLastRequestPath());
2526
$this->assertEquals('AUD', $currencyAssignments[0]->default_currency);
2627
}
28+
29+
/**
30+
* @return ChannelCurrencyAssignment[]
31+
*/
32+
private function getCurrencyAssignments(): array
33+
{
34+
$currencyAssignments = [new ChannelCurrencyAssignment(), new ChannelCurrencyAssignment()];
35+
36+
$currencyAssignments[0]->channel_id = 1;
37+
$currencyAssignments[0]->enabled_currencies = ['USD', 'AUD'];
38+
$currencyAssignments[0]->default_currency = 'AUD';
39+
40+
$currencyAssignments[0]->channel_id = 2;
41+
$currencyAssignments[0]->enabled_currencies = ['USD', 'AUD', 'NZD'];
42+
$currencyAssignments[0]->default_currency = 'NZD';
43+
44+
return $currencyAssignments;
45+
}
46+
47+
private function getCurrencyAssignment(): ChannelCurrencyAssignment
48+
{
49+
$currencyAssignment = new ChannelCurrencyAssignment();
50+
$currencyAssignment->channel_id = 1;
51+
$currencyAssignment->enabled_currencies = ['AUD', 'NZD', 'CAD'];
52+
$currencyAssignment->default_currency = 'CAD';
53+
54+
return $currencyAssignment;
55+
}
56+
57+
public function testCanCreateMultipleCurrencyAssignments()
58+
{
59+
$this->setReturnData('channel_currency_assignments.json');
60+
61+
$this->getApi()->channels()->currencyAssignments()->batchCreate($this->getCurrencyAssignments());
62+
$this->assertEquals('channels/currency-assignments', $this->getLastRequestPath());
63+
}
64+
65+
public function testCanUpdateMultipleCurrencyAssignments()
66+
{
67+
$this->setReturnData('channel_currency_assignments.json');
68+
69+
$this->getApi()->channels()->currencyAssignments()->batchUpdate($this->getCurrencyAssignments());
70+
$this->assertEquals('channels/currency-assignments', $this->getLastRequestPath());
71+
}
72+
73+
public function testCanCreateCurrencyAssignment()
74+
{
75+
$this->setReturnData('channel_currency_assignments.json');
76+
$channelId = 1;
77+
$this->getApi()->channel(1)->currencyAssignments()->create($this->getCurrencyAssignment());
78+
$this->assertEquals("channels/$channelId/currency-assignments", $this->getLastRequestPath());
79+
}
80+
81+
public function testCanUpdateCurrencyAssignment()
82+
{
83+
$this->setReturnData('channel_currency_assignments.json');
84+
$channelId = 1;
85+
$this->getApi()->channel(1)->currencyAssignments()->update($this->getCurrencyAssignment());
86+
$this->assertEquals("channels/$channelId/currency-assignments", $this->getLastRequestPath());
87+
}
2788
}

0 commit comments

Comments
 (0)