Есть ли в RingCentral webhook способ различать разные фильтры событий?

Как например

Если я хочу слушать оба

'eventFilters' => array(
"/restapi/v1.0/account/~/extension/~/presence?detailedTelephonyState=true&aggregate=true",
"/restapi/v1.0/account/~/extension/~/message-store/instant?type=SMS"

Должен ли я выполнять переключение на каждый почтовый запрос от RingCentral, если я хочу фильтровать и анализировать оба события?

Сказать..

switch($eventid){
case '/restapi/v1.0/account/<accountid>/extension/<extension>/presence?detailedTelephonyState=true&aggregate=true'
//process data
break;
}

Но сообщения webhook имеют разные расширения. Есть ли идентификатор того, какое событие инициировано?

2

Решение

Есть несколько способов решить проблему, которую вы представили …

  1. Если у вас есть одна подписка с несколькими EventFilters на несколько расширений, как вы заявили, фильтрация входящих webhook.event URI и соответствует строка для типа, вероятно, самый быстрый, а затем направить к определенному обработчику типа события уведомления.
  2. Вы можете создать до 20 push-уведомлений (подписок) в своей учетной записи, и каждая из них может содержать до 1000 событийных фильтров. Вы можете создать отдельный веб-крючок для любого из шести (6) уникальных типов событий уведомления, которые вы хотите отслеживать. Это также позволит вам Обновить подписки для расширений на лету.
  3. Вы можете использовать типизацию схемы [NotificationType.body (https://developers.ringcentral.com/api-docs/latest/index.html#!#EventTypes.html) если у вас зарегистрирована только одна подписка, которая содержит несколько типов событий уведомления, проверив, webhook.body обладает необходимыми свойствами.

Номер 3 в PHP (непроверенный код)

$instantMessageEventTypeKeys = array('id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid');

function genericNotificationHandler($eventJson) {
$eventObj = json_decode($eventJson, true);
foreach($instantMessageEventTypeKeys) {
// If the event.body keys match, route to
if(arrayKeys(eventObj=>['body']) === $instantMessageEventType)) {
//Call some instantMessageSpecificEventHandler($eventObj);
}
}
}

Номер 3 в JavaScript (непроверенный код)

// Instant Message Notification Event Type properties
const instantMessageEventTypeKeys = ['id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid']

const proxyHandlers = {
get (target, key) {
if ('notificationEventType' === key[0]) {
let targetKeys = target.body.ownKeys.sort().join(',');
if(targetKeys === instantMessageEventTypeKeys.sort().join(',')) return 'Instant Message'
}
}
}

const genericNotificationHandler = (notificationData) => {
// You could create traps in handlers below to simplify further
let pEvent = new Proxy(notificationData, proxyHandlers);
if('Instant Message' === pEvent.notificationEventType) {
// instantMessageSpecificEventHandler(notificationData)
}
}
2

Другие решения

Чтобы основываться на первом подходе Бена:

Если у вас есть одна подписка с несколькими EventFilters на несколько расширений, как вы заявили, фильтрация входящих webhook.event URI и соответствует строка для типа, вероятно, самый быстрый, а затем направить к определенному обработчику типа события уведомления.

Полезная нагрузка webhook будет выглядеть следующим образом. event свойство будет указывать тип события, которое запускается, и ваше приложение может использовать его для инициирования дифференцированной обработки. Я использовал пустой body ниже, но в реальном посте, он будет заполнен телом, специфичным для этого типа событий.

{
"uuid":"12345678901234567890",
"event":"/restapi/v1.0/glip/posts",
"timestamp":"2018-05-01T16:39:41.693Z",
"subscriptionId":"11112222-3333-4444-5555-666677778888",
"ownerId":"11111111",
"body":{}
}

в Go сообщество SDK go-ringcentral, Я начинаю создавать функцию, которая возвращает тип события, учитывая строку события:

ParseEventTypeForFilter(eventFilter string) (EventType, error) {

Вот список типов событий:

const(
AccountPresenceEvent EventType = iota
ContactDirectoryEvent
DetailedExtensionPresenceEvent
DetailedExtensionPresenceWithSIPEvent
ExtensionFavoritesEvent
ExtensionFavoritesPresenceEvent
ExtensionGrantListEvent
ExtensionListEvent
ExtensionInfoEvent
ExtensionPresenceEvent
ExtensionPresenceLineEvent
GlipGroupsEvent
GlipPostEvent
GlipUnreadMessageCountEvent
InboundMessageEvent
IncomingCallEvent
InstantMessageEvent
MessageEvent
MissedCallEvent
RCVideoNotificationsEvent
SubscriptionRenewalEvent
)

Код: https://github.com/grokify/go-ringcentral/blob/master/clientutil/event_filter.go

0

По вопросам рекламы [email protected]