comparison calsync/gcalclient/gcalclient.go @ 58:6c7151126a0b

logging and refactor
author drewp@bigasterisk.com
date Thu, 05 Sep 2024 17:01:23 -0700
parents 24f662799710
children 3b0595c2bf03
comparison
equal deleted inserted replaced
57:24f662799710 58:6c7151126a0b
10 "crypto/md5" 10 "crypto/md5"
11 "fmt" 11 "fmt"
12 "log" 12 "log"
13 "net/url" 13 "net/url"
14 "strings" 14 "strings"
15 "time"
16 15
17 "bigasterisk.com/go/gcalendarwatch/mongoclient"
18 "google.golang.org/api/calendar/v3" 16 "google.golang.org/api/calendar/v3"
19 ) 17 )
20 18
21 const urlBase = "http://bigasterisk.com/calendar/" 19 const urlBase = "http://bigasterisk.com/calendar/"
22 20
39 func MakeEventUrl(calUrl string, evId string) string { 37 func MakeEventUrl(calUrl string, evId string) string {
40 return calUrl + "/" + url.QueryEscape(evId) 38 return calUrl + "/" + url.QueryEscape(evId)
41 } 39 }
42 40
43 func New(ctx context.Context) (*GCalClient, error) { 41 func New(ctx context.Context) (*GCalClient, error) {
44 err, srv := newService(ctx) 42 srv, err := newService(ctx)
45 if err != nil { 43 if err != nil {
46 log.Fatalf("Unable to retrieve Calendar client: %v", err) 44 log.Fatalf("Unable to retrieve Calendar client: %v", err)
47 } 45 }
48 return &GCalClient{ctx, srv}, nil 46 return &GCalClient{ctx, srv}, nil
49 } 47 }
57 list, err := gc.srv.CalendarList.List().MaxResults( /*maxResults*/ 100).Do() 55 list, err := gc.srv.CalendarList.List().MaxResults( /*maxResults*/ 100).Do()
58 if err != nil { 56 if err != nil {
59 return nil, err 57 return nil, err
60 } 58 }
61 59
62 // do not submit 60 // todo: do not submit
63 debugFilterCals(list) 61 debugFilterCals(list)
64 62
65 return list.Items, nil 63 return list.Items, nil
66 } 64 }
67 65
74 } 72 }
75 } 73 }
76 list.Items = ret 74 list.Items = ret
77 } 75 }
78 76
79
80 func shortDebugHash(pageToken string) string { 77 func shortDebugHash(pageToken string) string {
81 if pageToken == "" { 78 if pageToken == "" {
82 return "(empty)" 79 return "(empty)"
83 } 80 }
84 return fmt.Sprintf("%x", md5.Sum([]byte(pageToken))) 81 return fmt.Sprintf("%x", md5.Sum([]byte(pageToken)))
85 } 82 }
86
87 func (gc *GCalClient) ListEventsInRange(cal mongoclient.MongoCal, t1, t2 time.Time) (
88 events []CalendarEvent, nextSyncToken string, err error) {
89 mongoclient.LogWithCal(cal, "ListEventsInRange", t1, "to", t2)
90
91 call := func(pageToken string) *calendar.EventsListCall {
92 return rangedEventsCall(gc.srv, cal.GoogleId, t1, t2, pageToken)
93 }
94 events, nextSyncToken, err = readEventsPages(cal, call)
95 if err != nil {
96 return nil, "", err
97 }
98
99 return events, nextSyncToken, nil
100 }
101
102 func (gc *GCalClient) ListEventUpdates(cal mongoclient.MongoCal, syncToken string) (
103 events []CalendarEvent, nextSyncToken string, err error) {
104 mongoclient.LogWithCal(cal, "ListEventUpdates", syncToken)
105
106 call := func(pageToken string) *calendar.EventsListCall {
107 return syncEventsCall(gc.srv, cal.GoogleId, syncToken, pageToken)
108 }
109 events, nextSyncToken, err = readEventsPages(cal, call)
110 if err != nil {
111 return nil, "", err
112 }
113
114 return events, nextSyncToken, nil
115 }
116
117 func readEventsPages(cal mongoclient.MongoCal, call func(string) *calendar.EventsListCall) (
118 events []CalendarEvent, syncToken string, err error) {
119
120 events = make([]CalendarEvent, 0)
121 err = nil
122
123 pageToken := ""
124 for {
125 mongoclient.LogWithCal(cal, "getting another page", shortDebugHash(pageToken))
126 pageResult, err2 := call(pageToken).Do()
127 if err2 != nil {
128 log.Fatal(err2)
129 return nil, "", err2
130 }
131
132 // Placement is important! This must run even if the result set is empty.
133 syncToken = pageResult.NextSyncToken
134
135 mongoclient.LogWithCal(cal, "got page with", len(pageResult.Items), "events")
136 if len(pageResult.Items) == 0 {
137 break
138 }
139
140 for _, ev := range pageResult.Items {
141 if ev.Status == "cancelled" {
142 log.Fatal("todo")
143 }
144 events = append(events, CalendarEvent{
145 Event: ev,
146 CalendarUrl: cal.Url,
147 EventUrl: MakeEventUrl(cal.Url, ev.Id),
148 })
149 }
150
151
152
153 if pageResult.NextPageToken == "" {
154 break
155 }
156 pageToken = pageResult.NextPageToken
157 }
158 mongoclient.LogWithCal(cal, "total events read: ", len(events), "with syncToken", syncToken)
159 return events, syncToken, nil
160 }