PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.10.0
ووسلام – همگام سازی ووکامرس و باسلام v1.10.0
1.10.19 1.10.20 1.10.18 1.10.17 1.10.15 1.10.14 1.10.13 1.10.12 1.10.10 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.2 1.9.1 1.9.0 1.8.8 1.8.5 1.8.6 All 53 releases
sync-basalam / includes / Services / FetchAnnouncements.php

FetchAnnouncements.php in ووسلام – همگام سازی ووکامرس و باسلام 1.10.0, at includes/Services/FetchAnnouncements.php

126 lines 3.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace SyncBasalam\Services;
4
5 use SyncBasalam\Admin\Settings\SettingsConfig;
6 use SyncBasalam\Config\Endpoints;
7 use SyncBasalam\Jobs\Exceptions\NonRetryableException;
8 use SyncBasalam\Services\Hamsalam\FetchHamsalamToken;
9
10 defined('ABSPATH') || exit;
11
12 class FetchAnnouncements
13 {
14 private string $url = Endpoints::HAMSALAM_ANNOUNCEMENTS;
15 private $tokenFetcher;
16 private ?string $hamsalamToken;
17
18 private const MAX_RETRY_ATTEMPTS = 2;
19
20 public function __construct($tokenFetcher = null)
21 {
22 $settings = syncBasalamSettings()->getSettings();
23
24 $this->hamsalamToken = $this->normalizeToken($settings[SettingsConfig::HAMSALAM_TOKEN] ?? null);
25 $this->tokenFetcher = $tokenFetcher ?: new FetchHamsalamToken();
26 }
27
28 public function fetch(int $page = 1, int $perPage = 5): ?array
29 {
30 $queryArgs = [
31 'page' => $page,
32 'per_page' => $perPage,
33 'filters[type]' => 'woosalam',
34 ];
35
36 $url = $this->url . '?' . http_build_query($queryArgs);
37 $attempt = 0;
38
39 while ($attempt < self::MAX_RETRY_ATTEMPTS) {
40 $attempt++;
41
42 try {
43 $apiService = syncBasalamContainer()->get(ApiServiceManager::class);
44 $response = $apiService->get($url, $this->buildHeaders());
45 } catch (NonRetryableException $e) {
46 if ((int) $e->getCode() === 401 && $attempt < self::MAX_RETRY_ATTEMPTS && $this->refreshHamsalamToken()) {
47 continue;
48 }
49
50 return null;
51 } catch (\Exception $e) {
52 return null;
53 }
54
55 if (($response['status_code'] ?? 0) === 401 && $attempt < self::MAX_RETRY_ATTEMPTS && $this->refreshHamsalamToken()) {
56 continue;
57 }
58
59 return $this->parseResponse($response, $page, $perPage);
60 }
61
62 return null;
63 }
64
65 private function buildHeaders(): array
66 {
67 $headers = [];
68
69 $token = $this->getHamsalamToken();
70 if ($token !== null) {
71 $headers['Authorization'] = 'Bearer ' . $token;
72 }
73
74 return $headers;
75 }
76
77 private function getHamsalamToken(): ?string
78 {
79 if ($this->hamsalamToken !== null) return $this->hamsalamToken;
80
81 $this->refreshHamsalamToken();
82
83 return $this->hamsalamToken;
84 }
85
86 private function refreshHamsalamToken(): bool
87 {
88 $token = $this->tokenFetcher->fetch();
89 $this->hamsalamToken = $this->normalizeToken($token);
90
91 return $this->hamsalamToken !== null;
92 }
93
94 private function normalizeToken($token): ?string
95 {
96 if (!is_string($token)) return null;
97
98 $token = trim($token);
99
100 if ($token === '' || str_starts_with($token, 'خطا')) return null;
101
102 return $token;
103 }
104
105
106 private function parseResponse(array $response, int $page, int $perPage): ?array
107 {
108 if (empty($response['body'])) {
109 return null;
110 }
111
112 $body = json_decode($response['body'], true);
113
114 if (!is_array($body) || empty($body['data'])) {
115 return null;
116 }
117
118 return [
119 'data' => $body['data'],
120 'total_page' => $body['total_page'] ?? 1,
121 'page' => $body['page'] ?? $page,
122 'per_page' => $body['per_page'] ?? $perPage,
123 ];
124 }
125 }
126