PluginProbe
Packeta / 2.0.9
Packeta v2.0.9
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / src / Packetery / Module / Api / Internal / CheckoutController.php

CheckoutController.php in Packeta 2.0.9, at src/Packetery/Module/Api/Internal/CheckoutController.php

188 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class CheckoutController
4 *
5 * @package Packetery
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Api\Internal;
11
12 use Packetery\Module\Checkout\CheckoutStorage;
13 use Packetery\Module\Order\Attribute;
14 use WP_REST_Controller;
15 use WP_REST_Request;
16 use WP_REST_Response;
17 use WP_REST_Server;
18
19 /**
20 * Class CheckoutController. Input is validated in Checkout. We use transient because WC session is not yet loaded.
21 *
22 * @phpstan-type CheckoutData array<string, array<string, mixed>>
23 */
24 final class CheckoutController extends WP_REST_Controller {
25
26 private const RATE_ID = 'packetery_rate_id';
27
28 /**
29 * @var CheckoutRouter
30 */
31 private $router;
32
33 /**
34 * @var CheckoutStorage
35 */
36 private $checkoutStorage;
37
38 public function __construct( CheckoutRouter $router, CheckoutStorage $checkoutStorage ) {
39 $this->router = $router;
40 $this->checkoutStorage = $checkoutStorage;
41 }
42
43 /**
44 * Register the routes of the controller. Endpoints are public.
45 *
46 * @return void
47 */
48 public function registerRoutes(): void {
49 $this->router->registerRoute(
50 CheckoutRouter::PATH_SAVE_SELECTED_PICKUP_POINT,
51 [
52 [
53 'methods' => WP_REST_Server::EDITABLE,
54 'callback' => [ $this, 'saveSelectedPickupPoint' ],
55 'permission_callback' => '__return_true',
56 ],
57 ]
58 );
59 $this->router->registerRoute(
60 CheckoutRouter::PATH_SAVE_VALIDATED_ADDRESS,
61 [
62 [
63 'methods' => WP_REST_Server::EDITABLE,
64 'callback' => [ $this, 'saveValidatedAddress' ],
65 'permission_callback' => '__return_true',
66 ],
67 ]
68 );
69 $this->router->registerRoute(
70 CheckoutRouter::PATH_REMOVE_SAVED_DATA,
71 [
72 [
73 'methods' => WP_REST_Server::EDITABLE,
74 'callback' => [ $this, 'removeSavedData' ],
75 'permission_callback' => '__return_true',
76 ],
77 ]
78 );
79 $this->router->registerRoute(
80 CheckoutRouter::PATH_SAVE_DELIVERY_ADDRESS,
81 [
82 [
83 'methods' => WP_REST_Server::EDITABLE,
84 'callback' => [ $this, 'saveCarDeliveryDetails' ],
85 'permission_callback' => '__return_true',
86 ],
87 ]
88 );
89 }
90
91 /**
92 * @param WP_REST_Request<string[]> $request
93 *
94 * @return WP_REST_Response
95 */
96 // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
97 public function saveSelectedPickupPoint( WP_REST_Request $request ): WP_REST_Response {
98 $this->save( $request, Attribute::$pickupPointAttributes );
99
100 return new WP_REST_Response( [], 200 );
101 }
102
103 /**
104 * @param WP_REST_Request<string[]> $request
105 *
106 * @return WP_REST_Response
107 */
108 // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
109 public function saveValidatedAddress( WP_REST_Request $request ): WP_REST_Response {
110 $this->save( $request, Attribute::$homeDeliveryAttributes );
111
112 return new WP_REST_Response( [], 200 );
113 }
114
115 /**
116 * @param WP_REST_Request<string[]> $request
117 *
118 * @return WP_REST_Response
119 */
120 // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
121 public function saveCarDeliveryDetails( WP_REST_Request $request ): WP_REST_Response {
122 $this->save( $request, Attribute::$carDeliveryAttributes );
123
124 return new WP_REST_Response( [], 200 );
125 }
126
127 /**
128 * Removes saved selected pickup point or validated address.
129 *
130 * @param WP_REST_Request<string[]> $request
131 *
132 * @return WP_REST_Response
133 */
134 // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
135 public function removeSavedData( WP_REST_Request $request ): WP_REST_Response {
136 $params = $request->get_params();
137 if ( ! isset( $params['carrierId'] ) || $params['carrierId'] === '' ) {
138 $this->checkoutStorage->deleteTransient();
139 } else {
140 $savedData = $this->checkoutStorage->getFromTransient();
141 // False when does not exist, empty string when improperly saved.
142 if ( ! is_array( $savedData ) ) {
143 if ( $savedData === '' ) {
144 $this->checkoutStorage->deleteTransient();
145 }
146
147 return new WP_REST_Response( [], 200 );
148 }
149
150 unset( $savedData[ $params['carrierId'] ] );
151
152 /** @var CheckoutData|array{} $savedData */
153 if ( $savedData === [] || $this->checkoutStorage->validateDataStructure( $savedData ) ) {
154 $this->checkoutStorage->setTransient( $savedData );
155 }
156 }
157
158 return new WP_REST_Response( [], 200 );
159 }
160
161 /**
162 * Saves carrier data.
163 *
164 * @param WP_REST_Request<string[]> $request
165 * @param array $carrierAttrs
166 *
167 * @return void
168 */
169 // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
170 private function save( WP_REST_Request $request, array $carrierAttrs ): void {
171 $parameters = $request->get_body_params();
172 $savedData = $this->checkoutStorage->getFromTransient();
173 if ( ! is_array( $savedData ) ) {
174 $savedData = [];
175 }
176
177 $rateId = $parameters[ self::RATE_ID ];
178 foreach ( $carrierAttrs as $attribute ) {
179 $savedData[ $rateId ][ $attribute['name'] ] = $parameters[ $attribute['name'] ];
180 }
181
182 if ( $this->checkoutStorage->validateDataStructure( $savedData ) ) {
183 /** @var CheckoutData $savedData */
184 $this->checkoutStorage->setTransient( $savedData );
185 }
186 }
187 }
188