Your IP : 18.217.166.156


Current Path : /home/bitrix/initial_sites/ballu.in.ua_1/bitrix/modules/mail/lib/helper/
Upload File :
Current File : /home/bitrix/initial_sites/ballu.in.ua_1/bitrix/modules/mail/lib/helper/messageeventmanager.php

<?php
namespace Bitrix\Mail\Helper;

use Bitrix\Mail\MailMessageTable;
use Bitrix\Mail\MailMessageUidTable;
use Bitrix\Main\Event;
use Bitrix\Main\Loader;
use Bitrix\Main\Type\DateTime;

class MessageEventManager
{
	public static function onMailMessageDeleted(Event $event)
	{
		$manager = new static();
		$manager->processOnMailMessageDeletedEvent($event);
		return $manager;
	}

	private function processOnMailMessageDeletedEvent(Event $event)
	{
		$params = $event->getParameters();
		$filter = empty($params['DELETED_BY_FILTER']) ? [] : $params['DELETED_BY_FILTER'];
		$fieldsData = empty($params['MAIL_FIELDS_DATA']) ? [] : $params['MAIL_FIELDS_DATA'];
		$this->handleRemovedEvent($fieldsData, $filter);
	}

	public static function onMailMessageModified(Event $event)
	{
		$manager = new static();
		$manager->processOnMailMessageModified($event);
		return $manager;
	}

	private function processOnMailMessageModified(Event $event)
	{
		$params = $event->getParameters();
		$updatedFieldValues = empty($params['UPDATED_FIELDS_VALUES']) ? [] : $params['UPDATED_FIELDS_VALUES'];
		$fieldsData = empty($params['MAIL_FIELDS_DATA']) ? [] : $params['MAIL_FIELDS_DATA'];
		$filter = empty($params['UPDATED_BY_FILTER']) ? [] : $params['UPDATED_BY_FILTER'];
		if (!empty($updatedFieldValues) && isset($updatedFieldValues['IS_SEEN']))
		{
			$fieldsData = $this->getMailsFieldsData($fieldsData, ['HEADER_MD5', 'MAILBOX_USER_ID', 'IS_SEEN'], $filter);
			$this->sendMessageModifiedEvent($fieldsData);
		}
		if (!empty($updatedFieldValues) && isset($updatedFieldValues['DIR_MD5']))
		{
			$folderHash = empty($updatedFieldValues['DIR_MD5']) ? null : $updatedFieldValues['DIR_MD5'];
			$mailboxOptions = !empty($fieldsData[0]) && !empty($fieldsData[0]['MAILBOX_OPTIONS']) ? $fieldsData[0]['MAILBOX_OPTIONS'] : [];
			if (!empty($folderHash) && !empty($mailboxOptions))
			{
				$isTrashFolder = $folderHash === MessageFolder::getFolderHashByType(MessageFolder::TRASH, $mailboxOptions);
				$isSpamFolder = $folderHash === MessageFolder::getFolderHashByType(MessageFolder::SPAM, $mailboxOptions);
				$folderName = MessageFolder::getFolderNameByHash($folderHash, $mailboxOptions);
				$isDisabledFolder = MessageFolder::isDisabledFolder($folderName, $mailboxOptions);

				if ($isTrashFolder || $isSpamFolder || $isDisabledFolder)
				{
					$this->handleRemovedEvent($fieldsData, $filter);
				}
			}
		}
	}

	protected function sendMessageModifiedEvent($fieldsData)
	{
		foreach ($fieldsData as $fields)
		{
			$event = new Event(
				'mail', 'OnMessageModified',
				[
					'user' => $fields['MAILBOX_USER_ID'],
					'hash' => $fields['HEADER_MD5'],
					'seen' => $fields['IS_SEEN'] === 'Y',
				]
			);
			$event->send();
		}
	}

	private function handleRemovedEvent($fieldsData, $filter)
	{
		$fieldsData = $this->getMailsFieldsData($fieldsData, ['HEADER_MD5', 'MAILBOX_USER_ID'], $filter);
		$this->sendMessageDeletedEvent($fieldsData);
	}

	protected function sendMessageDeletedEvent($fieldsData)
	{
		foreach ($fieldsData as $fields)
		{
			$event = new Event(
				'mail', 'OnMessageObsolete',
				[
					'user' => $fields['MAILBOX_USER_ID'],
					'hash' => $fields['HEADER_MD5'],
				]
			);
			$event->send();
		}
	}

	private function getMailsFieldsData($eventData, $requiredKeys, $filter)
	{
		$fieldsData = array_filter($eventData, function ($item) use ($requiredKeys)
		{
			$hasAllKeys = true;
			foreach ($requiredKeys as $requiredKey)
			{
				$hasAllKeys = $hasAllKeys && isset($item[$requiredKey]);
			}
			return $hasAllKeys;
		});

		if (empty($fieldsData) && !empty($filter))
		{
			$fieldsData = $this->getMailMessagesList($filter);
		}
		$results = [];
		foreach ($fieldsData as $index => $mailFieldsData)
		{
			$results[$mailFieldsData['HEADER_MD5']] = $mailFieldsData;
		}
		return $results;
	}

	protected function getMailMessagesList($filter)
	{
		$dateLastMonth = new DateTime();
		$dateLastMonth->add('-1 MONTH');
		return MailMessageUidTable::getList([
				'select' => ['HEADER_MD5', 'IS_SEEN', 'MAILBOX_USER_ID' => 'MAILBOX.USER_ID'],
				'filter' => array_merge($filter, [
					'>=INTERNALDATE' => $dateLastMonth,
				]),
			]
		)->fetchAll();
	}

	/**
	 * @param array $data
	 * @return array
	 * @throws \Bitrix\Main\ObjectException
	 * @throws \Exception
	 */
	public static function onMailEventMailRead(array $data)
	{
		$messageId = $data['msgid'];
		if($messageId)
		{
			$message = MailMessageTable::getList([
				'select' => [
					'OPTIONS', 'ID', 'READ_CONFIRMED',
				],
				'filter' => [
					'=MSG_ID' => $messageId,
					'READ_CONFIRMED' => null,
				]
			])->fetch();
			if($message)
			{
				$readTime = new DateTime();
				$result = MailMessageTable::update($message['ID'], [
					'READ_CONFIRMED' => $readTime,
				]);
				if($result->isSuccess())
				{
					if(Loader::includeModule("pull"))
					{
						\CPullWatch::addToStack(static::getPullTagName($message['ID']), [
							'module_id' => 'mail',
							'command' => 'onMessageRead',
							'params' => [
								'messageId' => $message['ID'],
								'readTime' => $readTime->getTimestamp(),
							],
						]);
					}
				}
			}
		}

		return $data;
	}

	public static function getPullTagName($messageId)
	{
		return 'MAILMESSAGEREADED'.$messageId;
	}
}