MK446
MK446

Reputation: 458

Outlook Rest API push notifications: Filter the notifications based on specific custom property set by outlook add-in

I followed same steps that are mentioned in this question, to filter the push notification events based on custom properties set by outlook add-in.

Below is the resource link that I used while subscribing to push notifications.

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)

It's filtering the calendar items that are having custom properties set by add-in, irrespective of whatever custom property it is. By looking at this resource link, we could say that no where we have mentioned the custom property name. But my add-in sets more than one custom properties to calendar item. I want to filter all calendar items that are having specific custom property. For example, My add-in sets any one of the below custom property to calendar based on business login.

Custom property 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"));
 });

Custom property 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"));
 });

Now I want to filter all calendar items that are having custom property my_prop_one.

EDIT 1:

As suggested by @Jason Johnston in one of the comments, I cross verified the property name and it's GUID using MFCMapi. Both property name and it's GUID values are correct.

MFCMapi data of custom property meetingsetby.

Then I collected data from MFCMapi and prepared the below url to filter calendar items that are having custom property meetingsetby and it's value 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')

And below is the response from postman when I make the get call using above url.

As you can see, response has empty list even though there is one calendar item with custom property meetingsetby and value webex.

Then I set the SingleValueExtendedProperty to calendar item using outlook Rest API as described in this post. Below is the sample request data, Outlook Rest API request to set Single Value Extended Property

MFCMapi data of SingleValueExtendedProperty MFCMapi data of SingleValueExtendedProperty

Then I collected data from MFCMapi and prepared the below url to filter calendar items that are having singleValueExtendedProperty set in above step.

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')

And below is the response from postman when I make the get call using above url. Filter response based on singleValueExtendedProperty

As you can see, I can successfully filter the calendar items using singleValueExtendedProperty. But my requirement is filter calendar items that are having specific custom property set by my outlook web add-in.

Any suggestion/answers would be more than welcome.

Upvotes: 1

Views: 434

Answers (1)

Jason Johnston
Jason Johnston

Reputation: 17702

Custom properties set by an add-in (using the CustomProperties interface) are not equivalent to normal MAPI named properties. Essentially what the add-in APIs do is take all of your "custom properties", serialize them as a JSON payload, then save it in a single MAPI named property, which will have the name cecp-{some guid}, and the property set GUID PS_PUBLIC_STRINGS {00020329-0000-0000-C000-000000000046}. The {some-guid} part of the name is equal to the Id of your add-in. This is all specified in MS-OXCEXT section 2.2.5.

So the end result here is that you cannot use $filter on the values you set in the CustomProperties interface, because there is no SingleValueExtendedProperty with that name and value. Instead, there is a single SingleValueExtendedProperty with the name cecp-{some guid}, with a string value that's the JSON serialization of ALL the custom props you set via the CustomProperties interface.

So how can you do what you want? Well, going back to your original URL, you can get all messages that have ANY properties set by your add-in by doing

$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)

Replacing the GUID after the cecp- with the GUID ID for your add-in.

But of course you want to find just the ones that have a specific property (meetingsetby) set to a specific value (webex). Unfortunately our API won't support substring searches when filtering the SingleValueExtendedProperties. So what you'd need to do is get all messages with any properties set by your add-in, then do your own filtering logic to find just the ones you want. So basically you would load them in memory, then check the value of that property yourself to find the ones you want.

You can make sure that the value of the property is included in the response by using an $expand clause. Something like this:

?$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')

Upvotes: 1

Related Questions