• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_disk.php
  • Класс: CIMDisk
  • Вызов: CIMDisk::GetFolderModel
static function GetFolderModel($chatId, $createFolder = true)
{
	if (!self::Enabled())
	{
		return false;
	}

	if ((int)$chatId <= 0)
	{
		return false;
	}

	$folderModel = false;

	$result = IMModelChatTable::getById($chatId);
	if (!$chat = $result->fetch())
	{
		return false;
	}

	if (in_array($chat['TYPE'], [IMV2Chat::IM_TYPE_COMMENT], true))
	{
		return false;
	}

	$folderId = (int)$chat['DISK_FOLDER_ID'];
	if ($folderId > 0)
	{
		$folderModel = BitrixDiskFolder::getById($folderId);
		if (
			!$folderModel
			|| !($folderModel instanceof BitrixDiskFolder)
			|| ($folderModel->getStorageId() != self::GetStorageId())
		)
		{
			$folderId = 0;
		}
	}

	if (!$folderId && $createFolder === true)
	{
		$chatType = $chat['TYPE'];
		$driver = BitrixDiskDriver::getInstance();
		$storageModel = self::GetStorage();
		if (!$storageModel)
		{
			return false;
		}

		$accessProvider = new BitrixImAccessChatAuthProvider;
		$rightsManager = $driver->getRightsManager();

		$accessCodes = [];
		// allow for access code `CHATxxx`
		$accessCodes[] = [
			'ACCESS_CODE' => $accessProvider->generateAccessCode($chatId),
			'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_EDIT)
		];
		if ($chatType === IMV2Chat::IM_TYPE_OPEN)
		{
			// allow reading for top department, access code `DRxxx`
			$departmentCode = self::GetTopDepartmentCode();
			if ($departmentCode)
			{
				$accessCodes[] = Array(
					'ACCESS_CODE' => $departmentCode,
					'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_READ)
				);
			}
		}

		$folderModel = $storageModel->addFolder(
			[
				'NAME' => 'chat'.$chatId,
				'CREATED_BY' => self::GetUserId()
			],
			$accessCodes,
			true
		);
		if ($folderModel)
		{
			IMModelChatTable::update($chatId, ['DISK_FOLDER_ID' => $folderModel->getId()]);

			$accessProvider->updateChatCodesByRelations($chatId);
		}
	}

	return $folderModel;
}