From 59b7d41e5c9ac21a137e1d081daa1d73fc9d3f42 Mon Sep 17 00:00:00 2001 From: Martin Boer Date: Thu, 11 Sep 2025 20:34:08 +0200 Subject: [PATCH 1/2] :technologist: support includes on shipment-statuses --- src/Resources/ResourceFactory.php | 3 ++- src/Resources/ShipmentStatus.php | 7 +++++++ .../include-status.json} | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) rename tests/Stubs/get/{https---api-shipments-shipment-id-1-statuses.json => https---api-shipments-shipment-id-1-statuses/include-status.json} (93%) diff --git a/src/Resources/ResourceFactory.php b/src/Resources/ResourceFactory.php index 581c7f83..63a0abef 100644 --- a/src/Resources/ResourceFactory.php +++ b/src/Resources/ResourceFactory.php @@ -192,7 +192,8 @@ protected function shipmentFactory(array &$data): Shipment if (isset($data['id'])) { $shipment->setStatusHistoryCallback(function () use ($data) { return $this->api->getResourcesFromUri( - str_replace('{shipment_id}', $data['id'], MyParcelComApiInterface::PATH_SHIPMENT_STATUSES), + str_replace('{shipment_id}', $data['id'], MyParcelComApiInterface::PATH_SHIPMENT_STATUSES) + . '?include=' . ShipmentStatus::RELATIONSHIP_STATUS, ); }); } diff --git a/src/Resources/ShipmentStatus.php b/src/Resources/ShipmentStatus.php index 29807b1a..5634c8cf 100644 --- a/src/Resources/ShipmentStatus.php +++ b/src/Resources/ShipmentStatus.php @@ -12,12 +12,14 @@ use MyParcelCom\ApiSdk\Resources\Interfaces\ShipmentStatusInterface; use MyParcelCom\ApiSdk\Resources\Interfaces\StatusInterface; use MyParcelCom\ApiSdk\Resources\Traits\JsonSerializable; +use MyParcelCom\ApiSdk\Resources\Traits\ProcessIncludes; use MyParcelCom\ApiSdk\Resources\Traits\Resource; use MyParcelCom\ApiSdk\Utils\DateUtils; class ShipmentStatus implements ShipmentStatusInterface { use JsonSerializable; + use ProcessIncludes; use Resource; const ATTRIBUTE_CARRIER_STATUSES = 'carrier_statuses'; @@ -27,6 +29,11 @@ class ShipmentStatus implements ShipmentStatusInterface const RELATIONSHIP_STATUS = 'status'; const RELATIONSHIP_SHIPMENT = 'shipment'; + const INCLUDES = [ + ResourceInterface::TYPE_SHIPMENT => self::RELATIONSHIP_SHIPMENT, + ResourceInterface::TYPE_STATUS => self::RELATIONSHIP_STATUS, + ]; + private ?string $id = null; private string $type = ResourceInterface::TYPE_SHIPMENT_STATUS; diff --git a/tests/Stubs/get/https---api-shipments-shipment-id-1-statuses.json b/tests/Stubs/get/https---api-shipments-shipment-id-1-statuses/include-status.json similarity index 93% rename from tests/Stubs/get/https---api-shipments-shipment-id-1-statuses.json rename to tests/Stubs/get/https---api-shipments-shipment-id-1-statuses/include-status.json index 49583500..0620fd1e 100644 --- a/tests/Stubs/get/https---api-shipments-shipment-id-1-statuses.json +++ b/tests/Stubs/get/https---api-shipments-shipment-id-1-statuses/include-status.json @@ -195,6 +195,22 @@ "total_pages": 1, "total_records": 5 }, + "included": [ + { + "type": "statuses", + "id": "status-id-5", + "attributes": { + "code": "shipment-concept", + "resource_type": "shipments", + "level": "concept", + "name": "Concept", + "description": "The shipment is a concept" + }, + "links": { + "self": "https://api/statuses/status-id-5" + } + } + ], "links": { "self": "https://api/shipments/shipment-id-1/statuses?page[number]=1&page[size]=30", "first": "https://api/shipments/shipment-id-1/statuses?page[number]=1&page[size]=30", From 9e096ce139e4a180252986da4b597721f1642114 Mon Sep 17 00:00:00 2001 From: Martin Boer Date: Thu, 11 Sep 2025 20:55:35 +0200 Subject: [PATCH 2/2] :technologist: add the ProcessIncludes trait to other resources that support includes --- src/Resources/Collection.php | 9 +++++++++ src/Resources/Contract.php | 6 ++++++ src/Resources/Manifest.php | 6 ++++++ src/Resources/Service.php | 6 ++++++ src/Resources/Shop.php | 6 ++++++ 5 files changed, 33 insertions(+) diff --git a/src/Resources/Collection.php b/src/Resources/Collection.php index 0a05dc64..f77800d3 100644 --- a/src/Resources/Collection.php +++ b/src/Resources/Collection.php @@ -16,13 +16,22 @@ use MyParcelCom\ApiSdk\Resources\Interfaces\ShopInterface; use MyParcelCom\ApiSdk\Resources\Interfaces\StatusInterface; use MyParcelCom\ApiSdk\Resources\Traits\JsonSerializable; +use MyParcelCom\ApiSdk\Resources\Traits\ProcessIncludes; use MyParcelCom\ApiSdk\Resources\Traits\Resource; class Collection implements CollectionInterface { use JsonSerializable; + use ProcessIncludes; use Resource; + const INCLUDES = [ + ResourceInterface::TYPE_CONTRACT => 'contract', + ResourceInterface::TYPE_MANIFEST => 'manifest', + ResourceInterface::TYPE_SHOP => 'shop', + ResourceInterface::TYPE_STATUS => 'status', + ]; + private ?string $id = null; private string $type = ResourceInterface::TYPE_COLLECTION; diff --git a/src/Resources/Contract.php b/src/Resources/Contract.php index 875d0ede..48b036b2 100644 --- a/src/Resources/Contract.php +++ b/src/Resources/Contract.php @@ -8,11 +8,13 @@ use MyParcelCom\ApiSdk\Resources\Interfaces\ContractInterface; use MyParcelCom\ApiSdk\Resources\Interfaces\ResourceInterface; use MyParcelCom\ApiSdk\Resources\Traits\JsonSerializable; +use MyParcelCom\ApiSdk\Resources\Traits\ProcessIncludes; use MyParcelCom\ApiSdk\Resources\Traits\Resource; class Contract implements ContractInterface { use JsonSerializable; + use ProcessIncludes; use Resource; const ATTRIBUTE_CURRENCY = 'currency'; @@ -22,6 +24,10 @@ class Contract implements ContractInterface const RELATIONSHIP_CARRIER = 'carrier'; + const INCLUDES = [ + ResourceInterface::TYPE_CARRIER => self::RELATIONSHIP_CARRIER, + ]; + private ?string $id = null; private string $type = ResourceInterface::TYPE_CONTRACT; diff --git a/src/Resources/Manifest.php b/src/Resources/Manifest.php index 96ea266b..7bf4619c 100644 --- a/src/Resources/Manifest.php +++ b/src/Resources/Manifest.php @@ -15,13 +15,19 @@ use MyParcelCom\ApiSdk\Resources\Interfaces\ShipmentInterface; use MyParcelCom\ApiSdk\Resources\Interfaces\ShopInterface; use MyParcelCom\ApiSdk\Resources\Traits\JsonSerializable; +use MyParcelCom\ApiSdk\Resources\Traits\ProcessIncludes; use MyParcelCom\ApiSdk\Resources\Traits\Resource; class Manifest implements ManifestInterface { use JsonSerializable; + use ProcessIncludes; use Resource; + const INCLUDES = [ + ResourceInterface::TYPE_CONTRACT => 'contract', + ]; + private ?string $id = null; private string $type = ResourceInterface::TYPE_MANIFEST; private array $attributes = [ diff --git a/src/Resources/Service.php b/src/Resources/Service.php index 5d861fd2..8ad4499c 100644 --- a/src/Resources/Service.php +++ b/src/Resources/Service.php @@ -9,11 +9,13 @@ use MyParcelCom\ApiSdk\Resources\Interfaces\ServiceInterface; use MyParcelCom\ApiSdk\Resources\Interfaces\ServiceRateInterface; use MyParcelCom\ApiSdk\Resources\Traits\JsonSerializable; +use MyParcelCom\ApiSdk\Resources\Traits\ProcessIncludes; use MyParcelCom\ApiSdk\Resources\Traits\Resource; class Service implements ServiceInterface { use JsonSerializable; + use ProcessIncludes; use Resource; const ATTRIBUTE_NAME = 'name'; @@ -32,6 +34,10 @@ class Service implements ServiceInterface const RELATIONSHIP_CARRIER = 'carrier'; + const INCLUDES = [ + ResourceInterface::TYPE_CARRIER => self::RELATIONSHIP_CARRIER, + ]; + private ?string $id = null; private string $type = ResourceInterface::TYPE_SERVICE; diff --git a/src/Resources/Shop.php b/src/Resources/Shop.php index 71b46809..f8748aca 100644 --- a/src/Resources/Shop.php +++ b/src/Resources/Shop.php @@ -10,12 +10,14 @@ use MyParcelCom\ApiSdk\Resources\Interfaces\ResourceInterface; use MyParcelCom\ApiSdk\Resources\Interfaces\ShopInterface; use MyParcelCom\ApiSdk\Resources\Traits\JsonSerializable; +use MyParcelCom\ApiSdk\Resources\Traits\ProcessIncludes; use MyParcelCom\ApiSdk\Resources\Traits\Resource; use MyParcelCom\ApiSdk\Utils\DateUtils; class Shop implements ShopInterface { use JsonSerializable; + use ProcessIncludes; use Resource; const ATTRIBUTE_NAME = 'name'; @@ -26,6 +28,10 @@ class Shop implements ShopInterface const RELATIONSHIP_ORGANIZATION = 'organization'; + const INCLUDES = [ + ResourceInterface::TYPE_ORGANIZATION => self::RELATIONSHIP_ORGANIZATION, + ]; + private ?string $id = null; private string $type = ResourceInterface::TYPE_SHOP;