18 private const PUSH_CONVERT_NAME =
'chatConvert';
19 private const VALID_CONVERSIONS = [
20 Chat::IM_TYPE_OPEN => [Chat::IM_TYPE_CHAT, Chat::IM_TYPE_CHANNEL, Chat::IM_TYPE_OPEN_CHANNEL],
21 Chat::IM_TYPE_CHAT => [Chat::IM_TYPE_OPEN, Chat::IM_TYPE_CHANNEL, Chat::IM_TYPE_OPEN_CHANNEL, Chat::IM_TYPE_COLLAB],
22 Chat::IM_TYPE_OPEN_CHANNEL => [Chat::IM_TYPE_CHANNEL, Chat::IM_TYPE_CHAT, Chat::IM_TYPE_OPEN],
23 Chat::IM_TYPE_CHANNEL => [Chat::IM_TYPE_OPEN_CHANNEL, Chat::IM_TYPE_CHAT, Chat::IM_TYPE_OPEN],
24 Chat::IM_TYPE_COPILOT => [Chat::IM_TYPE_AI_ASSISTANT],
26 private const OPEN_TYPES = [Chat::IM_TYPE_OPEN, Chat::IM_TYPE_OPEN_CHANNEL];
27 private const CHANNEL_TYPES = [Chat::IM_TYPE_CHANNEL, Chat::IM_TYPE_OPEN_CHANNEL];
30 private string $oldType;
31 private string $oldRestType;
32 private string $newType;
36 $this->chatId = $chatId;
38 $this->newType = $newType;
47 if (!$checkResult->isSuccess())
49 return $result->addErrors($checkResult->getErrors());
63 catch (\Throwable $exception)
79 $validConversions = self::VALID_CONVERSIONS[$this->oldType] ?? [];
100 return $this->
getChat()->getEntityType() === Chat\ExtendedType::Sonet->value && $this->
getChat()->getEntityId() > 0;
106 Chat::cleanAccessCache($this->chatId);
117 $fields = [
'TYPE' => $this->newType];
120 $fields[
'DISK_FOLDER_ID'] =
null;
123 ChatTable::update($this->chatId,
$fields);
146 RelationTable::updateByFilter([
'=CHAT_ID' => $this->chatId], [
'MESSAGE_TYPE' => $this->newType]);
153 RecentTable::updateByFilter([
'=ITEM_TYPE' => $this->oldType,
'=ITEM_ID' => $this->chatId], [
'ITEM_TYPE' => $this->newType]);
160 MessageUnreadTable::updateByFilter([
'=CHAT_ID' => $this->chatId], [
'CHAT_TYPE' => $this->newType]);
171 $chatIds = CounterService::getChildrenWithCounters($this->
getChat());
173 if (!empty($chatIds))
175 MessageUnreadTable::deleteByFilter([
'=CHAT_ID' => $chatIds]);
186 'command' => self::PUSH_CONVERT_NAME,
188 'id' => $this->chatId,
189 'dialogId' =>
'chat' . $this->chatId,
190 'oldType' => $this->oldRestType,
191 'newType' => $chat->getExtendedType(),
192 'newPermissions' => $chat->getPermissions(),
193 'newTypeParams' =>
null,
201 $pushParams[
'params'][
'newTypeParams'][$collabInfo::getRestEntityName()] = $collabInfo->toRestFormat();
205 if (\CIMMessenger::needToSendPublicPull($this->newType) || \CIMMessenger::needToSendPublicPull($this->oldType))
207 \CPullWatch::AddToStack(
'IM_PUBLIC_' . $this->chatId, $pushParams);
213 $this->oldType = $this->
getChat()->getType();
214 $this->oldRestType = $this->
getChat()->getExtendedType();
219 $folder = $this->
getChat()->getOrCreateDiskFolder();
226 if (!$departmentCode)
231 $driver = \Bitrix\Disk\Driver::getInstance();
232 $rightsManager = $driver->getRightsManager();
233 $departmentRight = [[
234 'ACCESS_CODE' => $departmentCode,
235 'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_READ)
237 $rightsManager->append($folder, $departmentRight);
242 $folder = $this->
getChat()->getOrCreateDiskFolder();
248 $driver = \Bitrix\Disk\Driver::getInstance();
249 $rightsManager = $driver->getRightsManager();
250 $accessProvider = new \Bitrix\Im\Access\ChatAuthProvider;
254 'ACCESS_CODE' => $accessProvider->generateAccessCode($this->chatId),
255 'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_EDIT)
257 $rightsManager->set($folder, $accessCodes);
262 $isOldTypeClose = !in_array($this->oldType, self::OPEN_TYPES,
true);
263 $isNewTypeOpen = in_array($this->newType, self::OPEN_TYPES,
true);
265 return $isOldTypeClose && $isNewTypeOpen;
270 $isOldTypeOpen = in_array($this->oldType, self::OPEN_TYPES,
true);
271 $isNewTypeClose = !in_array($this->newType, self::OPEN_TYPES,
true);
273 return $isOldTypeOpen && $isNewTypeClose;
278 $isOldTypeChannel = in_array($this->oldType, self::CHANNEL_TYPES,
true);
279 $isNewTypeNotChannel = !in_array($this->newType, self::CHANNEL_TYPES,
true);
281 return $isOldTypeChannel && $isNewTypeNotChannel;
286 return $this->oldType === Chat::IM_TYPE_CHAT && $this->newType === Chat::IM_TYPE_COLLAB;
291 $emptyPermissions = [];
292 foreach (
Permission\ActionGroup::cases() as $permission)
294 $emptyPermissions[$permission->value] =
'';
296 $this->
getChat()->fill($emptyPermissions);
static getConnection($name="")
static clearCache($moduleId)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)