Your IP : 3.145.89.175


Current Path : /home/bitrix/ext_www/ballu.in.ua/bitrix/modules/mail/lib/messageview/
Upload File :
Current File : /home/bitrix/ext_www/ballu.in.ua/bitrix/modules/mail/lib/messageview/avatarmanager.php

<?php
namespace Bitrix\Mail\MessageView;

use Bitrix\Main;
use Bitrix\Mail\Internals\MailContactTable;

class AvatarManager
{
	private $currentUserId;

	public function __construct($currentUserId = null)
	{
		$this->currentUserId = $currentUserId;
	}

	public function getAvatarParamsFromEmails($messages)
	{
		return $this->getAvatarParamsFromMessagesHeaders([['FIELD_FROM' => implode(',', $messages)]]);
	}

	public function getAvatarParamsFromMessagesHeaders($messages)
	{
		$mailsNames = $this->getEmailsNames($messages);

		$mailContacts = $this->fetchMailContacts(array_map(
			function ($item)
			{
				return $item['email'];
			},
			$mailsNames
		));
		$mailContacts = array_combine(array_column($mailContacts, 'EMAIL'), array_values($mailContacts));
		$mailContacts = $this->fillFileIdColumn($mailContacts);

		foreach ($mailsNames as $email => $data)
		{
			if (!empty($mailContacts[$email]))
			{
				if ((!$data['name'] || $data['name'] === $data['email']) &&
					($mailContacts[$email]['NAME'] && $mailContacts[$email]['NAME'] !== $mailContacts[$email]['EMAIL']))
				{
					$mailsNames[$email]['name'] = $mailContacts[$email]['NAME'];
				}
				$mailsNames[$email]['mailContact'] = $mailContacts[$email];
			}
			else
			{
				$mailsNames[$email]['mailContact'] = [
					'EMAIL' => $data['email'],
					'NAME' => $data['name'],
				];
			}
		}
		return $mailsNames;
	}

	private function getEmailsNames($messages)
	{
		$emailNames = [];
		foreach ($messages as $index => $message)
		{
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_FROM']));
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_TO']));
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_CC']));
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_BCC']));
		}
		$emailNames = $this->getBestNameChoices($emailNames);

		return $emailNames;
	}

	private function getBestNameChoices($emailNames)
	{
		$results = [];
		$bestNames = [];
		foreach ($emailNames as $index => $data)
		{
			if (!isset($bestNames[$data['email']]))
			{
				$bestNames[$data['email']] = $data['name'];
				$results[$data['email']] = [
					'email' => $data['email'],
					'name' => $data['name'],
				];
				continue;
			}
			$newName = $data['name'];
			$oldName = $bestNames[$data['email']];
			if (!$oldName || $oldName == $data['email'])
			{
				$bestNames[$data['email']] = $newName;
				$results[$data['email']] = [
					'email' => $data['email'],
					'name' => $newName,
				];
			}
		}

		return $results;
	}

	private function extractMailsNamesFrom($parsedListOfEmails)
	{
		$emailNames = [];
		if ($parsedListOfEmails)
		{
			$mailsCopy = explode(',', $parsedListOfEmails);
			foreach ($mailsCopy as $mailCopy)
			{
				if (trim($mailCopy))
				{
					$address = new Main\Mail\Address($mailCopy);
					if ($address->validate())
					{
						$emailNames[] = [
							'email' => $address->getEmail(),
							'name' => $address->getName() ?: $address->getEmail(),
						];
					}
				}
			}
		}
		return $emailNames;
	}

	private function fillFileIdColumn($mailContacts)
	{
		foreach ($mailContacts as $mail => $mailContact)
		{
			if (!empty($mailContacts[$mail]['AVATAR_ID']))
			{
				$mailContacts[$mail]['FILE_ID'] = $mailContacts[$mail]['AVATAR_ID'];
			}
		}
		return $mailContacts;
	}

	protected function fetchMailContacts($emails)
	{
		if (empty($emails))
		{
			return [];
		}
		return MailContactTable::query()
			->registerRuntimeField('', new Main\Entity\ReferenceField('ref', Main\UserTable::class, ['=this.EMAIL' => 'ref.EMAIL'], ['join_type' => 'LEFT']))
			->addSelect('NAME')
			->addSelect('EMAIL')
			->addSelect('ICON')
			->addSelect('FILE_ID')
			->addSelect('ref.PERSONAL_PHOTO', 'AVATAR_ID')
			->where('USER_ID', $this->currentUserId)
			->whereIn('EMAIL', $emails)
			->exec()
			->fetchAll();
	}
}