403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/im/lib/V2/Link/Task/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/im/lib/V2/Link/Task/TaskService.php
<?php

namespace Bitrix\Im\V2\Link\Task;

use Bitrix\Disk\Uf\FileUserType;
use Bitrix\Im\Dialog;
use Bitrix\Im\Model\LinkTaskTable;
use Bitrix\Im\V2\Chat;
use Bitrix\Im\V2\Common\ContextCustomer;
use Bitrix\Im\V2\Link\File\TemporaryFileService;
use Bitrix\Im\V2\Link\Push;
use Bitrix\Im\V2\Message;
use Bitrix\Im\V2\Entity\Task\TaskError;
use Bitrix\Im\V2\RelationCollection;
use Bitrix\Im\V2\Result;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Security\Sign\Signer;
use Bitrix\Main\Web\Json;
use Bitrix\Main\Web\Uri;
use Bitrix\Tasks\Slider\Path\PathMaker;
use Bitrix\Tasks\Slider\Path\TaskPathMaker;

class TaskService
{
	use ContextCustomer;

	protected const SIGNATURE_SALT = 'task_service_salt';
	protected const ADD_TASK_EVENT = 'taskAdd';
	protected const UPDATE_TASK_EVENT = 'taskUpdate';
	protected const DELETE_TASK_EVENT = 'taskDelete';

	public function registerTask(int $chatId, int $messageId, \Bitrix\Im\V2\Entity\Task\TaskItem $taskItem): Result
	{
		$result = new Result();

		$userId = $this->getContext()->getUserId();

		$taskLink = new TaskItem();
		$taskLink->setEntity($taskItem)->setChatId($chatId)->setAuthorId($userId);

		if ($messageId !== 0)
		{
			$taskLink->setMessageId($messageId);
		}

		$sendMessageResult = $this->sendMessageAboutTask($taskLink, $chatId);

		if (!$sendMessageResult->isSuccess())
		{
			$result->addErrors($sendMessageResult->getErrors());
		}

		$systemMessageId = $sendMessageResult->getResult();

		$taskLink->setMessageId($messageId ?: $systemMessageId);
		$saveResult = $taskLink->save();

		if (!$saveResult->isSuccess())
		{
			return $result->addErrors($saveResult->getErrors());
		}

		Push::getInstance()
			->setContext($this->context)
			->sendFull($taskLink, self::ADD_TASK_EVENT, ['RECIPIENT' => $taskItem->getMembersIds()])
		;

		return $result;
	}

	public function unregisterTaskByEntity(\Bitrix\Im\V2\Entity\Task\TaskItem $taskEntity, bool $saveDelete): Result
	{
		$taskItem = TaskItem::getByEntity($taskEntity);

		if ($taskItem === null)
		{
			return new Result();
		}

		return $this->unregisterTask($taskItem, $saveDelete);
	}

	public function unregisterTask(TaskItem $task, bool $saveDelete): Result
	{
		Push::getInstance()
			->setContext($this->context)
			->sendIdOnly($task, self::DELETE_TASK_EVENT, ['CHAT_ID' => $task->getChatId()])
		;
		if (!$saveDelete)
		{
			$task->delete();
			TaskItem::cleanCache($task->getEntityId() ?? 0);
		}

		return new Result();
	}

	public function updateTask(\Bitrix\Im\V2\Entity\Task\TaskItem $taskEntity): Result
	{
		$taskItem = TaskItem::getByEntity($taskEntity);
		if ($taskItem === null)
		{
			return new Result();
		}

		Push::getInstance()
			->setContext($this->context)
			->sendFull($taskItem, self::UPDATE_TASK_EVENT, ['RECIPIENT' => $taskEntity->getMembersIds()])
		;

		return new Result();
	}

	public function updateTaskLink(TaskItem $taskItem): Result
	{
		$result = new Result();

		$saveResult = $taskItem->save();

		if (!$saveResult->isSuccess())
		{
			return $result->addErrors($saveResult->getErrors());
		}

		Push::getInstance()
			->setContext($this->context)
			->sendFull($taskItem, self::UPDATE_TASK_EVENT, ['RECIPIENT' => $taskItem->getEntity()->getMembersIds()])
		;

		return $result;
	}

	public function updateTaskLinks(TaskCollection $taskCollection): Result
	{
		$result = new Result();

		if ($taskCollection->count() === 0)
		{
			return $result;
		}

		$saveResult = $taskCollection->save();

		if (!$saveResult->isSuccess())
		{
			return $result->addErrors($saveResult->getErrors());
		}

		$taskCollection->fillEntities();

		foreach ($taskCollection as $task)
		{
			$pushRecipient = ['RECIPIENT' => $task->getEntity()->getMembersIds()];
			Push::getInstance()
				->setContext($this->context)
				->sendFull($task, self::UPDATE_TASK_EVENT, $pushRecipient)
			;
		}

		return $result;
	}

	public function deleteLinkByTaskId(int $taskId): Result
	{
		LinkTaskTable::deleteByFilter(['=TASK_ID' => $taskId]);

		return new Result();
	}

	public function prepareDataForCreateSlider(Chat $chat, ?Message $message = null): Result
	{
		$result = new Result();

		if (!Loader::includeModule('tasks'))
		{
			return $result->addError(new TaskError(TaskError::TASKS_NOT_INSTALLED));
		}

		$userId = $this->getContext()->getUserId();

		$chat->setContext($this->context);

		$data = ['PARAMS' => []];

		$taskPath = (new TaskPathMaker(0, PathMaker::EDIT_ACTION, $userId))->makeEntityPath();
		$link = new Uri($taskPath);
		$link->addParams([
			'ta_sec' => 'chat',
			'ta_el' => 'create_button',
		]);

		$data['LINK'] = $link->getUri();

		$data['PARAMS']['RESPONSIBLE_ID'] = $userId;
		$data['PARAMS']['IM_CHAT_ID'] = $chat->getChatId();

		if ($chat->getEntityType() !== 'SONET_GROUP')
		{
			$data['PARAMS']['AUDITORS'] = implode(",", $this->getAuditors($chat));
		}

		if ($chat->getEntityType() === 'SONET_GROUP')
		{
			$data['PARAMS']['GROUP_ID'] = (int)$chat->getEntityId();
		}

		if ($chat instanceof Chat\OpenLineChat && Loader::includeModule('crm'))
		{
			$entityData = explode('|', $chat->getEntityData1() ?? '');
			if (isset($entityData[0], $entityData[1], $entityData[2]) && $entityData[0] === 'Y')
			{
				$crmType = \CCrmOwnerTypeAbbr::ResolveByTypeID(\CCrmOwnerType::ResolveID($entityData[1]));
				$data['PARAMS']['UF_CRM_TASK'] = $crmType.'_'.$entityData[2];
			}
		}

		if (isset($message))
		{
			$message->setContext($this->context);
			$data['PARAMS']['DESCRIPTION'] = \CIMShare::PrepareText([
				'CHAT_ID' => $chat->getChatId(),
				'MESSAGE_ID' => $message->getMessageId(),
				'MESSAGE_TYPE' => $chat->getType(),
				'MESSAGE' => $message->getMessage(),
				'AUTHOR_ID' => $message->getAuthorId(),
				'FILES' => $this->getFilesForPrepareText($message)
			]);

			$fileIds = $this->getFilesIdsForTaskFromMessage($message);

			if (!empty($fileIds))
			{
				$diskFileUFCode = \Bitrix\Tasks\Integration\Disk\UserField::getMainSysUFCode();
				$data['PARAMS'][$diskFileUFCode] = $fileIds;
				$signer = new Signer();
				$data['PARAMS'][$diskFileUFCode . '_SIGN'] = $signer->sign(Json::encode($fileIds), static::SIGNATURE_SALT);
				$data['PARAMS'][$diskFileUFCode . '_DATA'] = $this->getFileDataForTask($message);
			}

			$data['PARAMS']['IM_MESSAGE_ID'] = $message->getMessageId();
		}

		return $result->setResult($data);
	}

	protected function sendMessageAboutTask(TaskItem $taskLink, int $chatId): Result
	{
		//todo: Replace with new API
		$dialogId = Dialog::getDialogId($chatId);
		$authorId = $this->getContext()->getUserId();

		$messageId = \CIMChat::AddMessage([
			'DIALOG_ID' => $dialogId,
			'SYSTEM' => 'Y',
			'MESSAGE' => $this->getMessageText($taskLink),
			'FROM_USER_ID' => $authorId,
			'PARAMS' => ['CLASS' => "bx-messenger-content-item-system"],
			'URL_PREVIEW' => 'N',
			'SKIP_CONNECTOR' => 'Y',
			'SKIP_COMMAND' => 'Y',
			'SILENT_CONNECTOR' => 'Y',
			'SKIP_URL_INDEX' => 'Y',
		]);

		$result = new Result();

		if ($messageId === false)
		{
			return $result->addError(new TaskError(TaskError::ADD_TASK_MESSAGE_FAILED));
		}

		return $result->setResult($messageId);
	}

	/**
	 * @param Message $message
	 * @return string[]
	 */
	protected function getFilesIdsForTaskFromMessage(Message $message): array
	{
		$copies = $message->getFiles()->copyToOwnUploadedFiles()->getResult();
		if (!isset($copies))
		{
			return [];
		}

		$copies->addToTmp(TemporaryFileService::TASK_SOURCE);
		$newIds = [];

		foreach ($copies as $copy)
		{
			$newIds[] = FileUserType::NEW_FILE_PREFIX . $copy->getId();
		}

		return $newIds;
	}

	protected function getFileDataForTask(Message $message): array
	{
		$copies = $message->getFiles()->copyToOwnUploadedFiles()->getResult();
		if (!isset($copies))
		{
			return [];
		}

		$files = [];

		foreach ($copies as $copy)
		{
			$data = $copy->toRestFormat();

			$files[] = [
				'id' => FileUserType::NEW_FILE_PREFIX . $copy->getId(),
				'objectId' => $data['viewerAttrs']['objectId'],
				'name' => $data['name'],
				'type' => $data['extension'],
				'url' => $data['urlShow'],
				'height' => $data['image']['height'] ?? 0,
				'width' => $data['image']['width'] ?? 0,
				'preview_url' => $data['urlPreview'],
			];
		}

		return $files;
	}

	protected function getAuditors(Chat $chat): array
	{
		return RelationCollection::find(
			[
				'ACTIVE' => true,
				'ONLY_INTERNAL_TYPE' => true,
				'CHAT_ID' => $chat->getId(),
				'IS_HIDDEN' => false,
				'ONLY_INTRANET' => true,
				'!USER_ID' => $this->getContext()->getUserId()
			],
			limit: 50,
			select: ['ID', 'USER_ID', 'CHAT_ID']
		)->getUserIds();
	}

	protected function getFilesForPrepareText(Message $message): array
	{
		$files = $message->getFiles();
		$filesForPrepare = [];

		foreach ($files as $file)
		{
			$filesForPrepare[] = ['name' => $file->getDiskFile()->getName()];
		}

		return $filesForPrepare;
	}

	protected function getMessageText(TaskItem $task): string
	{
		$genderModifier = ($this->getContext()->getUser()->getGender() === 'F') ? '_F' : '';

		if ($task->getMessageId() !== null)
		{
			$text = (new Message($task->getMessageId()))->getQuotedMessage() . "\n";
			$text .= Loc::getMessage(
				'IM_CHAT_TASK_REGISTER_FROM_MESSAGE_NOTIFICATION' . $genderModifier . '_MSGVER_1',
				[
					'#LINK#' => $task->getEntity()->getUrl(),
					'#USER_ID#' => $this->getContext()->getUserId(),
					'#MESSAGE_ID#' => $task->getMessageId(),
					'#DIALOG_ID#' => Chat::getInstance($task->getChatId())->getDialogContextId(),
				]
			);

			return $text;
		}
		return Loc::getMessage(
			'IM_CHAT_TASK_REGISTER_FROM_CHAT_NOTIFICATION' . $genderModifier . '_MSGVER_1',
			[
				'#LINK#' => $task->getEntity()->getUrl(),
				'#USER_ID#' => $this->getContext()->getUserId(),
				'#TASK_TITLE#' => $task->getEntity()->getTitle(),
			]
		);
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit