5use Bitrix\Bitrix24\Feature;
36 \CRestUtil::GLOBAL_SCOPE =>
array(
37 'events' =>
array(__CLASS__,
'eventsList'),
38 'event.bind' =>
array(__CLASS__,
'eventBind'),
39 'event.unbind' =>
array(__CLASS__,
'eventUnBind'),
40 'event.get' =>
array(__CLASS__,
'eventGet'),
41 'event.offline.get' =>
array(__CLASS__,
'eventOfflineGet'),
42 'event.offline.clear' =>
array(__CLASS__,
'eventOfflineClear'),
43 'event.offline.error' =>
array(__CLASS__,
'eventOfflineError'),
44 'event.offline.list' =>
array(__CLASS__,
'eventOfflineList'),
46 'event.test' =>
array(
47 'callback' =>
array(__CLASS__,
'eventTest'),
50 \CRestUtil::EVENTS =>
array(
51 'onOfflineEvent' =>
array(
53 'onAfterOfflineEventCall',
54 array(EventOfflineTable::class,
'prepareOfflineEvent'),
56 "sendRefreshToken" =>
true,
57 "disableOffline" =>
true,
95 $scopeList =
array(\CRestUtil::GLOBAL_SCOPE);
100 if(isset(
$query[
'SCOPE']))
109 $scopeList = array_keys($serviceDescription);
114 $scopeList[] = \CRestUtil::GLOBAL_SCOPE;
117 foreach ($serviceDescription as $scope => $scopeMethods)
119 if(in_array($scope, $scopeList) && isset($scopeMethods[\CRestUtil::EVENTS]))
121 $result = array_merge(
$result, array_keys($scopeMethods[\CRestUtil::EVENTS]));
165 $eventName = mb_strtoupper(
$query[
'EVENT'] ??
'');
166 $eventType = mb_strtolower(
$query[
'EVENT_TYPE'] ??
'');
167 $eventUser = intval(
$query[
'AUTH_TYPE'] ??
null);
168 $eventCallback =
$query[
'HANDLER'] ??
'';
173 if(!\CRestUtil::isAdmin() && $eventUser !== intval(
$USER->GetID()))
175 throw new AccessException(
'Event binding with AUTH_TYPE requires administrator access rights');
178 elseif(!\CRestUtil::isAdmin())
180 $eventUser = intval(
$USER->GetID());
185 $connectorId = isset($authData[
'auth_connector']) ? $authData[
'auth_connector'] :
'';
206 if(!\CRestUtil::isAdmin())
208 throw new AccessException(
'Offline events binding requires administrator access rights');
224 $scopeList[] = \CRestUtil::GLOBAL_SCOPE;
228 foreach($scopeList as $scope)
231 isset($serviceDescription[$scope])
232 && is_array($serviceDescription[$scope][\CRestUtil::EVENTS])
233 && array_key_exists($eventName, $serviceDescription[$scope][\CRestUtil::EVENTS])
236 $eventInfo = $serviceDescription[$scope][\CRestUtil::EVENTS][$eventName];
237 if(is_array($eventInfo))
239 $eventHandlerFields =
array(
240 'APP_ID' => $clientInfo[
'ID'],
241 'EVENT_NAME' => $eventName,
242 'EVENT_HANDLER' => $eventCallback,
243 'CONNECTOR_ID' => $connectorId,
249 $eventHandlerFields[
'USER_ID'] = $eventUser;
253 $eventCallback ===
''
254 && isset($eventInfo[3][
'disableOffline'])
255 && $eventInfo[3][
'disableOffline'] ===
true
261 if (!empty(
$options) && isset($eventInfo[3][
'allowOptions']) && is_array($eventInfo[3][
'allowOptions']))
263 foreach ($eventInfo[3][
'allowOptions'] as
$code =>
$type)
279 $lockKey = implode(
'|', [$clientInfo[
'ID'], $eventName, $eventCallback, $connectorId, $eventUser]);
281 if (Application::getConnection()->lock($lockKey))
283 $result = EventTable::add($eventHandlerFields);
284 Application::getConnection()->unlock($lockKey);
288 $result = (
new Result())->addError(
new Error(
'Process of binding the handler has already started'));
353 $eventName = mb_strtoupper(
$query[
'EVENT'] ??
'');
354 $eventType = mb_strtolower(
$query[
'EVENT_TYPE'] ??
'');
355 $eventCallback =
$query[
'HANDLER'] ??
'';
376 if(!\CRestUtil::isAdmin())
378 throw new AccessException(
'Offline events unbinding requires administrator access rights');
383 elseif($eventCallback ==
'')
391 '=APP_ID' => $clientInfo[
"ID"],
392 '=EVENT_NAME' => $eventName,
393 '=EVENT_HANDLER' => $eventCallback,
399 $filter[
'=CONNECTOR_ID'] = isset($authData[
'auth_connector']) ? $authData[
'auth_connector'] :
'';
403 if(isset(
$query[
'AUTH_TYPE']))
405 if(!\CRestUtil::isAdmin() &&
$query[
'AUTH_TYPE'] !== intval(
$USER->GetID()))
407 throw new AccessException(
'Event unbinding with AUTH_TYPE requires administrator access rights');
412 elseif(!\CRestUtil::isAdmin())
424 while($eventInfo =
$dbRes->fetch())
426 $result = EventTable::delete($eventInfo[
"ID"]);
434 return array(
'count' => $cnt);
452 "=APP_ID" => $clientInfo[
"ID"],
455 if(!\CRestUtil::isAdmin())
466 while($eventHandler =
$dbRes->fetch())
468 if($eventHandler[
'EVENT_HANDLER'] <>
'')
471 "event" => $eventHandler[
'EVENT_NAME'],
472 "handler" => $eventHandler[
'EVENT_HANDLER'],
473 "auth_type" => $eventHandler[
'USER_ID'],
480 "event" => $eventHandler[
'EVENT_NAME'],
481 "connector_id" => $eventHandler[
'CONNECTOR_ID'] ===
null ?
'' : $eventHandler[
'CONNECTOR_ID'],
503 "APP_ID" => $clientInfo[
"ID"],
519 if (!\CRestUtil::isAdmin())
526 $clearEvents = !isset(
$query[
'clear']) ? 1 : intval(
$query[
'clear']);
527 $processId = isset(
$query[
'process_id']) ? trim(
$query[
'process_id']) : null;
529 if (!$clearEvents && !static::isExtendedModeEnabled())
531 throw new LicenseException(
'extended offline events handling');
538 $getErrors = isset(
$query[
'error']) && intval(
$query[
'error']) === 1;
541 $connectorId = isset($authData[
'auth_connector']) ? $authData[
'auth_connector'] :
'';
543 $returnProcessId = !$clearEvents;
547 throw new Exceptions\ArgumentException(
'Value must be positive integer',
'LIMIT');
550 $queryFilter = static::sanitizeFilter(
$filter);
556 $queryFilter[
'=APP_ID'] = $clientInfo[
'ID'];
557 $queryFilter[
'=CONNECTOR_ID'] = $connectorId;
558 $queryFilter[
'=ERROR'] = $getErrors ? 1 : 0;
560 if ($processId ===
null)
562 $queryFilter[
'=PROCESS_ID'] =
'';
567 $returnProcessId =
true;
570 $queryFilter[
'=PROCESS_ID'] = $processId;
574 'ID',
'TIMESTAMP_X',
'EVENT_NAME',
'EVENT_DATA',
'EVENT_ADDITIONAL',
'MESSAGE_ID'
576 'filter' => $queryFilter,
586 $ts =
$event[
'TIMESTAMP_X'];
588 $event[
'TIMESTAMP_X'] = \CRestUtil::convertDateTime($ts->toString());
590 if (isset(
$event[
'EVENT_ADDITIONAL'][Auth::PARAM_LOCAL_USER]))
592 $event[
'EVENT_ADDITIONAL'] = [
593 'user_id' =>
$event[
'EVENT_ADDITIONAL'][Auth::PARAM_LOCAL_USER],
606 'process_id' => $returnProcessId ? $processId :
null,
618 if (!\CRestUtil::isAdmin())
625 $processId = isset(
$query[
'process_id']) ? trim(
$query[
'process_id']) :
null;
628 $connectorId = isset($authData[
'auth_connector']) ? $authData[
'auth_connector'] :
'';
630 if ($processId ===
null)
637 if (isset(
$query[
'message_id']))
640 if (!is_array(
$query[
'message_id']))
664 if (!is_array(
$query[
'id']))
669 foreach(
$query[
'id'] as $id)
695 if(!\CRestUtil::isAdmin())
702 $processId = isset(
$query[
'process_id']) ? trim(
$query[
'process_id']) :
null;
706 $connectorId = isset($authData[
'auth_connector']) ? $authData[
'auth_connector'] :
'';
708 if($processId ===
null)
715 throw new ArgumentException(
'Value must be array of MESSAGE_ID values',
'message_id');
734 if(!\CRestUtil::isAdmin())
745 $connectorId = isset($authData[
'auth_connector']) ? $authData[
'auth_connector'] :
'';
747 $queryFilter = static::sanitizeFilter(
$filter,
array(
'ID',
'TIMESTAMP_X',
'EVENT_NAME',
'MESSAGE_ID',
'PROCESS_ID',
'ERROR'));
749 $order = static::sanitizeOrder(
$order,
array(
'ID',
'TIMESTAMP_X',
'EVENT_NAME',
'MESSAGE_ID',
'PROCESS_ID',
'ERROR'));
753 $queryFilter[
'=APP_ID'] = $clientInfo[
'ID'];
755 $getEventQuery = EventOfflineTable::query();
757 if ($connectorId ===
'')
759 $getEventQuery->where(
'CONNECTOR_ID',
'');
763 $queryFilter[
'=CONNECTOR_ID'] = $connectorId;
769 ->setSelect([
'ID',
'TIMESTAMP_X',
'EVENT_NAME',
'EVENT_DATA',
'EVENT_ADDITIONAL',
'MESSAGE_ID',
'PROCESS_ID',
'ERROR'])
770 ->setFilter($queryFilter)
776 $dbRes = $getEventQuery->exec();
781 $ts =
$event[
'TIMESTAMP_X'];
783 $event[
'TIMESTAMP_X'] = \CRestUtil::convertDateTime($ts->toString());
785 if (isset(
$event[
'EVENT_ADDITIONAL'][Auth::PARAM_LOCAL_USER]))
787 $event[
'EVENT_ADDITIONAL'] = [
788 'user_id' =>
$event[
'EVENT_ADDITIONAL'][Auth::PARAM_LOCAL_USER],
796 "count" => $getEventQuery->queryCountTotal(),
803 static $defaultFields =
array(
'ID',
'TIMESTAMP_X',
'EVENT_NAME',
'MESSAGE_ID');
805 if($availableFields ===
null)
807 $availableFields = $defaultFields;
810 return parent::sanitizeFilter(
813 function($field, $value)
819 return DateTime::createFromUserTime(\CRestUtil::unConvertDateTime($value));
830 static $defaultFields =
array(
'ID',
'TIMESTAMP_X',
'EVENT_NAME',
'MESSAGE_ID');
832 if($availableFields ===
null)
834 $availableFields = $defaultFields;
837 return parent::sanitizeOrder(
$order, $availableFields);
842 return !Loader::includeModule(
'bitrix24')
843 || Feature::isFeatureEnabled(static::FEATURE_EXTENDED_MODE);
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
static sanitizeOrder($order, array $availableFields=null)
static onRestServiceBuildDescription()
const FEATURE_EXTENDED_MODE
static eventsList($query, $n, \CRestServer $server)
static sanitizeFilter($filter, array $availableFields=null, $valueCallback=null, array $availableOperations=null)
static eventBind($query, $n, \CRestServer $server)
static eventUnbind($query, $n, \CRestServer $server)
static eventTest($query, $n, \CRestServer $server)
static eventGet($query, $n, \CRestServer $server)
static isExtendedModeEnabled()
static eventOfflineClear($query, $n, \CRestServer $server)
static eventOfflineError($query, $n, \CRestServer $server)
static getByClientId($clientId)
static bind($moduleId, $eventName)
static clearEvents($processId, $appId, $connectorId, $listIds=false)
static clearEventsByMessageId($processId, $appId, $connectorId, $listIds=false)
static markError($processId, $appId, $connectorId, array $listIds)
static markEvents($filter, $order, $limit)
const ERROR_EVENT_NOT_FOUND
static checkCallback($handlerUrl, $appInfo=array(), $checkInstallUrl=true)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
ExecuteModuleEventEx($arEvent, $arParams=[])
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"