使用 Microsoft Graph API 获取修改后的系列事件发生

Posted

技术标签:

【中文标题】使用 Microsoft Graph API 获取修改后的系列事件发生【英文标题】:Getting modified occurrance for series event using Microsoft Graph API 【发布时间】:2018-02-15 01:39:33 【问题描述】:

我正在订阅日历事件更改使用 webhook API

GraphAPI.api('subscriptions')
.post(
    changeType: 'created,updated,deleted',
    notificationUrl: 'https://www.example.com/callback/newevent',
    resource: `users/user@example.com/calendar/events`,
    expirationDateTime: moment().add(expireInMinutes, 'minutes').toDate(),
    clientState: 'subscription-identifier'
, (err, res) => 
    // ...
)

这真的很好用。 当我创建一个重复事件时,我得到了有意义的 type: 'seriesMaster' 属性。

但是,如果我删除或修改一个事件,我仍然会得到 seriesMaster 事件,而不是我修改的事件

这是返回到我的 webhook 的资源:

[  subscriptionId: '12345-sub-id',
    subscriptionExpirationDateTime: '2018-02-15T01:28:52.836+00:00',
    changeType: 'updated',
    resource: 'Users/12345-user-id/Events/12345-event-id',
    resourceData:
      '@odata.type': '#Microsoft.Graph.Event',
       '@odata.id': 'Users/12345-user-id/Events/12345-event-id',
       '@odata.etag': 'W/"12345-tag-id"',
       id: '12345-event-id' ,
    clientState: 'subscription-identifier'  ]

得到事件id,我们得到系列主:

 '@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#users(\'user@example.com\')/calendar/events/$entity',
  '@odata.etag': 'W/"12345-etag-val"',
  id: '12345-event-id',
  createdDateTime: '2018-02-14T21:20:47.7698185Z',
  lastModifiedDateTime: '2018-02-15T01:27:00.3099975Z',
  changeKey: '12345-etag-val',
  categories: [],
  originalStartTimeZone: 'Mountain Standard Time',
  originalEndTimeZone: 'Mountain Standard Time',
  iCalUId: '12345-icaluid',
  reminderMinutesBeforeStart: 15,
  isReminderOn: true,
  hasAttachments: false,
  subject: 'test 201802141420',
  bodyPreview: 'testing',
  importance: 'normal',
  sensitivity: 'normal',
  isAllDay: false,
  isCancelled: false,
  isOrganizer: false,
  responseRequested: true,
  seriesMasterId: null,
  showAs: 'tentative',
  type: 'seriesMaster',
  ...

那么,在这种情况下,如何获取修改/删除的事件发生?

【问题讨论】:

【参考方案1】:

这很棘手,没有涵盖所有场景的真正简单的方法来做到这一点。这是因为实际存在的项目只有系列母版,出现的次数都是从那里衍生出来的。

基本上你可以做的是扩展事件的instances属性,但你必须提供一个开始和结束时间来限制服务器扩展的范围。

因此,如果您知道重复模式的开始和结束日期(假设有结束日期!),您可以展开所有实例。然后,您必须将其与之前的内容进行比较,以确定哪个特定实例发生了变化。

【讨论】:

另一个问题是甚至不清楚seriesMasteroccurrence是否发生了变化。

以上是关于使用 Microsoft Graph API 获取修改后的系列事件发生的主要内容,如果未能解决你的问题,请参考以下文章

使用 Microsoft Graph API 获取修改后的系列事件发生

如何使用 Microsoft Graph API 获取当前站点的 siteId?

通过 Microsoft Graph API 发送自适应卡片 - 获取提交操作时出错

Microsoft Graph API calendarView 是不是仅限于一个月?如何获取所有事件?

Microsoft Graph API - 列出用户登录的所有权限/范围

Microsoft Graph API应用程序注册问题