Microsoft Graph API:如何跟踪已删除的日历事件发生?

Jen*_*son 5 office365 microsoft-graph-calendar microsoft-graph-api

我目前正在从事 Exchange Online 集成项目,我们使用 Microsoft Graph API 1.0 将用户的日历复制到我们的系统。到目前为止它一直工作正常,但今天我遇到了一个我无法解决的问题:

您如何跟踪重复发生的日历事件的删除情况?

我曾尝试使用“Delta”链接但没有成功。这些请求仅返回系列母版以及所有剩余的事件。

例如第一个请求:

GET /v1.0/users/dc7f4032-5f30-4441-a165-428aed9fb471/calendarview/delta?startdatetime=2019-04-11T00:00:00&enddatetime=2019-04-28T23:59:59

然后我请求 nextLink 以便我获得 deltaLink,然后我请求 deltaLink:

GET /v1.0/users/dc7f4032-5f30-4441-a165-428aed9fb471/calendarview/delta?$deltatoken=uwMsonT1N46Me49CO...(etc.)
Run Code Online (Sandbox Code Playgroud)

然后我得到了回应:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(event)",
    "@odata.deltaLink": "https://graph.microsoft.com/v1.0/users/dc7f4032-5f30-4441-a165-428aed9fb471/calendarview/delta?$deltatoken=uwMsonT1N46Me49COq9SDw0t_wB0xaeZEqH3MS63rea577XfZFFdjg0jwU6FzfSp9LnqeqbpBGm2ppJDuDiIP280MEFjk2Q9GYyNNdCAP__CjSKSGFQ9WKmL3TPyFeXhhYE9KgmWHF1cSrx7OYBT7zPrgwY0x5peeyjBEtqkAueuE2Pb8DH4iODU-vAp-lHVOzPmkkjNyef1NTNkgNv-kg.oOHzptXCwEphbnI7YFO7saexZ_c0hZj1a0o4ZjluzUU",
    "value": []
}
Run Code Online (Sandbox Code Playgroud)

只要日历中没有任何变化,对 deltaLink 的后续调用将继续返回:"value": []。

然后我删除一个系列中的一个事件,然后再次请求 deltaLink,然后 MS Graph API 只返回 master 以及原始时间跨度内的所有剩余事件,没有任何删除事件的痕迹!

有谁遇到过同样的问题吗?

aha*_*ash 3

我将详细介绍我的实现,希望它有所帮助:

首先:我们的后端是 Node,我们使用 MSGraph 节点客户端来处理所有 API 请求,这一点值得一提,因为我正在详细介绍我们使用的一些 npm。

  • 通过调用 api: 来进行同步操作/me/calendarView/delta?startdatetime=${startDate}&enddatetime=${endDate}。注意:这适用于初始同步 -根据您在同步过程中的位置使用nextLink或。deltaLink
  • 对于收到的重复事件,我们使用rrule npm并将 MS 发送的重复模式转换为RRuleSet.
  • 我们使用 RRuleSet 生成事件实例。
  • 我们创建从 MSGraph api 调用接收到的occurrences( )集合。type = occurrence
  • 我们创建从 MSGraph api 调用接收到的exceptions ( )的集合。type = exception
  • 我们生成事件实例的差异,以找出缺少哪些发生日期。
  • EXDates我们根据之前生成的日期差异更新 RRuleSet 。
  • 最后,我们从更新的 RRuleSet 中为相关的重复事件生成事件实例。

使用例外(即:重复系列中的一次性编辑事件)根据您的日历要求创建事件。注意:由于一次性异常不随 一起发送type = occurrence,因此生成的用于计算 EXDates 的事件实例 diff 是准确的。

补充笔记:

  • 为了正确进行夏令时调整,请使用windows-iana npm在 MS 时区和 IANA 时区之间进行转换(如果需要),并确保添加到 RRuleSet 的 RRule 和 EXDates 都使用该tzid属性。

  • 如果 Outlook 日历中的重复事件被取消,我们在回调中得到的只是重复事件的 ID。确保将事件的本地事件表示one-off与重复事件的 ID 链接起来,以便您可以清理事件实例/将事件标记为已取消。

MS API 可以做得更好的事情:

  • 停止发送您唯一支持增量的日历 API 中的所有事件!仅发送重复事件。
  • 在初始同步时分别发送一次性异常和取消的事件实例,除非重复模式以需要重新计算所有事件实例的方式发生变化。
  • 如果重复序列中的事件实例被取消,则仅发送该事件以及父重复事件的 ID。对于一次性事件也是如此。
  • 如果重复事件被取消,请发送异常取消事件。
  • 根据RFC 5545向我们发送重复规则!