PluginProbe
Packeta / trunk
Packeta vtrunk
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 / Carrier / Downloader.php

Downloader.php in Packeta trunk, at src/Packetery/Module/Carrier/Downloader.php

177 lines 4.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Packeta carrier downloader
4 *
5 * @package Packetery
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module\Carrier;
11
12 use Packetery\Core\Api\WebRequestException;
13 use Packetery\Module\Framework\WpAdapter;
14 use Packetery\Module\Options\OptionNames;
15 use Packetery\Module\Options\OptionsProvider;
16 use Packetery\Module\WebRequestClient;
17
18 /**
19 * Class Downloader
20 *
21 * @package Packetery
22 */
23 class Downloader {
24 private const API_URL = 'https://pickup-point.api.packeta.com/v5/%s/carrier/json?lang=%s';
25
26 /**
27 * Carrier updater.
28 *
29 * @var Updater Carrier updater.
30 */
31 private $carrierUpdater;
32
33 /**
34 * Options provider.
35 *
36 * @var OptionsProvider Options provider.
37 */
38 private $optionsProvider;
39
40 /**
41 * HTTP client.
42 *
43 * @var WebRequestClient
44 */
45 private $webRequestClient;
46
47 /**
48 * @var WpAdapter
49 */
50 private $wpAdapter;
51
52 /**
53 * Downloader constructor.
54 *
55 * @param Updater $carrierUpdater Carrier updater.
56 * @param OptionsProvider $optionsProvider Options provider.
57 * @param WebRequestClient $webRequestClient HTTP client.
58 * @param WpAdapter $wpAdapter WP adapter.
59 */
60 public function __construct(
61 Updater $carrierUpdater,
62 OptionsProvider $optionsProvider,
63 WebRequestClient $webRequestClient,
64 WpAdapter $wpAdapter
65 ) {
66 $this->carrierUpdater = $carrierUpdater;
67 $this->optionsProvider = $optionsProvider;
68 $this->webRequestClient = $webRequestClient;
69 $this->wpAdapter = $wpAdapter;
70 }
71
72 /**
73 * Runs update and returns result.
74 *
75 * @return string[]
76 */
77 public function run(): array {
78 try {
79 $carriers = $this->fetch_as_array( substr( $this->wpAdapter->getLocale(), 0, 2 ) );
80 } catch ( \Exception $e ) {
81 return [
82 strtr(
83 // translators: keep %failReason placeholder intact.
84 __( 'Carrier download failed: %failReason Please try again later.', 'packeta' ),
85 array( '%failReason' => $e->getMessage() )
86 ),
87 'error',
88 ];
89 }
90 if ( $carriers === null || count( $carriers ) === 0 ) {
91 // translators: keep %failReason placeholder intact.
92 $translatedMessage = __( 'Carrier download failed: %failReason Please try again later.', 'packeta' );
93
94 return [
95 strtr(
96 $translatedMessage,
97 array( '%failReason' => __( 'Failed to get the list.', 'packeta' ) )
98 ),
99 'error',
100 ];
101 }
102 $validationResult = $this->carrierUpdater->validate_carrier_data( $carriers );
103 if ( ! $validationResult ) {
104 // translators: keep %failReason placeholder intact.
105 $translatedMessage = __( 'Carrier download failed: %failReason Please try again later.', 'packeta' );
106
107 return [
108 strtr(
109 $translatedMessage,
110 array( '%failReason' => __( 'Invalid API response.', 'packeta' ) )
111 ),
112 'error',
113 ];
114 }
115 $this->carrierUpdater->save( $carriers );
116 update_option( OptionNames::LAST_CARRIER_UPDATE, gmdate( DATE_ATOM ) );
117
118 return [
119 __( 'Carriers were updated.', 'packeta' ),
120 'success',
121 ];
122 }
123
124 /**
125 * Cron job. No authorization needed - job is registered internally.
126 */
127 public function runAndRender(): void {
128 [ $message, $class ] = $this->run();
129 echo esc_html( $message );
130 }
131
132 /**
133 * Downloads carriers and returns in array.
134 *
135 * @param string $language Two-letter code.
136 *
137 * @return array<int, array<string, string>>|null
138 * @throws WebRequestException DownloadException.
139 */
140 public function fetch_as_array( string $language ): ?array {
141 $json = $this->download_json( $language );
142
143 return $this->get_from_json( $json );
144 }
145
146 /**
147 * Downloads carriers in JSON.
148 *
149 * @param string $language Two-letter code.
150 *
151 * @return string
152 * @throws WebRequestException DownloadException.
153 */
154 private function download_json( string $language ): string {
155 return $this->webRequestClient->get(
156 sprintf(
157 self::API_URL,
158 $this->optionsProvider->get_api_key(),
159 $language
160 )
161 );
162 }
163
164 /**
165 * Converts JSON to array.
166 *
167 * @param string $json JSON.
168 *
169 * @return array<int, array<string, string>>|null
170 */
171 private function get_from_json( string $json ): ?array {
172 $carriersData = json_decode( $json, true );
173
174 return ( $carriersData ?? null );
175 }
176 }
177