Инкрементная синхронизация игнорирует исходные фильтры

#google-calendar-api

Вопрос:

Мы управляем синхронизацией наших календарей таким образом —

  1. запуск первой синхронизации с некоторой фильтрацией (timeMin и timeMax), затем получение nextSyncToken
  2. запуск инкрементной синхронизации при срабатывании наблюдателя событий. Инкрементная синхронизация игнорирует исходные фильтры и возвращает обновленные события с разных дат.

Является ли это ожидаемым поведением?

пример — запуск первой синхронизации по датам 2021-07-25T00:00:00 - 2021-07-25T20:00:00 , получение nextSyncToken = xxxxx . добавление нового события на 2021-08-08. запуск инкрементной синхронизации с nextSyncToken = xxxxx возвращает это новое событие , хотя оно должно было быть отфильтровано. (протестировано на nodejs и на справочной странице api Google)

По запросу Хосе это запросы и ответы:

Первый запрос:

 calendarId: ******,
q: importantEventsQuery,
timeMax: 2021-07-25T20:00:00 03:00,
timeMin: 2021-07-25T10:00:00 03:00
 

Первый ответ:

 {
"kind": "calendar#events",
"etag": ""p320******"",
"summary": "a******",
"updated": "2021-08-09T04:39:45.696Z",
"timeZone": "******",
"accessRole": "owner",
"defaultReminders": [
    {
       "method": "popup",
       "minutes": 15
      }
],
"nextSyncToken": "**********uAE=",
"items": []
}
 

Вторая просьба:

 calendarId: ******,
syncToken: **********uAE=
 

Второй ответ:

 {
 "kind": "calendar#events",
 "etag": ""p320cltebhuhv40g"",
 "summary": "alon.sade@verizonmedia.com",
 "updated": "2021-08-09T04:39:45.696Z",
 "timeZone": "Asia/Jerusalem",
 "accessRole": "owner",
 "defaultReminders": [
  {
   "method": "popup",
   "minutes": 15
  }
 ],
 "nextSyncToken": "**********uAE=",
 "items": []
}
 

Теперь я добавляю новое событие в дату, отличную от даты запроса, и без термина «Важный запрос».

Третий запрос: соответствует второму.

Третий ответ:

 {
 "kind": "calendar#events",
 "etag": ""p32k******"",
 "summary": "******",
 "updated": "2021-08-09T06:42:13.241Z",
 "timeZone": "******",
 "accessRole": "owner",
 "defaultReminders": [
  {
   "method": "popup",
   "minutes": 15
  }
 ],
 "nextSyncToken": "*****=",
 "items": [
  {
   "kind": "calendar#event",
   "etag": ""******"",
   "id": "******",
   "status": "confirmed",
   "htmlLink": "https://www.google.com/calendar/event?eid=******",
   "created": "2021-08-09T06:42:12.000Z",
   "updated": "2021-08-09T06:42:12.725Z",
   "summary": "dd",
   "creator": {
    "email": "******",
    "self": true
   },
   "organizer": {
    "email": "******",
    "self": true
   },
   "start": {
    "dateTime": "2021-08-09T08:30:00 01:00"
   },
   "end": {
    "dateTime": "2021-08-09T09:00:00 01:00"
   },
   "iCalUID": "******",
   "sequence": 0,
   "reminders": {
    "useDefault": true
   },
   "eventType": "default"
  }
 ]
}
 

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

1. Как вы упомянули, календарь изменяется путем добавления нового события, вы проверили, изменилось ли это nextSyncToken ?

2. Когда я получаю новый результат (с несвязанными событиями), он nextSyncToken новый и другой

3. Как я вижу в ответах, это не предполагаемое поведение, если бы соответствующий отчет еще не был подан, я бы открыл новый. developers.google.com/calendar/api/support#problems_errors

Ответ №1:

Это нормально, чтобы обеспечить согласованность данных

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

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

Посмотрите на события: список > Свойство syncToken>, где указано It makes the result of this list request contain only entries that have changed since then , что вы должны делать новый запрос при каждом изменении, как было сказано ранее.

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

1. Спасибо за ответ! — что вы подразумеваете под «добавлением нового ресурса»? новое событие было добавлено в тот же календарь исходного запроса. Кроме того, я не могу добавлять фильтры временного диапазона, когда я использую the nextSyncToken . Что касается цитаты из документации, разве не предполагается, что возвращенные записи с момента последнего запроса будут по-прежнему использовать те же ограничения ?

2. Я имею в виду, что, как вы сказали «добавление нового события в 2021-08-08», вы добавляете сюда новый ресурс. Когда вы говорите, что «это должно было быть отфильтровано», я объясняю в своем ответе причину, по которой фильтры не отражаются при использовании nextSyncToken ранее сгенерированного (перед добавлением этого события). Я не понимаю, что вы подразумеваете под «Я не могу добавлять фильтры временного диапазона, когда я использую nextSyncToken».

3. спасибо, я не знал, что события-это ресурсы. какова цель nextSyncToken и запуска инкрементной синхронизации, если она игнорирует фильтры и возвращает новые (несвязанные) ресурсы в результатах? Что касается диапазона времени добавления, вы предложили, чтобы «всякий раз, когда вы добавляете ресурс, попробуйте сделать новый запрос, включая фильтры», я не хочу выполнять полную синхронизацию для каждого нового события, я пытаюсь выполнить добавочную синхронизацию, как описано здесь: developers.google.com/calendar/api/guides/sync

4. Можно ли увидеть полную полезную нагрузку (запрос / ответ)?

5. Я добавил запросы и ответы, спасибо!