From 3c20386875deb82621fa77622e5becbc57046d84 Mon Sep 17 00:00:00 2001 From: weichien00 Date: Thu, 19 Aug 2021 01:31:27 +0800 Subject: [PATCH 1/4] feat: API to request change order address --- .../DataTransferObjects/AddressObject.php | 12 +++- .../Addresses/Services/CreatesAddress.php | 1 + .../RequestChangeOrderAddressLogic.php | 49 ++++++++++++++ .../RequestChangeOrderAddressProcessor.php | 66 +++++++++++++++++++ .../Standards/Rules/CanChangeOrderAddress.php | 39 +++++++++++ .../RequestChangeOrderAddressController.php | 20 ++++++ app/Http/Resources/OrderResource.php | 1 + app/Models/Order.php | 11 ++++ 8 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php create mode 100644 app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php create mode 100644 app/Classes/Modules/Orders/Standards/Rules/CanChangeOrderAddress.php create mode 100644 app/Http/Controllers/Orders/RequestChangeOrderAddressController.php diff --git a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php index 76c66b52..b4453c3a 100644 --- a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php +++ b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php @@ -3,6 +3,7 @@ namespace App\Classes\Modules\Addresses\DataTransferObjects; use App\Classes\General\Interfaces\DataTransferObject; +use App\Classes\ValueObjects\Constants\ApprovalStatus; class AddressObject implements DataTransferObject { @@ -38,7 +39,7 @@ class AddressObject implements DataTransferObject * @param int $postCode * @param null|string $reference */ - public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null) + public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null, ?int $status = ApprovalStatus::APPROVED) { $this->streetOne = $streetOne; $this->streetTwo = $streetTwo; @@ -47,6 +48,7 @@ class AddressObject implements DataTransferObject $this->districtId = $districtId; $this->postCode = $postCode; $this->reference = $reference; + $this->status = $status; } /** @@ -105,5 +107,13 @@ class AddressObject implements DataTransferObject return $this->reference; } + /** + * @return int + */ + public function getStatus(): int + { + return $this->status; + } + } \ No newline at end of file diff --git a/app/Classes/Modules/Addresses/Services/CreatesAddress.php b/app/Classes/Modules/Addresses/Services/CreatesAddress.php index b6662a98..b9f2716c 100644 --- a/app/Classes/Modules/Addresses/Services/CreatesAddress.php +++ b/app/Classes/Modules/Addresses/Services/CreatesAddress.php @@ -28,6 +28,7 @@ class CreatesAddress extends AbstractUpdateRelationshipRecord $model->state_id = $object->getStateId(); $model->district_id = $object->getDistrictId(); $model->postcode = $object->getPostCode(); + $model->status = $object->getStatus(); return $this->handler($addressable->addresses(), $model); diff --git a/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php b/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php new file mode 100644 index 00000000..b0c24f0b --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php @@ -0,0 +1,49 @@ + 'Request To Change Order Address', + 'message' => 'You have successfully request to change order address' + ]; + } + + /** @var RequestChangeOrderAddressProcessor */ + private $requestChangeOrderAddressProcessor; + + /** + * RequestChangeOrderAddressLogic constructor. + * @param RequestChangeOrderAddressProcessor $requestChangeOrderAddressProcessor + */ + + public function __construct(RequestChangeOrderAddressProcessor $requestChangeOrderAddressProcessor) + { + $this->requestChangeOrderAddressProcessor = $requestChangeOrderAddressProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + + public function logic(Request $request): JsonResponse + { + $order = $this->requestChangeOrderAddressProcessor->execute($request); + + return $this->resourceResponse(new OrderResource($order)); + } +} diff --git a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php new file mode 100644 index 00000000..7f01726b --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php @@ -0,0 +1,66 @@ +canChangeOrderAddress = $canChangeOrderAddress; + $this->fetchesOrder = $fetchesOrder; + $this->createsAddress = $createsAddress; + $this->fetchesAddress = $fetchesAddress; + $this->deletesAddress = $deletesAddress; + } + + + public function execute(Request $request) + { + + $this->canChangeOrderAddress->passes(); + + $order = $this->fetchesOrder->execute(['id' => $request->get('order_id')]); + foreach ($order->addressesPendingVerification as $address) { + $this->deletesAddress->execute($address); + } + + $address = $this->fetchesAddress->execute(['id' => $request->get('address_id')]); + $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->reference, ApprovalStatus::PENDING_VERIFICATION); + $this->createsAddress->execute($order, $addressObject); + + return $order; + } +} diff --git a/app/Classes/Modules/Orders/Standards/Rules/CanChangeOrderAddress.php b/app/Classes/Modules/Orders/Standards/Rules/CanChangeOrderAddress.php new file mode 100644 index 00000000..1030168b --- /dev/null +++ b/app/Classes/Modules/Orders/Standards/Rules/CanChangeOrderAddress.php @@ -0,0 +1,39 @@ +execute($request); + } +} diff --git a/app/Http/Resources/OrderResource.php b/app/Http/Resources/OrderResource.php index 1a31578f..1653de70 100644 --- a/app/Http/Resources/OrderResource.php +++ b/app/Http/Resources/OrderResource.php @@ -24,6 +24,7 @@ class OrderResource extends JsonResource 'company_module' => new CompanyModuleResource($this->companyModule), 'warehouse' => new CompanyModuleResource($this->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee), 'address' => new AddressResource($this->addresses()->first()), + 'address_change_request' => new AddressResource($this->addressesPendingVerification()->first()), 'created_at' => $this->created_at->format('d-m-Y') ]; } diff --git a/app/Models/Order.php b/app/Models/Order.php index 58f64dc8..050ff390 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Addressable; use App\Classes\ValueObjects\Constants\RoleTypes; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Scopes\CustomerOrdersScope; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; @@ -57,4 +58,14 @@ class Order extends AbstractModel implements Addressable // static::addGlobalScope(new CustomerOrdersScope); // } } + + public function addressesPendingVerification() + { + return $this->addresses()->where('status','=',ApprovalStatus::PENDING_VERIFICATION); + } + + public function addressesApproved() + { + return $this->addresses()->where('status','=',ApprovalStatus::APPROVED); + } } From 5a043e89a027fa7b1c36f57c6778eb0762bee475 Mon Sep 17 00:00:00 2001 From: weichien00 Date: Thu, 19 Aug 2021 01:33:16 +0800 Subject: [PATCH 2/4] feat: API to approve order address change. --- .../ApproveChangeOrderAddressLogic.php | 43 +++++++++++++++ .../ApproveChangeOrderAddressProcessor.php | 53 +++++++++++++++++++ .../Orders/Services/UpdatesOrdersAddress.php | 20 +++++++ .../Rules/CanApproveChangeOrderAddress.php | 39 ++++++++++++++ .../ApproveChangeOrderAddressController.php | 20 +++++++ 5 files changed, 175 insertions(+) create mode 100644 app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php create mode 100644 app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php create mode 100644 app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php create mode 100644 app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php create mode 100644 app/Http/Controllers/Orders/ApproveChangeOrderAddressController.php diff --git a/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php b/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php new file mode 100644 index 00000000..ff78145e --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php @@ -0,0 +1,43 @@ + 'Change Order Address Approval', + 'message' => 'You have successfully change the order address' + ]; + } + + /** @var ApproveChangeOrderAddressProcessor */ + private $approveChangeOrderAddressProcessor; + + /** + * ApproveChangeOrderAddressLogic constructor. + * @param ApproveChangeOrderAddressProcessor $approveChangeOrderAddressProcessor + */ + + public function __construct(ApproveChangeOrderAddressProcessor $approveChangeOrderAddressProcessor) + { + $this->approveChangeOrderAddressProcessor = $approveChangeOrderAddressProcessor; + } + + public function logic(Request $request): JsonResponse + { + $order = $this->approveChangeOrderAddressProcessor->execute($request); + + return $this->resourceResponse(new OrderResource($order)); + } +} diff --git a/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php new file mode 100644 index 00000000..423d8ce5 --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php @@ -0,0 +1,53 @@ +canApproveChangeOrderAddress = $canApproveChangeOrderAddress; + $this->fetchesOrder = $fetchesOrder; + $this->deletesAddress = $deletesAddress; + $this->updatesOrdersAddress = $updatesOrdersAddress; + } + + + public function execute(Request $request) + { + $this->canApproveChangeOrderAddress->passes(); + + $order = $this->fetchesOrder->execute(['id' => $request->get('order_id')]); + $this->deletesAddress->execute($order->addressesApproved->first()); + $this->updatesOrdersAddress->execute($order->addressesPendingVerification->first(), ApprovalStatus::APPROVED); + + return $order; + } +} diff --git a/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php b/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php new file mode 100644 index 00000000..3ad6295a --- /dev/null +++ b/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php @@ -0,0 +1,20 @@ +status = $type; + return $this->handler($address); + } +} diff --git a/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php b/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php new file mode 100644 index 00000000..24ce6418 --- /dev/null +++ b/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php @@ -0,0 +1,39 @@ +execute($request); + } +} From 6fb5d666312900ef06f26e81f7915adaee7fa059 Mon Sep 17 00:00:00 2001 From: weichien00 Date: Thu, 19 Aug 2021 01:33:50 +0800 Subject: [PATCH 3/4] feat: add route for request and approve address change. --- routes/order.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routes/order.php b/routes/order.php index 4f31ecff..27cb66ef 100644 --- a/routes/order.php +++ b/routes/order.php @@ -9,4 +9,6 @@ Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], f Route::put('/confirm/{id}', 'ConfirmOrderController@confirm')->name('confirm'); Route::put('/cancel/{id}', 'CancelOrderController@cancel')->name('cancel'); Route::put('/restore/{id}', 'RestoreOrderController@restore')->name('restore'); + Route::post('/address/change/request', 'RequestChangeOrderAddressController@request')->name('address.change.request'); + Route::post('/address/change/approve', 'ApproveChangeOrderAddressController@approve')->name('address.change.approve'); }); From e0405bca1ec0deeb1c95d7c9b61e541e6fe38e80 Mon Sep 17 00:00:00 2001 From: weichien00 Date: Thu, 19 Aug 2021 01:35:23 +0800 Subject: [PATCH 4/4] swagger: add show order, request address change, and approve address change api endpoint. --- resources/views/swagger/json.blade.php | 142 +++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index 1e09fa9c..00cfe1a3 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -2430,6 +2430,148 @@ } } }, + "/order/show/{id}": { + "get": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "showOrder", + "summary": "Show order", + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Order Reference Id", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, + "/order/address/change/request": { + "post": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "requestChangeOrderAddress", + "summary": "Request Change Order Address", + "description": "", + "parameters": [ + { + "name": "order_id", + "in": "query", + "description": "Order ID", + "required": true, + "type": "integer" + }, + { + "name": "address_id", + "in": "query", + "description": "New Order Address ID", + "required": true, + "type": "integer" + }, + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, + "/order/address/change/approve": { + "post": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "approveChangeOrderAddress", + "summary": "Approve Change Order Address", + "description": "", + "parameters": [ + { + "name": "order_id", + "in": "query", + "description": "Order ID", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, "/address/create": { "post": { "tags": [