Есть ли в 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;
}

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

2 ответа

Решение

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

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

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

Если у вас есть одна подписка с несколькими 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":{}
}

В SDK сообщества Gogo-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

Другие вопросы по тегам