• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/controller/sharingajax.php
  • Класс: BitrixCalendarControllerSharingAjax
  • Вызов: SharingAjax::saveEventAction
public function saveEventAction(): array
{
	$connection = Application::getConnection();
	$sqlHelper = $connection->getSqlHelper();

	$result = [];
	$request = $this->getRequest();

	$userName = $sqlHelper->forSql(trim($request['userName'] ?? ''));
	$userContact = $sqlHelper->forSql(trim($request['userContact'] ?? ''));
	$parentLinkHash = $sqlHelper->forSql(trim($request['parentLinkHash'] ?? ''));
	$ownerId = (int)($request['ownerId'] ?? null);
	$ownerCreated = ($request['ownerCreated'] ?? null) === 'true';

	$contactDataError = !SharingSharingEventManager::validateContactData($userContact);
	$contactNameError = !SharingSharingEventManager::validateContactName($userName);
	if ($contactDataError || $contactNameError)
	{
		$this->addError(new Error(Loc::getMessage('EC_SHARINGAJAX_INCORRECT_CONTACT_DATA')));

		return [
			'contactDataError' => $contactDataError,
			'contactNameError' => $contactNameError,
		];
	}

	/** @var SharingLinkLink $link */
	$link = $this->getSharingLinkFactory()->getLinkByHash($parentLinkHash);

	if (
		!$link
		|| !$link->isActive()
		|| $link->getObjectType() !== SharingLinkHelper::USER_SHARING_TYPE
		|| $link->getObjectId() !== $ownerId
	)
	{
		$this->addError(new Error('Link not found'));

		return $result;
	}

	$userParams = [
		'NAME' => $userName,
		'CONTACT_DATA' => $userContact,
	];
	if ($ownerCreated)
	{
		$userId = SharingUser::getInstance()->getAnonymousUserForOwner($userParams);
	}
	else
	{
		$userId = SharingUser::getInstance()->login(true, $userParams);
	}


	if (!$userId)
	{
		$this->addError(new Error(Loc::getMessage('EC_SHARINGAJAX_USER_NOT_FOUND')));

		return $result;
	}

	$eventData = SharingSharingEventManager::getEventDataFromRequest($request);
	$eventData['eventName'] = SharingSharingEventManager::getSharingEventNameByUserName($userName);

	$event = SharingSharingEventManager::prepareEventForSave($eventData, $userId);

	$sharingEventManager = new SharingSharingEventManager($event, $userId, $ownerId, $parentLinkHash);
	$eventCreateResult = $sharingEventManager->createEvent(false, $userParams['NAME']);

	if ($errors = $eventCreateResult->getErrors())
	{
		$this->addError($errors[0]);

		return $result;
	}

	/** @var Event $event */
	$event = $eventCreateResult->getData()['event'];
	/** @var SharingLinkEventLink $eventLink */
	$eventLink = $eventCreateResult->getData()['eventLink'];

	// Auto-accepting meeting for manager
	CCalendarEvent::SetMeetingStatus([
		'eventId' => $event->getId(),
		'userId' => $ownerId,
		'status' => 'Y',
		'hostNotification' => false,
		'sharingAutoAccept' => true,
	]);

	/** @var Event $event */
	$event = (new MappersFactory())->getEvent()->getById($event->getId());

	$notificationService = null;
	if (SharingEventManager::isEmailCorrect($userContact))
	{
		$notificationService = (new SharingNotificationMail())
			->setEventLink($eventLink)
			->setEvent($event)
		;
	}

	if ($notificationService !== null)
	{
		$notificationService->notifyAboutMeetingStatus($userContact);
	}

	return [
		'eventId' => $event->getId(),
		'eventName' => $event->getName(),
		'eventLinkId' => $eventLink->getId(),
		'eventLinkHash' => $eventLink->getHash(),
		'eventLinkShortUrl' => SharingHelper::getShortUrl($eventLink->getUrl()),
	];
}