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/calendar/lib/core/mappers/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/calendar/lib/core/mappers/event.php
<?php

namespace Bitrix\Calendar\Core\Mappers;

use Bitrix\Calendar\Core;
use Bitrix\Calendar\Internals\EO_Event;
use Bitrix\Calendar\Internals\EventTable;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\Error;
use Bitrix\Main\ObjectException;
use Bitrix\Main\ObjectPropertyException;
use Bitrix\Main\ORM\Data\AddResult;
use Bitrix\Main\ORM\Query\Result;
use Bitrix\Main\ORM\Query\Query;
use Bitrix\Main\SystemException;
use CCalendar;

class Event extends Mapper
{
	private const JS_DATE_FORMAT = 'D M d Y';
	private const JS_DATE_TIME_FORMAT = 'D M d Y H:i:s';

	/**
	 * @param array $ids
	 * @param int $ownerId
	 * @param array $fields
	 *
	 * @return Core\Event\EventCollection
	 *
	 * @throws ArgumentException
	 * @throws ObjectPropertyException
	 * @throws SystemException
	 * @deprecated is it unused?
	 */
	public function getCollectionByIds(array $ids, int $ownerId, array $fields = ['*']): Core\Event\EventCollection
	{
		$eventDM = EventTable::query()
			->whereIn('ID', $ids)
			->where('OWNER_ID', $ownerId)
			->setSelect($fields)
			->exec()
		;

		$collection = new Core\Event\EventCollection();

		while ($event = $eventDM->fetch())
		{
			$collection->add((new Core\Builders\EventBuilderFromArray($event))->build());
		}

		return $collection;
	}

	/**
	 * @param $entity
	 * @param array $params
	 * @return Core\Base\EntityInterface|null
	 * @throws ArgumentException
	 * @throws Core\Event\Tools\PropertyException
	 */
	protected function createEntity($entity, array $params = []): ?Core\Base\EntityInterface
	{
		$entity->setDateModified(new Core\Base\Date());
		$result = $this->save($entity, $params);

		if ($result->isSuccess())
		{
			return $this->getById($result->getId());
		}

		return null;
	}

	/**
	 * @param $entity
	 * @param array $params
	 * @return Core\Base\EntityInterface|null
	 * @throws ArgumentException
	 * @throws Core\Base\BaseException
	 * @throws Core\Event\Tools\PropertyException
	 */
	protected function updateEntity($entity, array $params = []): ?Core\Base\EntityInterface
	{
		$entity->setDateModified(new Core\Base\Date());
		$data = $this->convertToArray($entity);

		$params = array_merge($params, [
			'arFields' => $data,
			'originalFrom' => $params['originalFrom'] ?? null,
			'checkPermission' => false,
			'userId' => $params['userId']
				?? ($entity->getOwner() ? $entity->getOwner()->getId() : null),
		]);

		$result = CCalendar::SaveEvent($params);
		$id = (is_array($result) && isset($result['id']))
			? (int)$result['id']
			: $result
		;

		if (is_numeric($id))
		{
			return $this->getById((int)$id);
		}

		return null;
	}

	/**
	 * @param Core\Event\Event $entity
	 * @param array $params
	 *
	 * @return Core\Base\EntityInterface|null
	 *
	 * @throws Core\Base\BaseException
	 * @throws Core\Event\Tools\PropertyException
	 */
	protected function deleteEntity(Core\Base\EntityInterface $entity, array $params): ?Core\Base\EntityInterface
	{
		$params = array_merge($params,[
			'Event' => $this->prepareArrayForDelete($entity),
			'id' => $entity->getId(),
			'checkPermissions' => false,
			'bMarkDeleted' => true,
			'userId' => $params['userId']
				?? $entity->getOwner() ? $entity->getOwner()?->getId() : null,
		]);

		if (CCalendar::DeleteEvent($entity->getId(), true, $params) && !empty($params['bMarkDeleted']))
		{
			$entity->setIsDeleted(true);

			return $entity;
		}

		return null;
	}

	/**
	 * @param Core\Event\Event $event
	 *
	 * @return array|null
	 */
	private function prepareArrayForDelete(Core\Event\Event $event): ?array
	{
		try
		{
			return $this->convertToArray($event);
		}
		catch(\Throwable $e)
		{
		    return null;
		}
	}

	/**
	 * @param Core\Event\Event $event
	 * @param array $params
	 *
	 * @return AddResult
	 *
	 * @throws Core\Event\Tools\PropertyException
	 */
	private function save(Core\Event\Event $event, array $params = []): AddResult
	{
		$data = $this->convertToArray($event);

		$params = array_merge($params, [
			'arFields' => $data,
			'checkPermissions' => false,
			'userId' => $event->getOwner() ? $event->getOwner()->getId() : null, // todo how get userId ?
		]);

		$id = CCalendar::SaveEvent($params);

		$result = new AddResult();
		if ($id)
		{
			$result->setPrimary($id);
		}
		else
		{
			$result->addError(new Error('Error of create event'));
		}

		return $result;
	}

	/**
	 * @param Core\Event\Properties\RemindCollection $collection
	 * @param Core\Base\Date $start
	 *
	 * @return array
	 *
	 * @throws Core\Event\Tools\PropertyException
	 */
	private function prepareReminders(Core\Event\Properties\RemindCollection $collection, Core\Base\Date $start): array
	{
		$result = [];
		$collection->setEventStart(clone $start);
		$collection->deDuplicate();
		/** @var Core\Event\Properties\Remind $reminder */
		foreach ($collection->getCollection() as $reminder)
		{
			$remind = [
				'before' => null,
				'count' => null,
				'time' => null,
				'value' => null,
			];
			if ($reminder->getDaysBefore() !== null)
			{
				$remind['type'] = Core\Event\Properties\Remind::UNIT_DAY_BEFORE;
				$remind['before'] = $reminder->getDaysBefore();
				$remind['time'] = $reminder->getTimeOffset();
			}
			elseif ($reminder->isSimpleType())
			{
				$remind['type'] = str_replace('minutes', 'min', $reminder->getUnits()) ;
				$remind['count'] = $reminder->getTime();
			}
			else
			{
				$remind['type'] = Core\Event\Properties\Remind::UNIT_DATES;
				$remind['value'] = $reminder->getSpecificTime();
			}
			$result[] = $remind;
		}

		return $result;
	}

	/**
	 * @param Core\Event\Event $event
	 *
	 * @return array
	 *
	 * @throws Core\Event\Tools\PropertyException
	 */
	public function convertToArray(Core\Event\Event $event): array
	{
		$jsFormat = $event->isFullDayEvent() ? self::JS_DATE_FORMAT : self::JS_DATE_TIME_FORMAT;

		return [
			'ID'                 => $event->getId(),
			'ACTIVE'             => $event->isActive() ? 'Y' : 'N',
			'DELETED'            => $event->isDeleted() ? 'Y' : 'N',
			'DT_SKIP_TIME'       => $event->isFullDayEvent() ? 'Y' : 'N',
			'DAV_XML_ID'         => $event->getUid(),
			'TZ_FROM'            => (string)$event->getStartTimeZone(),
			'TZ_TO'              => (string)$event->getEndTimeZone(),
			'NAME'               => $event->getName(),
			'DATE_FROM'          => (string)$event->getStart(),
			'DATE_TO'            => (string)$event->getEnd(),
			'ORIGINAL_DATE_FROM' => $this->prepareOriginalDateFrom($event),
			'DESCRIPTION'        => $event->getDescription(),
			'ACCESSIBILITY'      => $event->getAccessibility(),
			'PRIVATE_EVENT'      => $event->isPrivate(),
			'IMPORTANCE'         => $event->getImportance(),
			'OWNER_ID'           => $event->getOwner()?->getId(),
			'CREATED_BY'         => $event->getOwner()?->getId(),
			'CAL_TYPE'           => $event->getCalendarType(),
			'EVENT_TYPE'         => $event->getSpecialLabel(),
			'LOCATION'           => $event->getLocation() ? $event->getLocation()->getActualLocation() : '',
			'REMIND'             => ($event->getRemindCollection() && $event->getRemindCollection()->count())
				? $this->prepareReminders($event->getRemindCollection(), $event->getStart())
				: null,
			'RRULE'              => $event->isRecurrence()
				? $event->getRecurringRule()?->toArray()
				: null,
			'EXDATE'             => $event->getExcludedDateCollection()?->toString(),
			'RECURRENCE_ID'      => $event->getRecurrenceId(),
			'IS_MEETING'         => $event->isMeeting(),
			'MEETING_STATUS'     => $event->getMeetingStatus(),
			'MEETING_HOST'       => $event->getEventHost()?->getId(),
			'MEETING'            => $event->getMeetingDescription()?->getFields(),
			'ATTENDEES_CODES'    => $event->getAttendeesCollection()
				? $event->getAttendeesCollection()->getFields()['attendeesCodesCollection']
				: null,
			'SECTIONS' 			 => $event->getSection() ? [$event->getSection()->getId()] : null,
			'SECTION_ID'         => $event->getSection() ? $event->getSection()->getId() : null,
			'RELATIONS' 		 => $event->getRelations()?->getFields(),
			'DATE_CREATE' => $event->getDateCreate()?->toString(),
			'TIMESTAMP_X' => $event->getDateModified()?->toString(),
			'VERSION' => $event->getVersion(),
			'COLOR' => $event->getColor(),
			'DT_LENGTH' => $event->getDtLength(),
			'DATE_FROM_FORMATTED' => $event->getStart()->format($jsFormat),
			'DATE_TO_FORMATTED' => $event->getEnd()->format($jsFormat),
		];
	}

	/**
	 * @param array $filter
	 *
	 * @return object|null
	 *
	 * @throws ArgumentException
	 * @throws ObjectPropertyException
	 * @throws SystemException
	 */
	protected function getOneEntityByFilter(array $filter): ?object
	{
		$eventData = EventTable::query()
		   ->setFilter($filter)
		   ->setSelect(['*'])
		   ->fetchObject()
		;

		try
		{
			if ($eventData)
			{
				return $this->convertToObject($eventData);
			}

		}
		catch (\Exception)
		{
			return null;
		}

		return null;
	}

	/**
	 * @param EO_Event $objectEO
	 *
	 * @return Core\Section\Section
	 */
	protected function convertToObject($objectEO): Core\Base\EntityInterface
	{
		return (new Core\Builders\EventBuilderFromEntityObject($objectEO))->build();
	}

	/**
	 * @return string
	 */
	protected function getEntityName(): string
	{
		return 'event';
	}

	/**
	 * @return string
	 */
	protected function getMapClass(): string
	{
		return Core\Event\EventMap::class;
	}

	/**
	 * @param array $params
	 *
	 * @return Result
	 *
	 * @throws ArgumentException
	 * @throws ObjectPropertyException
	 * @throws SystemException
	 */
	protected function getDataManagerResult(array $params): Result
	{
		$params['select'] = $params['select'] ?? ["*"];
		return EventTable::getList($params);
	}
	/**
	 * @throws ObjectException
	 * @throws ObjectPropertyException
	 * @throws ArgumentException
	 * @throws SystemException
	 */
	public function getMapFullChainByParentId(int $id, int $ownerId, array $fields = ['*']): Core\Event\EventMap
	{
		$eventDM = EventTable::query()
			->where(Query::filter()
				->logic('or')
				->where('PARENT_ID', $id)
				->where('RECURRENCE_ID', $id)
			)
			->where('OWNER_ID', $ownerId)
			->setSelect($fields)
			->exec()
		;

		$eventMap = new Core\Event\EventMap();

		while ($event = $eventDM->fetch())
		{
			$eventMap->add((new Core\Builders\EventBuilderFromArray($event))->build(), (int)$event['ID']);
		}

		return $eventMap;
	}

	/**
	 * @param int $id
	 * @param array|null $additionalParams
	 *
	 * @return Core\Event\Event|null
	 * @throws ArgumentException
	 * @throws ObjectPropertyException
	 * @throws SystemException
	 */
	public function getEntity(int $id, ?array $additionalParams = null): ?Core\Event\Event
	{
		$eventDM = EventTable::query()
			->where('ID', $id)
		;

		if ($additionalParams)
		{
			//filter
			if (isset($additionalParams['filter'])
				&& is_iterable($additionalParams['filter'])
			)
			{
				foreach ($additionalParams['filter'] as $filter)
				{
					$eventDM->addFilter($filter['key'], $filter['value']);
				}
			}

			//select
			if (isset($additionalParams['fields'])
				&& is_array($additionalParams['fields'])
			)
			{
				$eventDM->setSelect($additionalParams['fields']);
			}
			else
			{
				$eventDM->setSelect(['*']);
			}
		}
		else
		{
			$eventDM->setSelect(['*']);
		}

		$event = $eventDM->exec()->fetchObject();

		return $event
				? (new Core\Builders\EventBuilderFromEntityObject($event))->build()
				: null
		;
	}

	/**
	 * @param Core\Event\Event $event
	 * @param array $fields
	 * @return Core\Event\Event
	 * @throws Core\Base\BaseException
	 */
	public function patch(Core\Event\Event $event, array $fields): Core\Event\Event
	{
		$eventFields = [
			'EXDATE' => (string)$event->getExcludedDateCollection(),
		];

		$result = EventTable::update(
			$event->getId(),
			array_intersect_key($eventFields, array_flip($fields))
		);

		if ($result->isSuccess())
		{
			return $event;
		}

		throw new Core\Base\BaseException('do not patch event');
	}

	/**
	 * @param array $fields
	 *
	 * @return Core\Event\Event|mixed
	 *
	 * @throws ArgumentException
	 */
	public function getByArray(array $fields)
	{
		if ($this->getCacheMap()->has($fields['ID']))
		{
			return $this->getCacheMap()->getItem($fields['ID']);
		}

		$entity = $this->convertFromArray($fields);
		$this->getCacheMap()->add($entity, $entity->getId());

		return $entity;
	}

	/**
	 * @param array $fields
	 *
	 * @return Core\Event\Event
	 */
	protected function convertFromArray(array $fields): Core\Event\Event
	{
		return (new Core\Builders\EventBuilderFromArray($fields))->build();
	}

	/**
	 * @return string
	 */
	protected function getEntityClass(): string
	{
		return Core\Event\Event::class;
	}

	/**
	 * @param Core\Event\Event $event
	 *
	 * @return string|null
	 */
	private function prepareOriginalDateFrom(Core\Event\Event $event): ?string
	{
		$result = null;
		if ($event->getOriginalDateFrom())
		{
			if ($event->getStartTimeZone())
			{
				$event->getOriginalDateFrom()->setTimezone($event->getStartTimeZone()->getTimeZone());
			}
			$result = (string)$event->getOriginalDateFrom();
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit