Почему Microsoft Graph API сообщает мне, что события, которые я только что создал, «@ удалены», когда они все еще существуют?

#microsoft-graph-api #outlook-calendar

#microsoft-graph-api #outlook-календарь

Вопрос:

Когда я делаю СООБЩЕНИЕ me/calendars/[calendar-id]/events со следующей полезной нагрузкой. Он успешно создает событие, и я получаю идентификатор нового события:

 {
  "start": {
    "timeZone": "America/Chicago",
    "dateTime": "2022-12-23T15:00:00"
  },
  "end": {
    "timeZone": "America/Chicago",
    "dateTime": "2022-12-23T18:00:00"
  },
  "subject": "Please don't delete me!",
  "body": {
    "contentType": "text",
    "content": "I'm just an event in the future, I wonder if I'll send a '@removed' notice?"
  }
  "isCancelled": false,
  "type": "singleInstance"
}
 

Но вскоре после этого мой webhook получает эту информацию для этого события, указывая, что оно было только что удалено:

 {
  "@odata.type": "#microsoft.graph.event"
  "id": [that-event-id]
  "@removed": {
    "reason": "deleted"
  }
}
 

Когда я захожу и просматриваю свой календарь Outlook, событие все еще присутствует, и если я его получаю, оно isCancelled равно false.

Это происходит только для событий, созданных более года назад или два года в будущем.

Комментарии:

1. Просто посмотрите, включена ли (1) для этих элементов какая-либо политика хранения? (2) Существует ли у вас какое-либо решение для резервного копирования / архивирования?

2. Как вы говорите, это происходит только с событиями, созданными более года назад или два года назад… дайте мне знать, что вы найдете.

3. @Dev Я не знаю ни о какой политике хранения: каков наилучший способ выяснить это? И я не уверен, что задает ваш второй вопрос. У нас все еще есть данные о наших событиях на нашей стороне, но они записаны как архивированные, потому что нам дают @removed уведомление.

4. возможно, вам потребуется проконсультироваться с администратором exchange / office 365, чтобы узнать, применяли ли они какие-либо политики хранения.

5. Кроме того, вам нужно помнить следующее: (1) В общем случае удаленные экземпляры представлены их идентификатором и объектом @removed . (2) В вашем сценарии вы замечаете «Удалено», это указывает на то, что элемент удален и не может быть восстановлен. Вот почему я спросил, включена ли какая-либо политика хранения или существует решение для резервного копирования / архивирования (3) Также обратите внимание, что удаленный объект может быть возвращен в исходном ответе на дельта-запрос и в отслеживаемых ответах (deltaLink). Клиенты, использующие запросы дельта-запросов, должны быть спроектированы так, чтобы обрабатывать эти объекты в ответах.

Ответ №1:

Я думаю, что вчера я наконец смог отследить эту проблему, поскольку мы сами страдали от этой же проблемы около месяца.

Мы используем events delta API вместо webhook API, но, по-видимому, одна и та же ошибка затрагивает оба… Кому-то в Microsoft действительно нужно это исправить, это безумие.

Ответ

Изменения событий за пределами startDateTime..endDateTime окна, изначально заданного в запросе дельты событий, всегда отображаются как @removed дельта.

Подробнее

API-интерфейс events delta захватывает начальное startDateTime..endDateTime окно, которое затем используется для всех последующих вызовов с помощью a $deltatoken . Это также неожиданно ударит вас, если ваш дельта-запрос использует $select etc. поскольку изменения в нем не будут применяться, пока вы не создадите новую дельту (не передавая начальную $deltatoken )

Именно эта деталь привела нас к созданию бомбы замедленного действия для самих себя. У нас было начальное окно, которое было несколько широким, но внезапно начали поступать распространенные сообщения об отмененных событиях, которые определенно не были удалены из календарей.

Это ошибка

Пожалуйста, кто-нибудь из Microsoft признает, что это реальная проблема. Изменения, внесенные за пределами дискретно указанного временного окна, не должны влиять на него, это затрудняет создание интеграций, которым мы доверяем.

Комментарии:

1. К сожалению, они, похоже, не совсем признают это в этом обсуждении. github.com/microsoftgraph/microsoft-graph-docs/issues/6599

Ответ №2:

Это происходит только с событиями, созданными более года назад или два года в будущем.

Я предполагаю, что это связано с политиками хранения, определенными вашей организацией.

https://docs.microsoft.com/en-us/microsoft-365/compliance/create-retention-policies

С помощью политик хранения вы можете определить, как долго должны храниться определенные элементы перед их автоматическим удалением.

Ответ №3:

Это также может произойти, если вы в конечном итоге используете неправильный $deltatoken .