• Модуль: rest
  • Путь к файлу: ~/bitrix/modules/rest/lib/api/event.php
  • Класс: BitrixRestApiEvent
  • Вызов: Event::eventBind
static function eventBind($query, $n, CRestServer $server)
{
	global $USER;

	if($server->getAuthType() !== BitrixRestOAuthAuth::AUTH_TYPE)
	{
		throw new AuthTypeException();
	}

	$query = array_change_key_case($query, CASE_UPPER);

	$eventName = ToUpper($query['EVENT']);
	$eventType = ToLower($query['EVENT_TYPE']);
	$eventUser = intval($query['AUTH_TYPE']);
	$eventCallback = $query['HANDLER'];
	$options = is_array($query['OPTIONS']) ? $query['OPTIONS'] : [];

	if($eventUser > 0)
	{
		if(!CRestUtil::isAdmin() && $eventUser !== intval($USER->GetID()))
		{
			throw new AccessException('Event binding with AUTH_TYPE requires administrator access rights');
		}
	}
	elseif(!CRestUtil::isAdmin())
	{
		$eventUser = intval($USER->GetID());
	}

	$authData = $server->getAuthData();

	$connectorId = isset($authData['auth_connector']) ? $authData['auth_connector'] : '';

	if($eventName == '')
	{
		throw new ArgumentNullException("EVENT");
	}

	if($eventType <> '')
	{
		if(!in_array($eventType, array(EventTable::TYPE_ONLINE, EventTable::TYPE_OFFLINE)))
		{
			throw new ArgumentException('Value must be one of {'.EventTable::TYPE_ONLINE.'|'.EventTable::TYPE_OFFLINE.'}', 'EVENT_TYPE');
		}
	}
	else
	{
		$eventType = EventTable::TYPE_ONLINE;
	}

	if($eventType === EventTable::TYPE_OFFLINE)
	{
		if(!CRestUtil::isAdmin())
		{
			throw new AccessException('Offline events binding requires administrator access rights');
		}

		$eventCallback = '';
		$eventUser = 0;
	}
	elseif($eventCallback == '' && $eventType === EventTable::TYPE_ONLINE)
	{
		throw new ArgumentNullException("HANDLER");
	}

	$clientInfo = AppTable::getByClientId($server->getClientId());

	if($eventCallback == '' || HandlerHelper::checkCallback($eventCallback, $clientInfo))
	{
		$scopeList = $server->getAuthScope();
		$scopeList[] = CRestUtil::GLOBAL_SCOPE;

		$serviceDescription = $server->getServiceDescription();

		foreach($scopeList as $scope)
		{
			if(
				isset($serviceDescription[$scope])
				&& is_array($serviceDescription[$scope][CRestUtil::EVENTS])
				&& array_key_exists($eventName, $serviceDescription[$scope][CRestUtil::EVENTS])
			)
			{
				$eventInfo = $serviceDescription[$scope][CRestUtil::EVENTS][$eventName];
				if(is_array($eventInfo))
				{
					$eventHandlerFields = array(
						'APP_ID' => $clientInfo['ID'],
						'EVENT_NAME' => $eventName,
						'EVENT_HANDLER' => $eventCallback,
						'CONNECTOR_ID' => $connectorId,
						'OPTIONS' => []
					);

					if($eventUser > 0)
					{
						$eventHandlerFields['USER_ID'] = $eventUser;
					}

					if (
						$eventCallback === ''
						&& isset($eventInfo[3]['disableOffline'])
						&& $eventInfo[3]['disableOffline'] === true
					)
					{
						throw new RestException('Offline event cannot be registered for this event.', RestException::ERROR_ARGUMENT);
					}

					if (!empty($options) && isset($eventInfo[3]['allowOptions']) && is_array($eventInfo[3]['allowOptions']))
					{
						foreach ($eventInfo[3]['allowOptions'] as $code => $type)
						{
							if (isset($options[$code]))
							{
								if ($type === 'int')
								{
									$eventHandlerFields['OPTIONS'][$code] = (int) $options[$code];
								}
								elseif($type === 'str' && is_string($options[$code]))
								{
									$eventHandlerFields['OPTIONS'][$code] = $options[$code];
								}
							}
						}
					}

					$result = EventTable::add($eventHandlerFields);
					if($result->isSuccess())
					{
						BitrixRestEventSender::bind($eventInfo[0], $eventInfo[1]);
					}
					else
					{
						$errorMessage = $result->getErrorMessages();
						throw new RestException('Unable to set event handler: '.implode('. ', $errorMessage), RestException::ERROR_CORE);
					}
				}

				return true;
			}
		}

		throw new RestException('Event not found', EventTable::ERROR_EVENT_NOT_FOUND);
	}
	else
	{
		return false;
	}
}