90 lines
2.2 KiB
PHP
90 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Infrastructure\Api\Shopify;
|
|
|
|
use App\Framework\ApiGateway\ApiRequest;
|
|
use App\Framework\ApiGateway\ValueObjects\ApiEndpoint;
|
|
use App\Framework\Core\ValueObjects\Duration;
|
|
use App\Framework\Http\Headers;
|
|
use App\Framework\Http\Method as HttpMethod;
|
|
use App\Framework\Http\Url\Url;
|
|
use App\Framework\Retry\RetryStrategy;
|
|
use App\Infrastructure\Api\Shopify\ValueObjects\{ShopifyApiKey, ShopifyStore};
|
|
|
|
/**
|
|
* Domain-specific API request for creating orders in Shopify
|
|
*
|
|
* Example usage:
|
|
*
|
|
* $request = new CreateOrderApiRequest(
|
|
* apiKey: $apiKey,
|
|
* store: ShopifyStore::fromString('mystore'),
|
|
* orderData: [
|
|
* 'line_items' => [
|
|
* ['variant_id' => 123, 'quantity' => 2]
|
|
* ],
|
|
* 'customer' => ['email' => 'customer@example.com']
|
|
* ]
|
|
* );
|
|
*
|
|
* $response = $apiGateway->send($request);
|
|
*/
|
|
final readonly class CreateOrderApiRequest implements ApiRequest
|
|
{
|
|
public function __construct(
|
|
private ShopifyApiKey $apiKey,
|
|
private ShopifyStore $store,
|
|
private array $orderData,
|
|
private ?RetryStrategy $retryStrategy = null
|
|
) {
|
|
}
|
|
|
|
public function getEndpoint(): ApiEndpoint
|
|
{
|
|
$shopUrl = "https://{$this->store->value}.myshopify.com/admin/api/2024-01/orders.json";
|
|
|
|
return ApiEndpoint::fromUrl(
|
|
Url::parse($shopUrl)
|
|
);
|
|
}
|
|
|
|
public function getMethod(): HttpMethod
|
|
{
|
|
return HttpMethod::POST;
|
|
}
|
|
|
|
public function getPayload(): array
|
|
{
|
|
return [
|
|
'order' => $this->orderData,
|
|
];
|
|
}
|
|
|
|
public function getTimeout(): Duration
|
|
{
|
|
// Order creation should be quick
|
|
return Duration::fromSeconds(10);
|
|
}
|
|
|
|
public function getRetryStrategy(): ?RetryStrategy
|
|
{
|
|
return $this->retryStrategy;
|
|
}
|
|
|
|
public function getHeaders(): Headers
|
|
{
|
|
return new Headers([
|
|
'X-Shopify-Access-Token' => $this->apiKey->value,
|
|
'Content-Type' => 'application/json',
|
|
'Accept' => 'application/json',
|
|
]);
|
|
}
|
|
|
|
public function getRequestName(): string
|
|
{
|
|
return 'shopify.create_order';
|
|
}
|
|
}
|