PluginProbe
Packeta / 2.1
Packeta v2.1
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
← All changes | src/Packetery/Module/Api/Internal/CheckoutController.php +82 -55 1.6.12.1 View file →
@@ -8,9 +8,9 @@
8 8 declare( strict_types=1 );
9 9
10 10 namespace Packetery\Module\Api\Internal;
11 11
12 -use Packetery\Module\Checkout;
12 +use Packetery\Module\Checkout\CheckoutStorage;
13 13 use Packetery\Module\Order\Attribute;
14 14 use WP_REST_Controller;
15 15 use WP_REST_Request;
16 16 use WP_REST_Response;
@@ -18,9 +18,9 @@
18 18
19 19 /**
20 20 * Class CheckoutController. Input is validated in Checkout. We use transient because WC session is not yet loaded.
21 21 *
22 - * @package Packetery
22 + * @phpstan-type CheckoutData array<string, array<string, mixed>>
23 23 */
24 24 final class CheckoutController extends WP_REST_Controller {
25 25
26 26 private const RATE_ID = 'packetery_rate_id';
@@ -25,30 +25,20 @@
25 25
26 26 private const RATE_ID = 'packetery_rate_id';
27 27
28 28 /**
29 - * Router.
30 - *
31 29 * @var CheckoutRouter
32 30 */
33 31 private $router;
34 32
35 33 /**
36 - * Checkout.
37 - *
38 - * @var Checkout
34 + * @var CheckoutStorage
39 35 */
40 - private $checkout;
36 + private $checkoutStorage;
41 37
42 - /**
43 - * Constructor.
44 - *
45 - * @param CheckoutRouter $router Router.
46 - * @param Checkout $checkout Router.
47 - */
48 - public function __construct( CheckoutRouter $router, Checkout $checkout ) {
49 - $this->router = $router;
50 - $this->checkout = $checkout;
38 + public function __construct( CheckoutRouter $router, CheckoutStorage $checkoutStorage ) {
39 + $this->router = $router;
40 + $this->checkoutStorage = $checkoutStorage;
51 41 }
52 42
53 43 /**
54 44 * Register the routes of the controller. Endpoints are public.
@@ -85,62 +75,52 @@
85 75 'permission_callback' => '__return_true',
86 76 ],
87 77 ]
88 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 89 }
90 90
91 91 /**
92 - * Save selected pickup point.
92 + * @param WP_REST_Request<string[]> $request
93 93 *
94 - * @param WP_REST_Request $request Full data about the request.
95 - *
96 94 * @return WP_REST_Response
97 95 */
96 + // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
98 97 public function saveSelectedPickupPoint( WP_REST_Request $request ): WP_REST_Response {
99 - $parameters = $request->get_body_params();
100 - $savedData = get_transient( $this->checkout->getTransientNamePacketaCheckoutData() );
101 - if ( ! is_array( $savedData ) ) {
102 - $savedData = [];
103 - }
98 + $this->save( $request, Attribute::$pickupPointAttributes );
104 99
105 - $rateId = $parameters[ self::RATE_ID ];
106 - foreach ( Attribute::$pickupPointAttrs as $attribute ) {
107 - $savedData[ $rateId ][ $attribute['name'] ] = $parameters[ $attribute['name'] ];
108 - }
109 -
110 - set_transient(
111 - $this->checkout->getTransientNamePacketaCheckoutData(),
112 - $savedData,
113 - DAY_IN_SECONDS
114 - );
115 -
116 100 return new WP_REST_Response( [], 200 );
117 101 }
118 102
119 103 /**
120 - * Save validated address.
104 + * @param WP_REST_Request<string[]> $request
121 105 *
122 - * @param WP_REST_Request $request Full data about the request.
123 - *
124 106 * @return WP_REST_Response
125 107 */
108 + // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
126 109 public function saveValidatedAddress( WP_REST_Request $request ): WP_REST_Response {
127 - $parameters = $request->get_body_params();
128 - $savedData = get_transient( $this->checkout->getTransientNamePacketaCheckoutData() );
129 - if ( ! is_array( $savedData ) ) {
130 - $savedData = [];
131 - }
110 + $this->save( $request, Attribute::$homeDeliveryAttributes );
132 111
133 - $rateId = $parameters[ self::RATE_ID ];
134 - foreach ( Attribute::$homeDeliveryAttrs as $attribute ) {
135 - $savedData[ $rateId ][ $attribute['name'] ] = $parameters[ $attribute['name'] ];
136 - }
112 + return new WP_REST_Response( [], 200 );
113 + }
137 114
138 - set_transient(
139 - $this->checkout->getTransientNamePacketaCheckoutData(),
140 - $savedData,
141 - DAY_IN_SECONDS
142 - );
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 );
143 123
144 124 return new WP_REST_Response( [], 200 );
145 125 }
146 126
@@ -146,15 +126,62 @@
146 126
147 127 /**
148 128 * Removes saved selected pickup point or validated address.
149 129 *
150 - * @param WP_REST_Request $request Full data about the request.
130 + * @param WP_REST_Request<string[]> $request
151 131 *
152 132 * @return WP_REST_Response
153 133 */
134 + // phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
154 135 public function removeSavedData( WP_REST_Request $request ): WP_REST_Response {
155 - delete_transient( $this->checkout->getTransientNamePacketaCheckoutData() );
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 + }
156 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 +
157 158 return new WP_REST_Response( [], 200 );
158 159 }
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 + }
160 187 }