Push-уведомления Outlook Rest API: фильтрация уведомлений на основе определенного настраиваемого свойства, установленного надстройкой Outlook.

Я выполнил те же шаги, которые упомянуты в этот вопрос, чтобы отфильтровать события push-уведомлений на основе настраиваемых свойств, установленных надстройкой Outlook.

Ниже приведена ссылка на ресурс, которую я использовал при подписке на push-уведомления.

https://outlook.office.com/api/v2.0/me/events/?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c'%20and%20ep%2FValue%20ne%20null)

Он фильтрует элементы календаря, у которых есть настраиваемые свойства, установленные надстройкой, независимо от того, какое это настраиваемое свойство. Посмотрев на эту ссылку на ресурс, мы могли бы сказать, что нигде не упоминали имя настраиваемого свойства. Но моя надстройка устанавливает несколько настраиваемых свойств для элемента календаря. Я хочу отфильтровать все элементы календаря, у которых есть определенное настраиваемое свойство. Например, моя надстройка устанавливает для любого из указанных ниже настраиваемых свойств календарь на основе бизнес-входа в систему.

Пользовательское свойство 1:

var item = Office.context.mailbox.item;
item.loadCustomPropertiesAsync((result) => {
     const props = result.value;
     props.set("my_prop_one", "test_value_one");
     props.saveAsync((saveResult) => console.log("Successfull"));
 });

Пользовательское свойство 2:

var item = Office.context.mailbox.item;
 item.loadCustomPropertiesAsync((result) => {
      const props = result.value;
      props.set("my_prop_two", "test_value_tw");
      props.saveAsync((saveResult) => console.log("Successful"));
 });

Теперь я хочу отфильтровать все элементы календаря, у которых есть настраиваемое свойство my_prop_one.

ИЗМЕНИТЬ 1:

Как предложил @Jason Johnston в одном из комментариев, я проверил имя свойства и его GUID с помощью MFCMapi. И имя свойства, и его значения GUID верны.

Данные MFCMapi настраиваемого свойства meetingsetby.

Затем я собрал данные из MFCMapi и подготовил приведенный ниже URL-адрес для фильтрации элементов календаря, которые имеют настраиваемое свойство meetingsetby и его значение webex.

https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20meetingsetby'%20and%20ep%2FValue%20eq%20'webex')

А ниже - ответ от postman, когда я выполняю вызов get, используя указанный выше URL.

Как видите, в ответе есть пустой список, хотя есть один элемент календаря с настраиваемым свойством meetingsetby и значением webex.

Затем я установил SingleValueExtendedProperty на элемент календаря с помощью Outlook Rest API, как описано в этот пост. Ниже приведен образец данных запроса,  Запрос Outlook Rest API для установки расширенного свойства с одним значением

Данные MFCMapi SingleValueExtendedProperty  Данные MFCMapi для SingleValueExtendedProperty

Затем я собрал данные из MFCMapi и подготовил приведенный ниже URL-адрес для фильтрации элементов календаря, для которых установлено singleValueExtendedProperty на предыдущем шаге.

https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{6666AA44-4659-4830-9070-00047EC6AC6E}%20Name%20RestApiSingleValueExtendedProperty'%20and%20ep%2FValue%20eq%20'Set this property using REST API')

А ниже - ответ от postman, когда я выполняю вызов get, используя указанный выше URL. Отфильтровать ответ на основе singleValueExtendedProperty

Как видите, я могу успешно фильтровать элементы календаря с помощью singleValueExtendedProperty. Но мое требование - фильтровать элементы календаря, у которых есть определенные настраиваемые свойства, установленные моей веб-надстройкой Outlook.

Любые предложения / ответы будут более чем приветствоваться.


person MK446    schedule 21.09.2017    source источник


Ответы (1)


Настраиваемые свойства, устанавливаемые надстройкой (с помощью CustomProperties interface) не эквивалентны обычным именованным свойствам MAPI. По сути, то, что делают надстройки API, - это брать все ваши «настраиваемые свойства», сериализовать их как полезную нагрузку JSON, а затем сохранять их в одном именованном свойстве MAPI, которое будет иметь имя cecp-{some guid} и набор свойств GUID PS_PUBLIC_STRINGS {00020329-0000-0000-C000-000000000046}. Часть {some-guid} имени равна Id вашей надстройки. Все это указано в MS-OXCEXT, раздел 2.2. 5.

Таким образом, конечный результат заключается в том, что вы не можете использовать $filter для значений, установленных в интерфейсе CustomProperties, потому что не существует SingleValueExtendedProperty с таким именем и значением. Вместо этого есть один SingleValueExtendedProperty с именем cecp-{some guid} со строковым значением, которое представляет собой сериализацию JSON ВСЕХ настраиваемых свойств, которые вы установили через интерфейс CustomProperties.

Так как же ты можешь делать то, что хочешь? Что ж, вернувшись к исходному URL-адресу, вы можете получить все сообщения, у которых есть ЛЮБЫЕ свойства, установленные вашей надстройкой, выполнив

$filter=SingleValueExtendedProperties/Any
  (ep: ep/PropertyId eq 'String {00020329-0000-0000-C000-000000000046} 
  Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c' and ep/Value ne null)

Замена GUID после cecp- идентификатором GUID для вашей надстройки.

Но, конечно, вы хотите найти только те, у которых определенное свойство (meetingsetby) установлено на определенное значение (webex). К сожалению, наш API не поддерживает поиск подстрок при фильтрации SingleValueExtendedProperties. Итак, что вам нужно сделать, это получить все сообщения с любыми свойствами, установленными вашей надстройкой, а затем выполнить свою собственную логику фильтрации, чтобы найти только те, которые вам нужны. По сути, вы загружаете их в память, а затем сами проверяете значение этого свойства, чтобы найти те, которые вам нужны.

Вы можете убедиться, что значение свойства включено в ответ, используя предложение $expand. Что-то вроде этого:

?$filter=SingleValueExtendedProperties/Any
  (ep: ep/PropertyId eq 'String {00020329-0000-0000-C000-000000000046} 
  Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c' and ep/Value ne null)
  &$expand=SingleValueExtendedProperties($filter=PropertyId eq 'String
  {00020329-0000-0000-C000-000000000046} Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c')
person Jason Johnston    schedule 21.09.2017
comment
Спасибо за Ваш ответ. Я пробовал вышеуказанный фильтр. После этого я вообще не получаю push-уведомление. Ниже представлен новый фильтр https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20my_prop_one'%20and%20ep%2FValue%20ne%20null). Когда я делаю запрос на указанный выше URL-адрес, я получаю пустой массив, хотя есть несколько элементов календаря, которые имеют настраиваемое свойство my_prop_one. - person MK446; 25.09.2017
comment
GUID может быть неправильным. На этой неделе я нахожусь в Ignite и не могу запустить тест, но вы сможете найти свойство с помощью MFCMapi и определить GUID. - person Jason Johnston; 26.09.2017
comment
Я перепроверил имя свойства и его GUID с помощью MFCMapi. И имя свойства, и его значения GUID верны. - person MK446; 29.09.2017
comment
@Johnston Я обновил вопрос своими наблюдениями. - person MK446; 29.09.2017
comment
Ok. Я забыл, что настраиваемые свойства надстройки - это не просто обычные настраиваемые свойства, поэтому я обновляю свой ответ. - person Jason Johnston; 02.10.2017
comment
@Johnston Спасибо за ответ. Не могу загрузить их в память и применить фильтр. Поскольку я хочу подписаться на остальные push-уведомления, когда пользователь обновляет / удаляет элемент календаря, который имеет определенное настраиваемое свойство, установленное веб-надстройкой. - person MK446; 02.10.2017
comment
Лучшее, что вы можете сделать, это отфильтровать изменение всего набора свойств (фильтр по свойству cecp-). - person Jason Johnston; 02.10.2017