2016-06-17 48 views
7

Sto utilizzando FullCalendar nella mia applicazione per visualizzare eventi creati tramite la nostra applicazione.Sincronizzazione a 2 vie con Google Calendar/Outlook

Ho un modulo di aggiunta/modifica per la creazione/aggiornamento di eventi. Questi eventi sono memorizzati nel db utilizzato dall'applicazione.

Ho bisogno di andare oltre e devo sincronizzare i calendari di Google e Outlook nel mio calendario. Questa dovrebbe essere la sincronizzazione a 2 vie i.e

Se creo/modifica/aggiorno un evento nel mio calendario dovrebbe essere creato/modificato/eliminato nei calendari di Google/Outlook.

Dovrebbe essere anche vice-versa.

Se faccio qualche modifica nei calendari di Google/Outlook dovrebbe essere visibile nel mio calendario.

Vorrei i vostri pensieri su applicazione del presente:

  1. Dovrei recuperare tutti gli eventi di Google/Outlook e importarli nel mio db e poi visualizzarle a mio avviso calendario. È anche tecnicamente possibile? Importa l'intero set di eventi di un canale sul mio db.

  2. Devo solo fare una GET tramite l'API di Google/Outlook per recuperare gli eventi per una vista particolare in cui sono ora nel mio calendario (Avrò i dati di avvio e la data di fine della mia vista del calendario) e mostrerò loro al mio calendario (cioè non sto memorizzando quegli eventi esterni nel mio db). Se un utente desidera apportare modifiche agli eventi che devono essere aggiornati direttamente nei calendari di Google/Outlook tramite le loro chiamate API di creazione/aggiornamento ed eliminazione.

Quale dovrebbe essere l'approccio migliore?

Edit:

sono andato a https://calendar.sunrise.am/ (una delle web app Calendar Sync) ed ho notato

enter image description here

vale a dire che stanno permettendo molte diverse applicazioni calendari/compiti che devono essere sincronizzati nel loro calendario .

Vedere tutto ciò che sento che archiviare tutti gli eventi di tutte quelle applicazioni nel db della nostra applicazione non è fattibile. Se vengono apportate modifiche a tali eventi tramite la mia applicazione, dovrei chiamare l'API di tali applicazioni per apportare tale modifica alla loro applicazione (calendario di Google, Outlook ecc.).

Qual è il tuo pensiero?

risposta

10

Per poter creare una soluzione di sincronizzazione affidabile, sono necessarie diverse soluzioni. La cosa più importante è che l'altra parte (google calendar e outlook in questo caso) dovrebbe collaborare con te e fornire una API per eseguire la sincronizzazione incrementale. Non ho guardato Outlook, ma l'API di Google Calendar ti offre tutto ciò di cui hai bisogno.

Prima di rispondere alla domanda: sì, è necessario recuperare tutti gli eventi (è possibile saltare gli eventi in passato) e memorizzarli nel proprio database. Effettuare sempre una query su tutte le origini esterne (più nel tuo database) è lento, rende la sincronizzazione molto più difficile e ti limita molto, perché non puoi ad esempio filtrare o cercare facilmente gli eventi su più sorgenti.Di seguito si ipotizza che stiamo lavorando solo con Google Calendar, si spera che Outlook sia simile (ma non ho controllato).

Così lista di controllo di ciò che vi serve:

  1. Il proprio database con gli eventi, in cui tavolo evento ha alcuni importanti colonne di metadati: Creato \ aggiornamento (momento in cui evento è stato ultima creato o aggiornato, non correlato alla data dell'evento stesso), Source (da cui proviene questo evento, come Google Calendar, Outlook o la tua app), UpdatedAtSource (fonte in cui è stato modificato l'ultimo evento), EventID (identificatore univoco dell'evento - importante averlo per evitare duplicati in alcuni casi).

  2. Inizialmente recupera tutti gli eventi dal provider di destinazione e li archivia nel database. Here è un riferimento alla struttura dell'evento di Google Calendar e si vede che sono presenti tutti i campi di metadati richiesti (creati, aggiornati, id).

  3. Ora è necessario guardare nuovi eventi provenienti dal provider. Puoi farlo eseguendo il polling (verificando periodicamente se ci sono nuovi eventi) o facendo in modo che gli eventi push del provider ti vengano inoltrati. Google Calendar supporta entrambe le opzioni. Here è un collegamento che descrive come implementare le notifiche push e here è il collegamento che descrive come ottenere solo nuovi eventi, ovvero gli eventi che tu (la tua applicazione) non hai visto prima. Tieni presente che il numero di telefono non è necessario recuperare l'intero elenco ogni volta, né è necessario fornire alcune opzioni di filtro (ad esempio "concedimi tutti gli eventi creati dopo il 2016-06-21"). Tutto questo sarebbe inaffidabile, ma gli sviluppatori di Google Calendar sanno come fare una buona sincronizzazione, quindi se ne sono occupati per te. Basta prendere e memorizzare fornito nextSyncToken e usarlo per fare richieste future. Se si utilizzano le notifiche push - sempre periodicamente si esegue il polling degli eventi, ma non di frequente (come uno ogni alcune ore). Le notifiche push non sono affidabili al 100% e alcune possono essere perse: è necessario gestirle utilizzando l'API nextSyncToken.

  4. Spingere le modifiche apportate dalla propria applicazione ai provider di destinazione. Ma, fare non fare questo immediatamente quando il cambiamento stesso è fatto. Usa invece un processo in background che spinge le modifiche per ogni coppia di utenti + provider uno per uno. Ci saranno errori di rete, ci saranno conflitti, quindi devi spingere i cambiamenti in modo sequenziale, non in parallelo (di nuovo, in sequenza per ogni coppia di utenti + fornitori, non globalmente). Memorizza data e ora dell'ultimo cambio con esito positivo (di nuovo, per ogni utente + fornitore) e se il processo è stato interrotto, sai da dove ricominciare.
  5. Non lo coprirò molto, ma si verificheranno conflitti, ovvero quando l'utente modifica lo stesso evento in più fonti. Tuttavia, se si utilizzano le notifiche push, i conflitti saranno molto rari. Devi comunque pianificarli almeno nell'interfaccia utente. Se hai rilevato un conflitto irrisolvibile, metti in pausa il processo di sincronizzazione e chiedi all'utente come risolverlo.

Così si vede che c'è del lavoro da fare, ma alla fine si farà piccolo numero di richieste a prendere piccola quantità di dati con ogni richiesta al fornitore, e gli utenti saranno felici di vedere i nuovi eventi dal loro Google Calendar \ Outlook nella tua applicazione immediatamente (e viceversa).

+0

Ottima spiegazione. Ho solo un'altra domanda. Durante la memorizzazione di eventi esterni nella mia applicazione dovrei creare colonne per tutti i campi che l'evento esterno sta rappresentando o dovrei fare solo alcuni importanti? Inoltre ho notato che Google e Outlook hanno entrambi set di campi diversi che rappresentano eventi. Come dovrei avvicinarmi mentre aggiorno i campi su una fonte esterna diversa da quelli importanti. – Raghav

+2

@Raghav Suppongo che se il provider consente gli aggiornamenti parziali (ovvero, aggiorna solo determinate colonne, non l'intero evento), allora sono necessarie solo le colonne effettivamente utilizzate nell'applicazione. Quando l'utente li cambia, pubblichi gli aggiornamenti di tali colonne al fornitore. Quando si riceve un aggiornamento dal provider, ma nessuno dei campi a cui si è interessati è stato modificato, si aggiorna ancora la data/ora di quell'evento, ma in caso contrario non fare nulla (not notify user). Per quanto riguarda i diversi set di campi, devi in ​​qualche modo unificarli, perché nella UI continuerai a visualizzarli in modo simile. – Evk