changeset 54:3a12a3ac9164

refactor. run 30s forever. doesn't work on 2+ cals
author drewp@bigasterisk.com
date Tue, 20 Aug 2024 12:18:46 -0700
parents f248f018a663
children 627c815f83bb
files calsync/event_sync.go calsync/gcalclient/gcalclient.go
diffstat 2 files changed, 70 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/calsync/event_sync.go	Mon Aug 19 19:28:50 2024 -0700
+++ b/calsync/event_sync.go	Tue Aug 20 12:18:46 2024 -0700
@@ -27,7 +27,7 @@
 				),
 			)
 		} else {
-			log.Println("cal", ev.CalId, "ready for cleanup - todo")
+			log.Println("cal", ev.CalId, "ready for cleanup")
 			log.Println("t=", t)
 			mc.DeleteEventsUpdatedBefore(t)
 		}
--- a/calsync/gcalclient/gcalclient.go	Mon Aug 19 19:28:50 2024 -0700
+++ b/calsync/gcalclient/gcalclient.go	Tue Aug 20 12:18:46 2024 -0700
@@ -11,6 +11,8 @@
 	"google.golang.org/api/calendar/v3"
 )
 
+const urlBase = "http://bigasterisk.com/calendar/"
+
 type GCalClient struct {
 	ctx context.Context
 	srv *calendar.Service
@@ -24,7 +26,7 @@
 }
 
 func MakeCalUrl(calId string) string {
-	return "http://bigasterisk.com/calendar/" + url.QueryEscape(calId)
+	return urlBase + url.QueryEscape(calId)
 }
 
 func MakeEventUrl(calUrl string, evId string) string {
@@ -72,75 +74,90 @@
 	initialFillStart, initialFillEnd time.Time,
 	out chan *FindEventsMessage,
 ) error {
-
 	cals, err := mc.GetAllCals()
 	if err != nil {
 		return err
 	}
 	log.Println("reading", len(cals), "calendars")
 	for calNum, cal := range cals {
-		t := time.Now()
-		log.Println("  cal", calNum, cal.Url)
-		log.Println("  cal", calNum, "readEventsInRange", "from", initialFillStart, "to", initialFillEnd)
-		syncToken, err := gc.readEventsInRange(&cal, initialFillStart, initialFillEnd, out)
-		if err != nil {
-			return err
-		}
-
-		out <- &FindEventsMessage{nil, cal.GoogleId, t}
-
-		ew := gc.NewEventWatch(&cal, t, syncToken, out)
-
-		for loop := 0; loop < 30; loop++ {
-			log.Println("")
-			log.Println("tail loop", loop, "for", cal.Url)
-			err := ew.GetMoreEvents()
-			if err != nil {
-				return err
-			}
-			time.Sleep(2 * time.Second)
-		}
+		go calRoutine(calNum, cal, initialFillStart, initialFillEnd, gc, out)
 	}
 
 	return nil
 }
 
+func calRoutine(calNum int, cal mongoclient.MongoCal, initialFillStart time.Time, initialFillEnd time.Time, gc *GCalClient, out chan *FindEventsMessage) bool {
+	t := time.Now()
+	log.Println("  cal", calNum, cal.Url)
+	log.Println("  cal", calNum, "readEventsInRange", "from", initialFillStart, "to", initialFillEnd)
+	syncToken, err := gc.readEventsInRange(&cal, initialFillStart, initialFillEnd, out)
+	if err != nil {
+		log.Panicln(err)
+		return true
+	}
+
+	out <- &FindEventsMessage{nil, cal.GoogleId, t}
+
+	ew := gc.NewEventWatch(&cal, t, syncToken, out)
+
+	for loop := 0; ; loop++ {
+		log.Println("")
+		log.Println("tail loop", loop, "for", cal.Url)
+		err := ew.GetMoreEvents()
+		if err != nil {
+			log.Panicln(err)
+			return true
+		}
+		time.Sleep(10 * time.Minute)
+	}
+	
+}
+
 // Synchronous.
-func (gc *GCalClient) readEventsInRange(
-	cal *mongoclient.MongoCal,
-	initialFillStart, initialFillEnd time.Time,
-	out chan *FindEventsMessage,
-) (string, error) {
-	log.Println(
-		"    get initial events for", cal.Url, "between",
-		initialFillStart, "and", initialFillEnd)
+func (gc *GCalClient) readEventsInRange(cal *mongoclient.MongoCal, t1, t2 time.Time, out chan *FindEventsMessage) (string, error) {
+	log.Println("    get initial events for", cal.Url, "between", t1, "and", t2)
 
 	pageToken := ""
 	syncToken := ""
-
+	var err error
+	var done bool
 	for {
-		log.Println("      getting another page", pageToken)
-		events, err := rangedEventsCall(gc.srv, cal.GoogleId, initialFillStart, initialFillEnd, pageToken).Do()
+		done, syncToken, pageToken, err = readEventsPage(gc, cal, t1, t2, pageToken, out)
 		if err != nil {
 			return "", err
 		}
-
-		log.Println("        got", len(events.Items), "events, sync=", events.NextSyncToken)
-		if len(events.Items) == 0 {
+		if done {
 			break
 		}
-
-		sendEvents(events, cal, out)
-
-		syncToken = events.NextSyncToken
-		if events.NextPageToken == "" {
-			break
-		}
-		pageToken = events.NextPageToken
 	}
 	return syncToken, nil
 }
 
+func readEventsPage(gc *GCalClient, cal *mongoclient.MongoCal, t1, t2 time.Time, pageToken string, out chan *FindEventsMessage) (done bool, syncToken, nextPageToken string, err error) {
+	log.Println("      getting another page", pageToken)
+	events, err := rangedEventsCall(gc.srv, cal.GoogleId, t1, t2, pageToken).Do()
+	if err != nil {
+		return
+	}
+
+	log.Println("        got", len(events.Items), "events, sync=", events.NextSyncToken)
+	if len(events.Items) == 0 {
+		done = true
+		return
+	}
+
+	sendEvents(events, cal, out)
+
+	syncToken = events.NextSyncToken
+	if events.NextPageToken == "" {
+		done = true
+		return
+	}
+	nextPageToken = events.NextPageToken
+	syncToken = events.NextSyncToken
+	return
+}
+
 // Send a page of calendar.Events over a channel, as CalendarEvent structs.
 func sendEvents(events *calendar.Events, cal *mongoclient.MongoCal, out chan *FindEventsMessage) {
 	for _, event := range events.Items {
@@ -178,8 +195,8 @@
 // Call this when there are likely new changes to sync.
 func (w *eventWatch) GetMoreEvents() error {
 	call := syncEventsCall(w.gc.srv, w.cal.GoogleId)
+
 	log.Println("listing events on", w.cal.GoogleId, "with")
-
 	if w.nextPageToken != "" {
 		call = call.PageToken(w.nextPageToken)
 		log.Println("   pageToken", w.nextPageToken)
@@ -190,15 +207,14 @@
 		call = call.UpdatedMin((w.modSince.Format(time.RFC3339)))
 		log.Println("   updatedMin", w.modSince.Format(time.RFC3339))
 	}
-	ret, err := call.Do()
+	events, err := call.Do()
 	if err != nil {
 		return err
 	}
-	w.nextSyncToken = ret.NextSyncToken
-	w.nextPageToken = ret.NextPageToken
-	log.Println(len(ret.Items), "more events received")
-	sendEvents(ret, w.cal, w.out)
-	log.Println("got nextSyncToken=", w.nextSyncToken)
-	log.Println("got nextPageToken=", w.nextPageToken)
+	w.nextSyncToken = events.NextSyncToken
+	w.nextPageToken = events.NextPageToken
+	log.Println(len(events.Items), "more events received")
+	sendEvents(events, w.cal, w.out)
+	log.Println("got nextSyncToken=", w.nextSyncToken, " nextPageToken=", w.nextPageToken)
 	return err
 }