Mercurial > code > home > repos > gcalendarwatch
changeset 58:6c7151126a0b
logging and refactor
author | drewp@bigasterisk.com |
---|---|
date | Thu, 05 Sep 2024 17:01:23 -0700 |
parents | 24f662799710 |
children | 1f8e66cb0108 |
files | calsync/convert/convert.go calsync/event_sync.go calsync/gcalclient/gcalclient.go calsync/gcalclient/listevents.go calsync/gcalclient/service.go calsync/mongoclient/cals_collection.go calsync/mongoclient/events_collection.go calsync/mongoclienttypes/mongoclienttypes.go |
diffstat | 8 files changed, 117 insertions(+), 121 deletions(-) [+] |
line wrap: on
line diff
--- a/calsync/convert/convert.go Thu Sep 05 15:03:05 2024 -0700 +++ b/calsync/convert/convert.go Thu Sep 05 17:01:23 2024 -0700 @@ -6,11 +6,12 @@ "bigasterisk.com/go/gcalendarwatch/gcalclient" "bigasterisk.com/go/gcalendarwatch/mongoclient" + M "bigasterisk.com/go/gcalendarwatch/mongoclienttypes" "google.golang.org/api/calendar/v3" ) -func MongoCalFromGoogleCal(cal *calendar.CalendarListEntry) mongoclient.MongoCal { - return mongoclient.MongoCal{ +func MongoCalFromGoogleCal(cal *calendar.CalendarListEntry) M.MongoCal { + return M.MongoCal{ Url: gcalclient.MakeCalUrl(cal.Id), GoogleId: cal.Id, Summary: cal.Summary, @@ -18,15 +19,7 @@ } } -func MongoEventFromGoogleEvent2( - ev *gcalclient.CalendarEvent, - now time.Time, -) mongoclient.MongoEvent { - return mongoEventFromGoogleEvent(ev, now) - -} - -func mongoEventFromGoogleEvent(ev *gcalclient.CalendarEvent, now time.Time) mongoclient.MongoEvent { +func MongoEventFromGoogleEvent(ev *gcalclient.CalendarEvent, now time.Time) mongoclient.MongoEvent { return mongoclient.MongoEvent{ LastUpdated: now, Url: ev.EventUrl,
--- a/calsync/event_sync.go Thu Sep 05 15:03:05 2024 -0700 +++ b/calsync/event_sync.go Thu Sep 05 17:01:23 2024 -0700 @@ -7,6 +7,7 @@ "bigasterisk.com/go/gcalendarwatch/convert" "bigasterisk.com/go/gcalendarwatch/gcalclient" "bigasterisk.com/go/gcalendarwatch/mongoclient" + M "bigasterisk.com/go/gcalendarwatch/mongoclienttypes" ) // Each calendar syncs like this: @@ -41,13 +42,12 @@ type calEventsReader struct { mc *mongoclient.MongoClient gc *gcalclient.GCalClient - cal mongoclient.MongoCal - t1 time.Time - t2 time.Time + cal M.MongoCal + t1, t2 time.Time syncToken string } -func newCalEventsReader(mc *mongoclient.MongoClient, gc *gcalclient.GCalClient, cal mongoclient.MongoCal, t1 time.Time, t2 time.Time) *calEventsReader { +func newCalEventsReader(mc *mongoclient.MongoClient, gc *gcalclient.GCalClient, cal M.MongoCal, t1, t2 time.Time) *calEventsReader { return &calEventsReader{mc, gc, cal, t1, t2, ""} } @@ -75,21 +75,20 @@ return err } for _, ev := range events { - r.mc.UpsertOneEvent(convert.MongoEventFromGoogleEvent2(&ev, time.Now() /*todo*/)) + r.mc.UpsertOneEvent(convert.MongoEventFromGoogleEvent(&ev, time.Now() /*todo*/)) } return r.mc.DeleteEventsUpdatedBefore(r.cal, r.t1) } 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*/)) + r.mc.UpsertOneEvent(convert.MongoEventFromGoogleEvent(&ev, time.Now() /*todo*/)) } return nil
--- a/calsync/gcalclient/gcalclient.go Thu Sep 05 15:03:05 2024 -0700 +++ b/calsync/gcalclient/gcalclient.go Thu Sep 05 17:01:23 2024 -0700 @@ -12,9 +12,7 @@ "log" "net/url" "strings" - "time" - "bigasterisk.com/go/gcalendarwatch/mongoclient" "google.golang.org/api/calendar/v3" ) @@ -41,7 +39,7 @@ } func New(ctx context.Context) (*GCalClient, error) { - err, srv := newService(ctx) + srv, err := newService(ctx) if err != nil { log.Fatalf("Unable to retrieve Calendar client: %v", err) } @@ -59,7 +57,7 @@ return nil, err } - // do not submit + // todo: do not submit debugFilterCals(list) return list.Items, nil @@ -76,85 +74,9 @@ list.Items = ret } - func shortDebugHash(pageToken string) string { if pageToken == "" { return "(empty)" } return fmt.Sprintf("%x", md5.Sum([]byte(pageToken))) } - -func (gc *GCalClient) ListEventsInRange(cal mongoclient.MongoCal, t1, t2 time.Time) ( - events []CalendarEvent, nextSyncToken string, err error) { - mongoclient.LogWithCal(cal, "ListEventsInRange", t1, "to", t2) - - call := func(pageToken string) *calendar.EventsListCall { - return rangedEventsCall(gc.srv, cal.GoogleId, t1, t2, pageToken) - } - events, nextSyncToken, err = readEventsPages(cal, call) - if err != nil { - return nil, "", err - } - - return events, nextSyncToken, nil -} - -func (gc *GCalClient) ListEventUpdates(cal mongoclient.MongoCal, syncToken string) ( - events []CalendarEvent, nextSyncToken string, err error) { - mongoclient.LogWithCal(cal, "ListEventUpdates", syncToken) - - call := func(pageToken string) *calendar.EventsListCall { - return syncEventsCall(gc.srv, cal.GoogleId, syncToken, pageToken) - } - events, nextSyncToken, err = readEventsPages(cal, call) - if err != nil { - return nil, "", err - } - - return events, nextSyncToken, nil -} - -func readEventsPages(cal mongoclient.MongoCal, call func(string) *calendar.EventsListCall) ( - events []CalendarEvent, syncToken string, err error) { - - events = make([]CalendarEvent, 0) - err = nil - - pageToken := "" - for { - mongoclient.LogWithCal(cal, "getting another page", shortDebugHash(pageToken)) - pageResult, err2 := call(pageToken).Do() - if err2 != nil { - log.Fatal(err2) - return nil, "", err2 - } - - // Placement is important! This must run even if the result set is empty. - syncToken = pageResult.NextSyncToken - - mongoclient.LogWithCal(cal, "got page with", len(pageResult.Items), "events") - if len(pageResult.Items) == 0 { - break - } - - for _, ev := range pageResult.Items { - if ev.Status == "cancelled" { - log.Fatal("todo") - } - events = append(events, CalendarEvent{ - Event: ev, - CalendarUrl: cal.Url, - EventUrl: MakeEventUrl(cal.Url, ev.Id), - }) - } - - - - if pageResult.NextPageToken == "" { - break - } - pageToken = pageResult.NextPageToken - } - mongoclient.LogWithCal(cal, "total events read: ", len(events), "with syncToken", syncToken) - return events, syncToken, nil -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calsync/gcalclient/listevents.go Thu Sep 05 17:01:23 2024 -0700 @@ -0,0 +1,80 @@ +package gcalclient + +import ( + "log" + "time" + + M "bigasterisk.com/go/gcalendarwatch/mongoclienttypes" + "google.golang.org/api/calendar/v3" +) + +func (gc *GCalClient) ListEventsInRange(cal M.MongoCal, t1, t2 time.Time) ( + events []CalendarEvent, nextSyncToken string, err error) { + log.Println(M.Prefix(cal), "ListEventsInRange", t1, "to", t2) + + call := func(pageToken string) *calendar.EventsListCall { + return rangedEventsCall(gc.srv, cal.GoogleId, t1, t2, pageToken) + } + events, nextSyncToken, err = readEventsPages(cal, call) + if err != nil { + return nil, "", err + } + + return events, nextSyncToken, nil +} + +func (gc *GCalClient) ListEventUpdates(cal M.MongoCal, syncToken string) ( + events []CalendarEvent, nextSyncToken string, err error) { + log.Println(M.Prefix(cal), "ListEventUpdates", syncToken) + + call := func(pageToken string) *calendar.EventsListCall { + return syncEventsCall(gc.srv, cal.GoogleId, syncToken, pageToken) + } + events, nextSyncToken, err = readEventsPages(cal, call) + if err != nil { + return nil, "", err + } + + return events, nextSyncToken, nil +} + +func readEventsPages(cal M.MongoCal, call func(string) *calendar.EventsListCall) ( + events []CalendarEvent, syncToken string, err error) { + + events = make([]CalendarEvent, 0) + + pageToken := "" + for { + log.Println(M.Prefix(cal), "getting another page", shortDebugHash(pageToken)) + pageResult, err := call(pageToken).Do() + if err != nil { + return nil, "", err + } + + // Placement is important! This must run even if the result set is empty. + syncToken = pageResult.NextSyncToken + + log.Println(M.Prefix(cal), "got page with", len(pageResult.Items), "events") + if len(pageResult.Items) == 0 { + break + } + + for _, ev := range pageResult.Items { + if ev.Status == "cancelled" { + log.Fatal("todo") + } + events = append(events, CalendarEvent{ + Event: ev, + CalendarUrl: cal.Url, + EventUrl: MakeEventUrl(cal.Url, ev.Id), + }) + } + + if pageResult.NextPageToken == "" { + break + } + pageToken = pageResult.NextPageToken + } + log.Println(M.Prefix(cal), "total events read: ", len(events), "with syncToken", syncToken) + return events, syncToken, nil +}
--- a/calsync/gcalclient/service.go Thu Sep 05 15:03:05 2024 -0700 +++ b/calsync/gcalclient/service.go Thu Sep 05 17:01:23 2024 -0700 @@ -69,7 +69,7 @@ json.NewEncoder(f).Encode(token) } -func newService(ctx context.Context) (error, *calendar.Service) { +func newService(ctx context.Context) (*calendar.Service, error) { b, err := os.ReadFile("./credentials.json") if err != nil { log.Fatalf("Unable to read client secret file: %v", err) @@ -82,6 +82,5 @@ } client := getClient(config) - srv, err := calendar.NewService(ctx, option.WithHTTPClient(client)) - return err, srv + return calendar.NewService(ctx, option.WithHTTPClient(client)) }
--- a/calsync/mongoclient/cals_collection.go Thu Sep 05 15:03:05 2024 -0700 +++ b/calsync/mongoclient/cals_collection.go Thu Sep 05 17:01:23 2024 -0700 @@ -3,28 +3,21 @@ import ( "log" + M "bigasterisk.com/go/gcalendarwatch/mongoclienttypes" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo/options" ) -// docs in calsCollection -type MongoCal struct { - Url string `bson:"_id"` // bigasterisk.com/... - GoogleId string `bson:"googleId"` - Summary string `bson:"summary"` - Description string `bson:"description"` -} - -func (c *MongoClient) GetAllCals() ([]MongoCal, error) { +func (c *MongoClient) GetAllCals() ([]M.MongoCal, error) { cur, err := c.calsCollection.Find(c.ctx, bson.D{}) if err != nil { return nil, err } defer cur.Close(c.ctx) - var cals []MongoCal + var cals []M.MongoCal for cur.Next(c.ctx) { - var cal MongoCal + var cal M.MongoCal if err := cur.Decode(&cal); err != nil { return nil, err } @@ -33,11 +26,10 @@ return cals, nil } -func (c *MongoClient) UpsertOneCal(cal MongoCal) error { +func (c *MongoClient) UpsertOneCal(cal M.MongoCal) error { filter := bson.M{"_id": cal.Url} update := bson.M{"$set": cal} - _, err := c.calsCollection.UpdateOne(c.ctx, filter, update, - options.Update().SetUpsert(true)) + _, err := c.calsCollection.UpdateOne(c.ctx, filter, update, options.Update().SetUpsert(true)) if err != nil { return err }
--- a/calsync/mongoclient/events_collection.go Thu Sep 05 15:03:05 2024 -0700 +++ b/calsync/mongoclient/events_collection.go Thu Sep 05 17:01:23 2024 -0700 @@ -4,14 +4,11 @@ "log" "time" + M "bigasterisk.com/go/gcalendarwatch/mongoclienttypes" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo/options" ) -func LogWithCal(cal MongoCal, msg ...interface{}) { - log.Println("cal:", (cal.GoogleId+"........")[:8], msg) -} - func (c *MongoClient) UpsertOneEvent(ev MongoEvent) error { filter := bson.M{"_id": ev.Url} setFields := ev @@ -23,14 +20,14 @@ return nil } -func (c *MongoClient) DeleteEventsUpdatedBefore(cal MongoCal, t time.Time) error { +func (c *MongoClient) DeleteEventsUpdatedBefore(cal M.MongoCal, t time.Time) error { res, err := c.eventsCollection.DeleteMany( c.ctx, bson.M{"calendarUrl": cal.Url, "lastUpdated": bson.M{"$lt": t}}) - LogWithCal(cal, "deleted", res.DeletedCount, "events updated before", t) if err != nil { return err } + log.Println(M.Prefix(cal), "deleted", res.DeletedCount, "events updated before", t) return nil }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calsync/mongoclienttypes/mongoclienttypes.go Thu Sep 05 17:01:23 2024 -0700 @@ -0,0 +1,14 @@ +package mongoclienttypes + +// Docs in calsCollection. +type MongoCal struct { + Url string `bson:"_id"` // bigasterisk.com/... + GoogleId string `bson:"googleId"` + Summary string `bson:"summary"` + Description string `bson:"description"` +} + +// For logging. +func Prefix(cal MongoCal) string { + return "<cal " + (cal.GoogleId + "........")[:8] + ">" +}