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

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

	$query = array_change_key_case($query, CASE_UPPER);

	$eventName = ToUpper($query['EVENT']);
	$eventType = ToLower($query['EVENT_TYPE']);
	$eventCallback = $query['HANDLER'];

	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 unbinding requires administrator access rights');
		}

		$eventCallback = '';
	}
	elseif($eventCallback == '')
	{
		throw new ArgumentNullException("HANDLER");
	}

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

	$filter = array(
		'=APP_ID' => $clientInfo["ID"],
		'=EVENT_NAME' => $eventName,
		'=EVENT_HANDLER' => $eventCallback,
	);

	if($eventType === EventTable::TYPE_OFFLINE)
	{
		$authData = $server->getAuthData();
		$filter['=CONNECTOR_ID'] = isset($authData['auth_connector']) ? $authData['auth_connector'] : '';
	}
	else
	{
		if(isset($query['AUTH_TYPE']))
		{
			if(!CRestUtil::isAdmin() && $query['AUTH_TYPE'] !== intval($USER->GetID()))
			{
				throw new AccessException('Event unbinding with AUTH_TYPE requires administrator access rights');
			}

			$filter['=USER_ID'] = intval($query['AUTH_TYPE']);
		}
		elseif(!CRestUtil::isAdmin())
		{
			$filter['=USER_ID'] = intval($USER->GetID());
		}
	}

	$dbRes = EventTable::getList(array(
		'filter' => $filter,
		'select' => ['ID']
	));

	$cnt = 0;
	while($eventInfo = $dbRes->fetch())
	{
		$result = EventTable::delete($eventInfo["ID"]);
		if($result->isSuccess())
		{
			// we shouldn't make Unbind here, it'll be done during the first event call
			$cnt++;
		}
	}

	return array('count' => $cnt);
}