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/ilovecveti.ru/bitrix/modules/calendar/lib/sharing/link/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/calendar/lib/sharing/link/factory.php
<?php
namespace Bitrix\Calendar\Sharing\Link;

use Bitrix\Calendar\Internals\SharingLinkTable;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\Type\DateTime;
use Bitrix\Calendar\Sharing;
use Bitrix\Calendar\Sharing\Link\Member\Member;
use Bitrix\Main\UserTable;

class Factory
{
	protected static ?Factory $instance = null;
	protected static ?UserLinkMapper $userLinkMapper = null;
	protected static ?EventLinkMapper $eventLinkMapper = null;
	protected static ?CrmDealLinkMapper $crmDealLinkMapper = null;
	protected static ?GroupLinkMapper $groupLinkMapper = null;

	protected const SELECT = ['*', 'MEMBERS', 'MEMBERS.USER', 'MEMBERS.IMAGE'];

	/**
	 * @return Factory
	 */
	public static function getInstance(): Factory
	{
		if (self::$instance === null)
		{
			self::$instance = new self();
		}

		return self::$instance;
	}


	/**
	 * returns public link data in array by hash
	 *
	 * @param string $hash
	 * @return array|null
	 * @throws \Bitrix\Main\ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getLinkArrayByHash(string $hash): ?array
	{
		$sharingLink = $this->getLinkByHash($hash);

		if ($sharingLink instanceof CrmDealLink)
		{
			return $this->getCrmDealLinkMapper()->convertToArray($sharingLink);
		}

		if ($sharingLink instanceof UserLink)
		{
			return $this->getUserLinkMapper()->convertToArray($sharingLink);
		}

		if ($sharingLink instanceof EventLink)
		{
			return $this->getEventLinkMapper()->convertToArray($sharingLink);
		}

		if ($sharingLink instanceof GroupLink)
		{
			return $this->getGroupLinkMapper()->convertToArray($sharingLink);
		}

		return null;
	}

	/**
	 * gets public link object by hash
	 *
	 * @param string $hash
	 * @return \Bitrix\Calendar\Core\Base\EntityInterface|null
	 * @throws \Bitrix\Main\ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getLinkByHash(string $hash): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$sharingLinkEO = SharingLinkTable::query()
			->setSelect(self::SELECT)
			->where('HASH', $hash)
			->exec()->fetchObject()
		;

		if ($sharingLinkEO === null)
		{
			return null;
		}

		$mapper = match ($sharingLinkEO->getObjectType())
		{
			Helper::USER_SHARING_TYPE => $this->getUserLinkMapper(),
			Helper::EVENT_SHARING_TYPE => $this->getEventLinkMapper(),
			Helper::CRM_DEAL_SHARING_TYPE => $this->getCrmDealLinkMapper(),
			Helper::GROUP_SHARING_TYPE => $this->getGroupLinkMapper(),
			default => null,
		};

		return $mapper?->getByEntityObject($sharingLinkEO);
	}

	/**
	 * @param int $userId
	 * @return array
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getAllUserLinks(int $userId): array
	{
		return $this->getUserLinkMapper()->getMap([
			'=OBJECT_ID' => $userId,
			'=OBJECT_TYPE' => Helper::USER_SHARING_TYPE,
			'=ACTIVE' => 'Y',
		])->getCollection();
	}

	/**
	 * gets user public links by user id
	 *
	 * @param $userId
	 * @return array
	 * @throws \Bitrix\Main\ArgumentException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getUserLinks($userId): array
	{
		return $this->getUserLinkMapper()->getMap([
			'=OBJECT_ID' => $userId,
			'=OBJECT_TYPE' => Helper::USER_SHARING_TYPE,
			'=ACTIVE' => 'Y',
			'=MEMBERS_HASH' => null,
		])->getCollection();
	}

	/**
	 * gets user joint public links by user id
	 *
	 * @param $userId
	 * @return array
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getUserJointLinks($userId): array
	{
		return $this->getUserLinkMapper()->getMap([
			'=OBJECT_ID' => $userId,
			'=OBJECT_TYPE' => Helper::USER_SHARING_TYPE,
			'=ACTIVE' => 'Y',
			'!=MEMBERS_HASH' => null,
		])->getCollection();
	}

	public function getGroupLinks(int $groupId, int $userId): array
	{
		return $this->getGroupLinkMapper()->getMap([
			'=OBJECT_ID' => $groupId,
			'=HOST_ID' => $userId,
			'=OBJECT_TYPE' => Helper::GROUP_SHARING_TYPE,
			'=ACTIVE' => 'Y',
			'=MEMBERS_HASH' => null,
		])->getCollection();
	}

	/**
	 * creates user public link for calendar sharing by user id
	 *
	 * @param int $userId
	 * @return $this
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public function createUserLink(int $userId): self
	{
		$userLink = (new UserLink())
			->setUserId($userId)
			->setActive(true)
			->setFrequentUse(1)
		;

		$rule = (new Rule\Factory())->getRuleBySharingLink($userLink);
		$userLink->setSharingRule($rule);

		$this->getUserLinkMapper()->create($userLink);

		return $this;
	}

	/**
	 * creates public link for sharing event
	 *
	 * @param int $eventId
	 * @param int $ownerId
	 * @param int $hostId
	 * @param string $parentLinkHash
	 * @param DateTime|null $expireDate
	 * @return EventLink
	 * @throws ArgumentException
	 */
	public function createEventLink(array $params): EventLink
	{
		$eventLink = (new EventLink())
			->setEventId($params['eventId'])
			->setOwnerId($params['ownerId'])
			->setHostId($params['hostId'])
			->setParentLinkHash($params['parentLinkHash'])
			->setActive(true)
			->setDateExpire($params['expiryDate'] ?? null)
			->setExternalUserName($params['externalUserName'] ?? null)
		;

		$this->getEventLinkMapper()->create($eventLink);

		return $eventLink;
	}

	/**
	 * creates crm deal public link for calendar sharing
	 *
	 * @param int $ownerId
	 * @param int $entityId
	 * @param int|null $contactId
	 * @param int|null $contactType
	 * @param string|null $channelId
	 * @param string|null $senderId
	 * @return CrmDealLink
	 * @throws ArgumentException
	 */
	public function createCrmDealLink(
		int $ownerId,
		int $entityId,
		?array $memberIds = [],
		?int $contactId = null,
		?int $contactType = null,
		?string $channelId = null,
		?string $senderId = null,
	): CrmDealLink
	{
		$memberHash = $this->generateMembersHash($ownerId, $memberIds);

		$crmDealLink = (new CrmDealLink())
			->setOwnerId($ownerId)
			->setEntityId($entityId)
			->setContactType($contactType)
			->setContactId($contactId)
			->setChannelId($channelId)
			->setSenderId($senderId)
			->setActive(true)
			->setDateExpire(
				Sharing\Helper::createSharingLinkExpireDate(
					new DateTime(),
					Sharing\Link\Helper::CRM_DEAL_SHARING_TYPE
				)
			)
			->setFrequentUse(1)
		;

		if ($memberHash !== null)
		{
			$crmDealLink
				->setMembers($this->getMembersFromIds($memberIds))
				->setMembersHash($memberHash)
			;
		}

		$rule = (new Rule\Factory())->getRuleBySharingLink($crmDealLink);
		$crmDealLink->setSharingRule($rule);

		$this->getCrmDealLinkMapper()->create($crmDealLink);

		return $crmDealLink;
	}

	public function createUserJointLink(int $userId, array $memberIds): \Bitrix\Calendar\Core\Base\EntityInterface
	{
		$memberHash = $this->generateMembersHash($userId, $memberIds);

		if ($existJointLink = $this->getJointLinkByMembersHash($memberHash))
		{
			SharingLinkTable::update($existJointLink->getId(), [
				'FREQUENT_USE' => $existJointLink->getFrequentUse() + 1,
			]);

			return $existJointLink;
		}

		$userJointLink = (new UserLink())
			->setUserId($userId)
			->setActive(true)
			->setFrequentUse(1)
		;

		if ($memberHash !== null)
		{
			$userJointLink
				->setMembers($this->getMembersFromIds($memberIds))
				->setMembersHash($memberHash)
			;
		}

		$this->getUserLinkMapper()->create($userJointLink);

		return $userJointLink;
	}

	public function createCrmDealJointLink(CrmDealLink $crmDealLink, array $memberIds): CrmDealLink
	{
		$crmDealLink
			->setActive(true)
			->setMembers($this->getMembersFromIds($memberIds))
			->setFrequentUse(1)
		;

		$this->getCrmDealLinkMapper()->create($crmDealLink);

		return $crmDealLink;
	}

	public function createGroupLink(int $groupId, int $userId): self
	{
		$groupLink = (new GroupLink())
			->setObjectId($groupId)
			->setHostId($userId)
			->setActive(true)
			->setFrequentUse(1)
		;

		$rule = (new Rule\Factory())->getRuleBySharingLink($groupLink);
		$groupLink->setSharingRule($rule);

		$this->getGroupLinkMapper()->create($groupLink);

		return $this;
	}

	public function createGroupJointLink(int $groupId, array $memberIds): \Bitrix\Calendar\Core\Base\EntityInterface
	{
		$memberHash = $this->generateMembersHash($groupId, $memberIds, 'group');

		if ($existJointLink = $this->getGroupJointLinkByMembersHash($groupId, $memberHash))
		{
			SharingLinkTable::update($existJointLink->getId(), [
				'DATE_EXPIRE' => Sharing\Helper::createSharingLinkExpireDate(
					new DateTime(),
					Sharing\Link\Helper::GROUP_SHARING_TYPE
				),
			]);

			return $existJointLink;
		}

		$groupJointLink = (new GroupLink())
			->setObjectId($groupId)
			->setActive(true)
			->setFrequentUse(1)
			->setDateExpire(
				Sharing\Helper::createSharingLinkExpireDate(
					new DateTime(),
					Sharing\Link\Helper::GROUP_SHARING_TYPE
				)
			)
		;

		if ($memberHash !== null)
		{
			$groupJointLink
				->setMembers($this->getMembersFromIds($memberIds))
				->setMembersHash($memberHash)
			;
		}

		$this->getGroupLinkMapper()->create($groupJointLink);

		return $groupJointLink;
	}

	private function getMembersFromIds(array $memberIds): array
	{
		$memberIds = array_map(static function ($memberId) {
			return (int)$memberId;
		}, $memberIds);

		$result = [];
		$users = UserTable::query()
			->whereIn('ID', $memberIds)
			->where('IS_REAL_USER', 'Y')
			->setSelect(['NAME', 'LAST_NAME', 'ID', 'PERSONAL_PHOTO'])
			->exec()
			->fetchCollection()
		;

		foreach ($users as $user)
		{
			$avatar = '';
			if (!empty($user->getPersonalPhoto()))
			{
				$file = \CFile::ResizeImageGet(
					$user->getPersonalPhoto(),
					['width' => 100, 'height' => 100],
					BX_RESIZE_IMAGE_EXACT,
				);
				$avatar = !empty($file['src']) ? $file['src'] : '';
			}

			$member = new Member();
			$member
				->setId($user->getId())
				->setName($user->getName())
				->setLastName($user->getLastName())
				->setAvatar($avatar)
			;
			$result[] = $member;
		}

		return $result;
	}

	public function generateMembersHash(int $userId, array $memberIds, string $prefix = ''): ?string
	{
		if (empty($memberIds))
		{
			return null;
		}

		$memberIds = array_map(static function ($memberId) {
			return (int)$memberId;
		}, $memberIds);

		sort($memberIds);
		$implodedUsers = $prefix . implode('|', $memberIds) . '|' .  $userId;

		return md5($implodedUsers);
	}

	/**
	 * gets calendar sharing event public link by eventId
	 *
	 * @param int $eventId
	 * @return \Bitrix\Calendar\Core\Base\EntityInterface|null
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getEventLinkByEventId(int $eventId, bool $searchActiveOnly = true): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$query = SharingLinkTable::query()
			->setSelect(['*'])
			->where('OBJECT_ID', $eventId)
			->where('OBJECT_TYPE', Helper::EVENT_SHARING_TYPE)
		;

		if ($searchActiveOnly)
		{
			$query->where('ACTIVE', 'Y');
		}

		$sharingLinkEO = $query->exec()->fetchObject();

		if ($sharingLinkEO === null)
		{
			return null;
		}

		return $this->getEventLinkMapper()->getByEntityObject($sharingLinkEO);
	}

	/**
	 * gets calendar sharing event public link by enetId
	 *
	 * @param int $eventId
	 * @return \Bitrix\Calendar\Core\Base\EntityInterface|null
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getDeletedEventLinkByEventId(int $eventId): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$sharingLinkEO = SharingLinkTable::query()
			->setSelect(self::SELECT)
			->where('OBJECT_ID', $eventId)
			->where('OBJECT_TYPE', Helper::EVENT_SHARING_TYPE)
			->exec()->fetchObject();

		if ($sharingLinkEO === null)
		{
			return null;
		}

		return $this->getEventLinkMapper()->getByEntityObject($sharingLinkEO);
	}

	/**
	 * gets crm deal public link for calendar sharing
	 *
	 * @param int $entityId
	 * @param int $ownerId
	 * @param int|null $contactId
	 * @param int|null $contactType
	 * @return \Bitrix\Calendar\Core\Base\EntityInterface|null
	 * @throws ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getCrmDealLink(
		int $entityId,
		int $ownerId,
		?array $memberIds = [],
		?int $contactId = null,
		?int $contactType = null,
	): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$memberHash = $this->generateMembersHash($ownerId, $memberIds);

		$sharingLinkEO = SharingLinkTable::query()
			->setSelect(self::SELECT)
			->where('OBJECT_ID', $entityId)
			->where('OBJECT_TYPE', Helper::CRM_DEAL_SHARING_TYPE)
			->where('ACTIVE', 'Y')
			->where('OWNER_ID', $ownerId)
			->where('CONTACT_ID', $contactId)
			->where('CONTACT_TYPE', $contactType)
			->where('DATE_CREATE', '>=', (new DateTime())->setTime(0, 0))
			->where('MEMBERS_HASH', $memberHash)
			->exec()->fetchObject();

		if ($sharingLinkEO === null)
		{
			return null;
		}

		return $this->getCrmDealLinkMapper()->getByEntityObject($sharingLinkEO);
	}

	public function getLastSentCrmDealLink(int $ownerId): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$sharingLinkEO = SharingLinkTable::query()
			->setSelect(['*'])
			->where('OBJECT_TYPE', Helper::CRM_DEAL_SHARING_TYPE)
			->where('OWNER_ID', $ownerId)
			->whereNotNull('CONTACT_ID')
			->whereNotNull('CONTACT_TYPE')
			->setOrder(['ID' => 'desc'])
			->setLimit(1)
			->exec()->fetchObject();

		if ($sharingLinkEO === null)
		{
			return null;
		}

		return $this->getCrmDealLinkMapper()->getByEntityObject($sharingLinkEO);
	}

	public function getJointLinkByMembersHash(string $membersHash): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$sharingLinkEO = SharingLinkTable::query()
			->setSelect(self::SELECT)
			->where('MEMBERS_HASH', $membersHash)
			->where('ACTIVE', 'Y')
			->where('OBJECT_TYPE', Helper::USER_SHARING_TYPE)
			->exec()->fetchObject()
		;

		if ($sharingLinkEO === null)
		{
			return null;
		}

		return $this->getUserLinkMapper()->getByEntityObject($sharingLinkEO);
	}

	public function getGroupJointLinkByMembersHash(int $groupId, string $membersHash): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$sharingLinkEO = SharingLinkTable::query()
			->setSelect(self::SELECT)
			->where('OBJECT_ID', $groupId)
			->where('MEMBERS_HASH', $membersHash)
			->where('ACTIVE', 'Y')
			->where('OBJECT_TYPE', Helper::GROUP_SHARING_TYPE)
			->exec()->fetchObject()
		;

		if ($sharingLinkEO === null)
		{
			return null;
		}

		return $this->getGroupLinkMapper()->getByEntityObject($sharingLinkEO);
	}

	public function getParentLinkByConferenceId(string $conferenceId): ?Joint\JointLink
	{
		$entityObject = SharingLinkTable::query()
			->setSelect(['PARENT_LINK_HASH'])
			->where('CONFERENCE_ID', $conferenceId)
			->exec()->fetchObject()
		;

		if (is_null($entityObject))
		{
			return null;
		}

		$parentLink = $this->getLinkByHash($entityObject->getParentLinkHash());

		return $parentLink instanceof Joint\JointLink ? $parentLink : null;
	}

	public function getCrmDealJointLink(
		int $entityId,
		int $ownerId,
		?int $contactId = null,
		?int $contactType = null
	): ?\Bitrix\Calendar\Core\Base\EntityInterface
	{
		$sharingLinkEO = SharingLinkTable::query()
			->setSelect(self::SELECT)
			->where('OBJECT_ID', $entityId)
			->where('OBJECT_TYPE', Helper::CRM_DEAL_SHARING_TYPE)
			->where('ACTIVE', 'Y')
			->where('OWNER_ID', $ownerId)
			->where('CONTACT_ID', $contactId)
			->where('CONTACT_TYPE', $contactType)
			->whereNotNull('MEMBERS.MEMBER_ID')
			->exec()->fetchObject();

		if ($sharingLinkEO === null)
		{
			return null;
		}

		return $this->getCrmDealLinkMapper()->getByEntityObject($sharingLinkEO);
	}

	private function getUserLinkMapper(): UserLinkMapper
	{
		if (self::$userLinkMapper === null)
		{
			self::$userLinkMapper = new UserLinkMapper();
		}

		return self::$userLinkMapper;
	}

	private function getEventLinkMapper(): EventLinkMapper
	{
		if (self::$eventLinkMapper === null)
		{
			self::$eventLinkMapper = new EventLinkMapper();
		}

		return self::$eventLinkMapper;
	}

	private function getCrmDealLinkMapper(): CrmDealLinkMapper
	{
		if (self::$crmDealLinkMapper === null)
		{
			self::$crmDealLinkMapper = new CrmDealLinkMapper();
		}

		return self::$crmDealLinkMapper;
	}

	private function getGroupLinkMapper(): GroupLinkMapper
	{
		if (self::$groupLinkMapper === null)
		{
			self::$groupLinkMapper = new GroupLinkMapper();
		}

		return self::$groupLinkMapper;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit