Mercurial > code > home > repos > gcalendarwatch
diff calsync/event_sync.go @ 57:24f662799710
WIP incremental sync now runs
author | drewp@bigasterisk.com |
---|---|
date | Thu, 05 Sep 2024 15:03:05 -0700 |
parents | 635ff76f867c |
children | 6c7151126a0b |
line wrap: on
line diff
--- a/calsync/event_sync.go Thu Sep 05 13:50:40 2024 -0700 +++ b/calsync/event_sync.go Thu Sep 05 15:03:05 2024 -0700 @@ -30,46 +30,67 @@ } log.Println("syncing events from", len(cals), "calendars") - readerErr := make(chan error) for _, cal := range cals { rd := newCalEventsReader(mc, gc, cal, syncStart, syncEnd) - go func() { - readerErr <- rd.updateForever() - }() + go rd.updateForever() } - return <-readerErr + return nil // return a mapping of webhook name to calEventsReader? } +// i think this should own the webhook watcher type calEventsReader struct { - mc *mongoclient.MongoClient - gc *gcalclient.GCalClient - cal mongoclient.MongoCal - t1 time.Time - t2 time.Time + mc *mongoclient.MongoClient + gc *gcalclient.GCalClient + cal mongoclient.MongoCal + t1 time.Time + t2 time.Time + syncToken string } func newCalEventsReader(mc *mongoclient.MongoClient, gc *gcalclient.GCalClient, cal mongoclient.MongoCal, t1 time.Time, t2 time.Time) *calEventsReader { - return &calEventsReader{mc, gc, cal, t1, t2} + return &calEventsReader{mc, gc, cal, t1, t2, ""} } -func (r *calEventsReader) updateForever() error { +func (r *calEventsReader) updateForever() { + err := r.updateInitialRange() + if err != nil { + log.Fatal(err) + } - var syncToken string - items, err := r.gc.ListEventsInRange(r.cal, r.t1, r.t2) + for { + log.Println("syncing", r.cal.Summary, "with sync", r.syncToken) + err = r.sync() + if err != nil { + log.Fatal(err) + } + + time.Sleep(10 * time.Second) + } +} + +func (r *calEventsReader) updateInitialRange() error { + events, nextSyncToken, err := r.gc.ListEventsInRange(r.cal, r.t1, r.t2) + r.syncToken = nextSyncToken if err != nil { return err } - for _, item := range items { - r.mc.UpsertOneEvent(convert.MongoEventFromGoogleEvent2(&item.Event, time.Now() /*todo*/)) - syncToken = item.SyncToken + for _, ev := range events { + r.mc.UpsertOneEvent(convert.MongoEventFromGoogleEvent2(&ev, time.Now() /*todo*/)) } - r.mc.DeleteEventsUpdatedBefore(r.cal, r.t1) + return r.mc.DeleteEventsUpdatedBefore(r.cal, r.t1) +} - for _, item := range r.gc.ListEventUpdatesForever(syncToken) { - // r.mc.UpsertOneEvent(convert.MongoEventFromGoogleEvent2(item.ev, time.Now()/*todo*/)) - syncToken = item.SyncToken - _ = syncToken +func (r *calEventsReader) sync() error { + mongoclient.LogWithCal(r.cal, "syncing with", r.syncToken) + events, nextSyncToken, err := r.gc.ListEventUpdates(r.cal, r.syncToken) + if err != nil { + return err } + r.syncToken = nextSyncToken + for _, ev := range events { + r.mc.UpsertOneEvent(convert.MongoEventFromGoogleEvent2(&ev, time.Now() /*todo*/)) + } + return nil }