2 способа синхронизации с Google Calendar / Outlook

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

У меня есть форма добавления / редактирования для создания / обновления событий. Эти события хранятся в БД, используемой приложением.

Мне нужно отойти от этого и синхронизировать календари Google и Outlook в моем календаре. Это должно быть 2 способа синхронизации, т.е.

Если я создаю / редактирую / обновляю событие в моем календаре, оно должно быть создано / отредактировано / удалено в календарях Google / Outlook.

Это должно быть и наоборот.

Если я делаю некоторые изменения в календарях Google / Outlook, они должны быть видны в моем календаре.

Я хотел бы ваши мысли о реализации этого:

Должен ли я получить все события Google / Outlook и импортировать их в мою базу данных, а затем отобразить их в виде календаря. Это даже технически возможно? т.е. импортировать весь набор событий канала в мою базу данных.

Должен ли я просто сделать GET через Google / Outlook API, чтобы получить события для определенного представления, где я сейчас нахожусь в моем календаре (у меня будут начальные данные и дата окончания моего просмотра календаря), и просто показать их в моем календаре ( то есть я не храню эти внешние события в моем БД). Если пользователь хочет внести какие-либо изменения в события, которые должны быть обновлены непосредственно в календари Google / Outlook через их вызовы API создания / обновления и удаления.

Какой должен быть лучший подход?

Редактировать:

я пошел вhttps://calendar.sunrise.am/ (одно из веб-приложений синхронизации календаря) и заметил

то есть они позволяют синхронизировать множество календарей / задач различных приложений в своем календаре.

Видя все это, я чувствую, что хранение всех событий всех этих приложений в базе данных нашего собственного приложения неосуществимо. Если какие-либо изменения будут внесены в эти события через мое приложение, я должен вызвать API этих приложений, чтобы внести это изменение в свое приложение (календарь Google, Outlook и т. Д.).

Что ты думаешь?

Ответы на вопрос(1)

Решение Вопроса

Чтобы создать надежное решение для синхронизации, вам нужно несколько вещей. Наиболее важным является то, что другая сторона (в данном случае Google Calendar и Outlook) должна сотрудничать с вами и предоставить API для выполнения добавочной синхронизации. Я не смотрел на Outlook, но API Календаря Google предоставляет вам все, что вам нужно.

Сначала ответьте на свой вопрос - да, вам нужно получить все события (хотя вы можете пропустить события в прошлом) и сохранить их в своей собственной базе данных. Всегда делаю запросвсе внешние источники (плюс к вашей собственной базе данных) медленны, значительно усложняют синхронизацию и сильно ограничивают вас, потому что вы не можете, например, легко фильтровать или искать события в нескольких источниках. Ниже я предполагаю, что мы работаем только с Календарем Google, надеюсь, Outlook похож (но я не проверял).

Итак, контрольный список того, что вам нужно:

Ваша собственная база данных с событиями, где в таблице событий есть несколько важных столбцов метаданных: Создано \ Обновлено (время, когда событие было создано в последний раз илиобновленныйНе связано с датой самого события), Источник (откуда пришло это событие, например, Календарь Google, Outlook или ваше собственное приложение), Обновленный источник (источник, где это событие было изменено в последний раз), Идентификатор события (уникальный идентификатор события - важно для иметь это, чтобы предотвратить дубликаты в некоторых случаях).

Первоначально получить все события от целевого поставщика и сохранить их в своей базе данных.Вот является ссылкой на структуру события Календаря Google, и вы видите, что там есть все необходимые поля метаданных (созданы, обновлены, id).

Теперь вам нужно следить за новостями, поступающими от провайдера. Вы можете сделать это путем опроса (периодически проверяя, есть ли новые события) или отправляя вам события провайдера. Календарь Google поддерживает оба варианта.Вот является ссылкой, описывающей, как реализовать push-уведомления иВот это ссылка, описывающая, как получитьтолько новые события, то есть события, которые вы (ваше приложение) не видели раньше. Обратите внимание, что выне необходимо извлекать весь список каждый раз, и при этом вам не нужно указывать некоторые параметры фильтра (например, «дать мне все события, созданные после 2016-06-21»). Все это было бы ненадежно, но разработчики Календаря Google знают, как сделать хорошую синхронизацию API, поэтому они позаботились об этом для вас. Просто возьмите и сохраните при условииnextSyncToken и использовать его для будущих запросов. Если вы используете push-уведомления -всегда также периодически опрашивать события, но не часто (например, один раз в несколько часов). Push-уведомления не являются надежными на 100%, а некоторые могут быть пропущены - вам нужно справиться с теми, кто используетnextSyncToken апи.

Передайте изменения, сделанные вашим собственным приложением, целевым поставщикам. Но сделатьне сделайте это сразу же после внесения самого изменения. Вместо этого используйте фоновый процесс, который передает изменения для каждой пары пользователь + поставщик по одному. Будут сбои сети, будут конфликты, поэтому вы должны вносить изменения последовательно, а не параллельно (опять же, последовательно для каждой пары пользователь + поставщик, а не глобально). Сохраните отметку времени последнего успешно отправленного изменения (опять же, для каждого пользователя + провайдера), и если процесс был прерван - вы знаете, с чего начать заново.Я не буду подробно останавливаться на этом, но у вас будут конфликты, то есть когда пользователь изменяет одно и то же событие в нескольких источниках. Однако, если вы используете push-уведомления - конфликты будут очень редкими. Тем не менее, вы должны планировать их хотя бы в пользовательском интерфейсе. Если вы обнаружили неразрешимый конфликт - приостановите процесс синхронизации и спросите пользователя, как его разрешить.

Итак, вы видите, что есть над чем поработать, но в конце вы будете делать небольшое количество запросов и извлекать небольшое количество данных с каждым запросом к поставщику, и ваши пользователи будут рады видеть новые события из своего Календаря Google \ Outlook в вашей заявке немедленно (и наоборот).

 Raghav30 авг. 2016 г., 12:47
Отличное объяснение. У меня есть только еще один запрос. Сохраняя внешние события в моем приложении, я должен создать столбцы для всех полей, которые представляет внешнее событие, или я должен просто сделать несколько важных? Кроме того, я заметил, что Google и Outlook имеют различный набор полей, представляющих события. Как я должен подходить при обновлении полей на внешнем источнике, кроме важных.
 Evk30 авг. 2016 г., 16:22
@Raghav Я полагаю, если провайдер разрешает частичные обновления (то есть - обновлять только определенные столбцы, а не целое событие) - тогда вам нужны только столбцы, которые вы фактически будете использовать в своем приложении. Когда пользователь их меняет - вы публикуете обновления этих столбцов для провайдера. Когда вы получаете обновление от провайдера, но ни одно из интересующих вас полей не изменилось - вы все равно обновляете временную метку этого события, но в противном случае ничего не делаете (не уведомляете пользователя). Что касается другого набора полей - вы должны каким-то образом унифицировать их, потому что в пользовательском интерфейсе вы все равно будете отображать их аналогичным образом.

Ваш ответ на вопрос