Skip to content

Commit 379efe0

Browse files
authored
Merge pull request #3 from aligent/feature/add_customer_models
Feature/add customer models
2 parents a27d25b + df9def2 commit 379efe0

File tree

5 files changed

+192
-0
lines changed

5 files changed

+192
-0
lines changed
+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
namespace BigCommerce\ApiV3\Customers;
4+
5+
use BigCommerce\ApiV3\Api\ResourceApi;
6+
use BigCommerce\ApiV3\ResponseModels\Customer\CustomerResponse;
7+
use BigCommerce\ApiV3\ResponseModels\Customer\CustomersResponse;
8+
use BigCommerce\ApiV3\ResourceModels\Customer\Customer;
9+
use GuzzleHttp\Exception\GuzzleException;
10+
use GuzzleHttp\RequestOptions;
11+
use Psr\Http\Message\ResponseInterface;
12+
use UnexpectedValueException;
13+
14+
class CustomersApi extends ResourceApi
15+
{
16+
public const RESOURCE_NAME = 'customers';
17+
public const CUSTOMERS_ENDPOINT = 'customers';
18+
public const CUSTOMER_ENDPOINT = 'customer/%d';
19+
20+
21+
public function get(): CustomerResponse
22+
{
23+
return new CustomerResponse($this->getResource());
24+
}
25+
26+
public function getAll(array $filters = [], int $page = 1, int $limit = 250): CustomersResponse
27+
{
28+
return new CustomersResponse($this->getAllResources($filters, $page, $limit));
29+
}
30+
31+
public function getByEmail($email): ?Customer
32+
{
33+
$customers = $this->getAll(['email:in' => $email])->getCustomers();
34+
35+
if (!$customers[0]) {
36+
return null;
37+
} elseif (count($customers) > 1) {
38+
throw new UnexpectedValueException("There are more than one customer with the email address $email");
39+
}
40+
41+
return $customers[0];
42+
}
43+
44+
/** the Customers API allows us to delete a batch of customers at a time by passing an a query string containing a
45+
* list of Customer IDs
46+
* @param array $ids
47+
* @return ResponseInterface
48+
* @throws GuzzleException
49+
*/
50+
public function deleteIn(array $ids): ResponseInterface
51+
{
52+
$ids = implode(",", $ids);
53+
$resource = ["id:in" => $ids];
54+
55+
return $this->getClient()->getRestClient()->delete(
56+
$this->multipleResourcesEndpoint(),
57+
[
58+
RequestOptions::QUERY => $resource,
59+
]
60+
);
61+
}
62+
63+
public function create(Customer $category): CustomerResponse
64+
{
65+
return new CustomerResponse($this->createResource($category));
66+
}
67+
68+
public function update(Customer $category): CustomerResponse
69+
{
70+
return new CustomerResponse($this->updateResource($category));
71+
}
72+
73+
protected function singleResourceEndpoint(): string
74+
{
75+
return self::CUSTOMER_ENDPOINT;
76+
}
77+
78+
protected function multipleResourcesEndpoint(): string
79+
{
80+
return self::CUSTOMERS_ENDPOINT;
81+
}
82+
83+
protected function resourceName(): string
84+
{
85+
return self::RESOURCE_NAME;
86+
}
87+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace BigCommerce\ApiV3\ResourceModels\Customer;
4+
5+
use BigCommerce\ApiV3\ResourceModels\ResourceModel;
6+
7+
/**
8+
* @package BigCommerce\ApiV3\ResourceModels
9+
*/
10+
class Customer extends ResourceModel
11+
{
12+
/**
13+
* Typically need either an ID or an email in order to do anything useful with an existing customer
14+
*/
15+
public int $id;
16+
public string $email;
17+
public string $first_name;
18+
public string $last_name;
19+
public string $company;
20+
public string $street_1;
21+
public string $street_2;
22+
public string $city;
23+
public string $state;
24+
public string $zip;
25+
public string $country;
26+
public string $country_iso2;
27+
public string $phone;
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace BigCommerce\ApiV3\ResponseModels\Customer;
4+
5+
use BigCommerce\ApiV3\ResourceModels\Customer\Customer;
6+
use BigCommerce\ApiV3\ResponseModels\SingleResourceResponse;
7+
use stdClass;
8+
9+
class CustomerResponse extends SingleResourceResponse
10+
{
11+
private Customer $customer;
12+
13+
public function getCustomer(): Customer
14+
{
15+
return $this->customer;
16+
}
17+
18+
protected function addData(stdClass $rawData): void
19+
{
20+
$this->customer = new Customer($rawData);
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace BigCommerce\ApiV3\ResponseModels\Customer;
4+
5+
use BigCommerce\ApiV3\ResourceModels\Customer\Customer;
6+
use BigCommerce\ApiV3\ResponseModels\PaginatedResponse;
7+
use stdClass;
8+
9+
class CustomersResponse extends PaginatedResponse
10+
{
11+
private array $customers;
12+
13+
/**
14+
* @return Customer[]
15+
*/
16+
public function getCustomers(): array
17+
{
18+
return $this->customers;
19+
}
20+
21+
protected function addData(array $data): void
22+
{
23+
$this->customers = array_map(function (stdClass $c) {
24+
return new Customer($c);
25+
}, $data);
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace BigCommerce\Tests\Customers;
4+
5+
use BigCommerce\Tests\BigCommerceApiTest;
6+
7+
class CustomersApiTest extends BigCommerceApiTest
8+
{
9+
public function testCanGetProduct()
10+
{
11+
$this->markTestIncomplete();
12+
}
13+
14+
public function testCanGetAllProducts()
15+
{
16+
$this->markTestIncomplete();
17+
}
18+
19+
public function testCanGetCustomerByEmail()
20+
{
21+
$this->markTestIncomplete();
22+
}
23+
24+
public function testCanDeleteCustomersIn()
25+
{
26+
$this->markTestIncomplete();
27+
}
28+
}

0 commit comments

Comments
 (0)