1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
chatauthprovider.php
См. документацию.
1<?php
2
4
5use \Bitrix\Main\Localization\Loc;
7
18{
19 protected const PROVIDER_ID = 'imchat';
20 protected const ACCESS_CODE_PREFIX = 'CHAT';
21
22 public function __construct()
23 {
24 $this->id = self::PROVIDER_ID;
25 }
26
32 public static function getProviders(): array
33 {
34 return [
35 [
36 'ID' => self::PROVIDER_ID,
37 'CLASS' => self::class,
38 'PROVIDER_NAME' => Loc::getMessage('chat_auth_provider'),
39 'NAME' => Loc::getMessage('chat_auth_provider_name'),
40 'SORT' => 400,
41 ]
42 ];
43 }
44
50 public function generateAccessCode(int $chatId): string
51 {
52 return self::ACCESS_CODE_PREFIX. $chatId;
53 }
54
64 public function getNames($codes): array
65 {
66 $chatIds = [];
67 $accessCodePrefix = self::ACCESS_CODE_PREFIX;
68 foreach ($codes as $code)
69 {
70 if (preg_match("/^{$accessCodePrefix}([0-9]+)$/i", $code, $match))
71 {
72 $chatIds[] = (int)$match[1];
73 }
74 }
75
76 $result = [];
77 if (count($chatIds) > 0)
78 {
79 $resChatData = \Bitrix\Im\Model\ChatTable::getList([
80 'select' => ['ID', 'TITLE'],
81 'filter' => ['=ID' => $chatIds],
82 ]);
83 while ($chat = $resChatData->fetch())
84 {
85 $accessCode = $this->generateAccessCode($chat['ID']);
86 $result[$accessCode] = [
87 'provider' => Loc::getMessage('chat_auth_provider'),
88 ];
89 if (!empty($chat['TITLE']))
90 {
91 $result[$accessCode]['name'] = $chat['TITLE'];
92 }
93 else
94 {
95 $result[$accessCode]['name'] = Loc::getMessage('chat_auth_title', ['#CHAT_ID#' => $chat['ID']]);
96 }
97 }
98 }
99
100 return $result;
101 }
102
109 public function deleteByUser($userId): void
110 {
111 $userId = (int)$userId;
112 if ($userId > 0)
113 {
115 $helper = $connection->getSqlHelper();
116 $providerId = $helper->forSql($this->id);
117 $connection->queryExecute("
118 DELETE FROM b_user_access
119 WHERE PROVIDER_ID = '{$providerId}' AND USER_ID = {$userId}
120 ");
121 }
122
123 parent::deleteByUser($userId);
124 }
125
133 public function addChatCodes(int $chatId, array $userIds): void
134 {
135 $userIds = array_filter(array_map('intVal', $userIds));
136 if ($chatId > 0 && !empty($userIds))
137 {
139 $helper = $connection->getSqlHelper();
140 $providerId = $helper->forSql($this->id);
141 $accessCode = $helper->forSql($this->generateAccessCode($chatId));
142
143 $users = implode(',', $userIds);
144
145 $sql = $helper->getInsertIgnore(
146 'b_user_access',
147 '(USER_ID, PROVIDER_ID, ACCESS_CODE)',
148 "SELECT ID, '{$providerId}', '{$accessCode}'
149 FROM b_user
150 WHERE ID IN({$users})"
151 );
152
153 $connection->queryExecute($sql);
154
155 foreach ($userIds as $uid)
156 {
157 \CAccess::ClearCache($uid);
158 }
159 }
160 }
161
169 public function deleteChatCodes(int $chatId, ?array $userIds = null): void
170 {
171 if ($chatId > 0)
172 {
174 $helper = $connection->getSqlHelper();
175 $providerId = $helper->forSql($this->id);
176 $accessCode = $helper->forSql($this->generateAccessCode($chatId));
177
178 if ($userIds === null)
179 {
180 $res = \Bitrix\Main\UserAccessTable::getList([
181 'filter' => ['=ACCESS_CODE' => $accessCode],
182 'select' => ['USER_ID']
183 ]);
184 $userIds = [];
185 while ($row = $res->fetch())
186 {
187 $userIds[] = (int)$row['USER_ID'];
188 }
189
190 $connection->queryExecute("
191 DELETE FROM b_user_access
192 WHERE PROVIDER_ID = '{$providerId}' AND ACCESS_CODE = '{$accessCode}'
193 ");
194 }
195 else
196 {
197 $userIds = array_filter(array_map('intVal', $userIds));
198 if (count($userIds) > 0)
199 {
200 $users = implode(',', $userIds);
201 $connection->queryExecute("
202 DELETE FROM b_user_access
203 WHERE PROVIDER_ID = '{$providerId}'
204 AND ACCESS_CODE = '{$accessCode}'
205 AND USER_ID IN({$users})
206 ");
207 }
208 }
209
210 foreach ($userIds as $uid)
211 {
212 \CAccess::ClearCache($uid);
213 }
214 }
215 }
216
217 public function isCodeAlreadyExists(int $chatId, int $userId): bool
218 {
219 $result = UserAccessTable::query()
220 ->setSelect(['USER_ID'])
221 ->where('USER_ID', $userId)
222 ->where('ACCESS_CODE', $this->generateAccessCode($chatId))
223 ->where('PROVIDER_ID', $this->id)
224 ->setLimit(1)
225 ->fetch()
226 ;
227
228 return $result !== false;
229 }
230
237 public function updateChatCodesByRelations(int $chatId): void
238 {
239 if ($chatId > 0)
240 {
242 $helper = $connection->getSqlHelper();
243 $providerId = $helper->forSql($this->id);
244 $accessCode = $helper->forSql($this->generateAccessCode($chatId));
245
246 $sql = $helper->getInsertIgnore(
247 'b_user_access',
248 '(USER_ID, PROVIDER_ID, ACCESS_CODE)',
249 "SELECT R.USER_ID, '{$providerId}', '{$accessCode}'
250 FROM b_im_relation R
251 INNER JOIN b_user U ON R.USER_ID = U.ID
252 LEFT JOIN b_user_access A
253 ON U.ID = A.USER_ID
254 AND A.PROVIDER_ID = '{$providerId}'
255 AND A.ACCESS_CODE = '{$accessCode}'
256 WHERE
257 R.CHAT_ID = {$chatId}
258 AND A.ID IS NULL
259 AND (CASE
260 WHEN U.EXTERNAL_AUTH_ID = 'imconnector' AND POSITION('livechat|' in U.XML_Id) = 1 THEN 1
261 WHEN U.EXTERNAL_AUTH_ID = 'imconnector' THEN 0
262 ELSE 1
263 END) = 1"
264 );
265
266 $connection->queryExecute($sql);
267
268 $connection->queryExecute("
269 DELETE FROM b_user_access
270 WHERE PROVIDER_ID = '{$providerId}'
271 AND ACCESS_CODE = '{$accessCode}'
272 AND USER_ID NOT IN(
273 SELECT R.USER_ID
274 FROM b_im_relation R
275 WHERE R.CHAT_ID = {$chatId}
276 )
277 ");
278
279 $res = \Bitrix\Main\UserAccessTable::getList([
280 'filter' => ['=ACCESS_CODE' => $accessCode],
281 'select' => ['USER_ID']
282 ]);
283 while ($row = $res->fetch())
284 {
285 \CAccess::ClearCache($row['USER_ID']);
286 }
287 }
288 }
289
297 public function addUserCode(int $chatId, int $userId): void
298 {
299 \CAccess::AddCode($userId, $this->id, $this->generateAccessCode($chatId));
300 }
301
309 public function removeUserCode(int $chatId, int $userId): void
310 {
311 \CAccess::RemoveCode($userId, $this->id, $this->generateAccessCode($chatId));
312 }
313}
$connection
Определения actionsdefinitions.php:38
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
generateAccessCode(int $chatId)
Определения chatauthprovider.php:50
updateChatCodesByRelations(int $chatId)
Определения chatauthprovider.php:237
isCodeAlreadyExists(int $chatId, int $userId)
Определения chatauthprovider.php:217
removeUserCode(int $chatId, int $userId)
Определения chatauthprovider.php:309
deleteChatCodes(int $chatId, ?array $userIds=null)
Определения chatauthprovider.php:169
addChatCodes(int $chatId, array $userIds)
Определения chatauthprovider.php:133
addUserCode(int $chatId, int $userId)
Определения chatauthprovider.php:297
static getConnection($name="")
Определения application.php:638
Определения authproviders.php:17
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$uid
Определения hot_keys_act.php:8
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
</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