1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
EdnaUtils.php
См. документацию.
1<?php
2namespace Bitrix\MessageService\Providers\Edna;
3
4use Bitrix\Main\Error;
5use Bitrix\Main\Result;
6use Bitrix\MessageService\Providers;
7use Bitrix\MessageService\Providers\Constants\InternalOption;
8use Bitrix\MessageService\Providers\Edna\Constants;
9use Bitrix\MessageService\Internal\Entity\ChannelTable;
10
11abstract class EdnaUtils implements EdnaRu
12{
13 protected string $providerId;
16
17 abstract public function getMessageTemplates(string $subject = ''): Result;
19
21 {
22 $this->providerId = $providerId;
23 $this->optionManager = $optionManager;
24 $this->externalSender = $this->initializeDefaultExternalSender();
25 }
26
33 public function getChannelList(string $imType): Result
34 {
35 if (!in_array($imType, Constants\ChannelType::getAllTypeList(), true))
36 {
37 return (new Result())->addError(new Error('Incorrect imType'));
38 }
39
40 $channelResult = $this->gelAllChannelList();
41 if (!$channelResult->isSuccess())
42 {
43 return (new Result())->addError(new Error('Edna service error'));
44 }
45
46 $channelList = [];
47 foreach ($channelResult->getData() as $channel)
48 {
49 if (is_array($channel) && isset($channel['type']) && $channel['type'] === $imType)
50 {
51 $channelList[] = $channel;
52 }
53 }
54 if (empty($channelList))
55 {
56 return (new Result())->addError(new Error("There are no $imType channels in your profile"));
57 }
58
59 $result = new Result();
60 $result->setData($channelList);
61
62 return $result;
63 }
64
69 public function getCascadeList(): Result
70 {
71 $apiResult = $this->externalSender->callExternalMethod(Constants\Method::GET_CASCADES, [
72 'offset' => 0,
73 'limit' => 0
74 ]);
75
76 return $apiResult;
77 }
78
86 public function setCallback(string $callbackUrl, array $callbackTypes, ?int $subjectId = null): Result
87 {
89
90 $requestParams = [];
91 foreach ($callbackTypes as $callbackType)
92 {
93 if (in_array($callbackType, $typeList, true))
94 {
95 $requestParams[$callbackType] = $callbackUrl;
96 }
97 }
98 if (empty($requestParams))
99 {
100 return (new Result())->addError(new Error('Invalid callback types passed'));
101 }
102
103 if ($subjectId)
104 {
105 $requestParams['subjectId'] = $subjectId;
106 }
107 $this->externalSender->setApiKey($this->optionManager->getOption(InternalOption::API_KEY));
108
109 return $this->externalSender->callExternalMethod('callback/set', $requestParams);
110 }
111
112 public function getActiveChannelList(string $imType): Result
113 {
114 $channelListResult = $this->getChannelList($imType);
115 if (!$channelListResult->isSuccess())
116 {
117 return $channelListResult;
118 }
119
120 $activeChannelList = [];
121 foreach ($channelListResult->getData() as $channel)
122 {
123 if (isset($channel['active'], $channel['subjectId']) && $channel['active'] === true)
124 {
125 $activeChannelList[] = $channel;
126 }
127 }
128
129 if (empty($activeChannelList))
130 {
131 return (new Result())->addError(new Error('There are no active channels'));
132 }
133
134 return (new Result())->setData($activeChannelList);
135 }
136
137 public function checkActiveChannelBySubjectIdList(array $subjectIdList, string $imType): bool
138 {
139 if (empty($subjectIdList))
140 {
141 return false;
142 }
143
144 $channelResult = $this->getChannelList($imType);
145 if (!$channelResult->isSuccess())
146 {
147 return false;
148 }
149
150 $checkedChannels = [];
151 foreach ($channelResult->getData() as $channel)
152 {
153 if (
154 isset($channel['active'], $channel['subjectId'])
155 && $channel['active'] === true
156 && in_array($channel['subjectId'], $subjectIdList, true)
157 )
158 {
159 $checkedChannels[] = $channel['subjectId'];
160 }
161 }
162
163 return count($checkedChannels) === count($subjectIdList);
164 }
165
171 public function getCascadeIdFromSubject($subject, callable $subjectComparator): Result
172 {
173 $apiResult = $this->getCascadeList();
174 if (!$apiResult->isSuccess())
175 {
176 return $apiResult;
177 }
178
179 $apiData = $apiResult->getData();
180 $result = new Result();
181 foreach ($apiData as $cascade)
182 {
183 if (is_array($cascade))
184 {
185 if ($cascade['status'] !== 'ACTIVE' || $cascade['stagesCount'] > 1)
186 {
187 continue;
188 }
189 if ($subjectComparator($cascade['stages'][0]['subject'], $subject))
190 {
191 $result->setData(['cascadeId' => $cascade['id']]);
192
193 return $result;
194 }
195 }
196 }
197
198 $result->addError(new Error('Not cascade'));
199
200 return $result;
201 }
202
203
204 private function gelAllChannelList(): Result
205 {
206 $this->externalSender->setApiKey($this->optionManager->getOption(InternalOption::API_KEY));
207 return $this->externalSender->callExternalMethod(Constants\Method::GET_CHANNELS);
208 }
209
216 public function updateSavedChannelList(string $channelType): array
217 {
218 $fromList = [];
219 $activeChannelListResult = $this->getActiveChannelList($channelType);
220 if ($activeChannelListResult->isSuccess())
221 {
222 $registeredSubjectIdList = $this->optionManager->getOption(Providers\Constants\InternalOption::SENDER_ID, []);
223 $channels = [];
224 foreach ($activeChannelListResult->getData() as $channel)
225 {
226 if (in_array((int)$channel['subjectId'], $registeredSubjectIdList, true))
227 {
228 $fromList[] = [
229 'id' => $channel['subjectId'],
230 'name' => $channel['name'],
231 'channelPhone' => $channel['channelAttribute'] ?? '',
232 ];
233 $channels[] = [
234 'SENDER_ID' => $this->providerId,
235 'EXTERNAL_ID' => $channel['subjectId'],
236 'TYPE' => $channelType,
237 'NAME' => $channel['name'] ?? '',
238 'ADDITIONAL_PARAMS' => [
239 'channelAttribute' => $channel['channelAttribute'] ?? ''
240 ],
241 ];
242 }
243 }
244
245 if (count($channels) > 0)
246 {
247 ChannelTable::reloadChannels($this->providerId, $channelType, $channels);
248 }
249 else
250 {
251 ChannelTable::deleteByFilter([
252 '=SENDER_ID' => $this->providerId,
253 '=TYPE' => $channelType,
254 ]);
255 }
256 }
257
258 return $fromList;
259 }
260
261 public function sendTemplate(string $name, string $text, array $examples = [], ?string $langCode = null): Result
262 {
263 return (new Result())->addError(new Error('This provider does not support template creation'));
264 }
265
266 protected function validateLanguage(string $langCode): bool
267 {
268 $langs = [
269 'af', 'sq', 'ar', 'az', 'bn',
270 'bg', 'ca','zh_CN', 'zh_HK', 'zh_TW',
271 'hr', 'cs', 'da', 'nl', 'en',
272 'en_GB', 'en_US', 'et', 'fil', 'fi',
273 'fr', 'ka', 'de', 'el', 'gu',
274 'ha', 'he', 'hi', 'hu', 'id',
275 'ga', 'it', 'ja', 'kn', 'kk',
276 'rw_RW', 'ko', 'ky_KG', 'lo', 'lv',
277 'lt', 'mk', 'ms', 'ml', 'mr',
278 'nb', 'fa', 'pl', 'pt_BR', 'pt_PT',
279 'pa', 'ro', 'ru', 'sr', 'sk',
280 'sl', 'es', 'es_AR', 'es_ES', 'es_MX',
281 'sw', 'sv', 'ta', 'te', 'th',
282 'tr', 'uk', 'ur', 'uz', 'vi', 'zu',
283 ];
284
285 if (in_array($langCode, $langs, true))
286 {
287 return true;
288 }
289
290 return false;
291 }
292
293 protected function validateTemplateName(string $name): Result
294 {
295 $result = new Result();
296
297 if (!preg_match('/^[0-9a-z_]{1,60}$/i', $name))
298 {
299 return $result->addError(new Error('The template name can only contain Latin letters, numbers and underscore (_). The maximum number of characters is 60'));
300 }
301
302 return $result;
303 }
304
305 public function clearCache(string $key): void
306 {
307 $cacheManager = new Providers\CacheManager($this->providerId);
308 $cacheManager->deleteValue($key);
309 }
310}
Определения error.php:15
setCallback(string $callbackUrl, array $callbackTypes, ?int $subjectId=null)
Определения EdnaUtils.php:86
Providers OptionManager $optionManager
Определения EdnaUtils.php:15
getCascadeIdFromSubject($subject, callable $subjectComparator)
Определения EdnaUtils.php:171
validateLanguage(string $langCode)
Определения EdnaUtils.php:266
__construct(string $providerId, Providers\OptionManager $optionManager)
Определения EdnaUtils.php:20
validateTemplateName(string $name)
Определения EdnaUtils.php:293
getActiveChannelList(string $imType)
Определения EdnaUtils.php:112
sendTemplate(string $name, string $text, array $examples=[], ?string $langCode=null)
Определения EdnaUtils.php:261
getChannelList(string $imType)
Определения EdnaUtils.php:33
updateSavedChannelList(string $channelType)
Определения EdnaUtils.php:216
checkActiveChannelBySubjectIdList(array $subjectIdList, string $imType)
Определения EdnaUtils.php:137
Providers ExternalSender $externalSender
Определения EdnaUtils.php:14
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$requestParams
Определения urlrewrite.php:46
$name
Определения menu_edit.php:35
if(empty($signedUserToken)) $key
Определения quickway.php:257
$text
Определения template_pdf.php:79
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$langs
Определения options.php:141