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
 }