view calsync/gcalclient/gcalclient.go @ 51:a9b720445bcf

now roughly syncs cals and events to mongodb, one time
author drewp@bigasterisk.com
date Mon, 19 Aug 2024 14:42:27 -0700
parents 2991c1166852
children 5f7c393577e9
line wrap: on
line source

package gcalclient

import (
	"context"
	"log"
	"net/url"
	"strings"
	"time"

	"bigasterisk.com/go/gcalendarwatch/mongoclient"
	"google.golang.org/api/calendar/v3"
)

type GCalClient struct {
	ctx context.Context
	srv *calendar.Service
}

// Same as calendar.Event, but includes our urls
type CalendarEvent struct {
	*calendar.Event
	CalendarUrl string
	EventUrl    string
}

func MakeCalUrl(calId string) string {
	return "http://bigasterisk.com/calendar/" + url.QueryEscape(calId)
}

func MakeEventUrl(calUrl string, evId string) string {
	return calUrl + "/" + url.QueryEscape(evId)
}

func MakeEventUrl3(googleCalId string, evId string) string {
	return MakeEventUrl("http://bigasterisk.com/calendar/"+
		url.QueryEscape(googleCalId), evId)
}
func New(ctx context.Context) (*GCalClient, error) {
	// If modifying these scopes, delete your previously saved token.json.
	err, srv := newService(ctx)
	if err != nil {
		log.Fatalf("Unable to retrieve Calendar client: %v", err)
	}
	return &GCalClient{ctx, srv}, nil
}

func (gc *GCalClient) Close() {
	// todo: disconnect watches if possible
}

func (gc *GCalClient) AllCalendars(maxResults int64) ([]*calendar.CalendarListEntry, error) {
	// todo: pagination
	list, err := gc.srv.CalendarList.List().MaxResults(maxResults).Do()
	if err != nil {
		return nil, err
	}
	list.Items = list.Items[:4]
	return list.Items, nil
}

// FindEvents considers all calendars
func (gc *GCalClient) FindEvents(mc *mongoclient.MongoClient, s time.Time, maxEventsPerCalendar int64) ([]*CalendarEvent, error) {
	cals, err := mc.GetAllCals()
	if err != nil {
		return nil, err
	}
	log.Println("reading", len(cals), "calendars")
	ret := make([]*CalendarEvent, 0)
	for _, cal := range cals {
		calUrl := cal.Url
		events, err := gc.srv.
		Events.List(cal.GoogleId).
		ShowDeleted(false).
			SingleEvents(true).
			TimeMin(s.Format(time.RFC3339)).
			MaxResults(maxEventsPerCalendar).
			OrderBy("startTime").
			Do()
			if err != nil {
				return nil, err
			}
		log.Println(len(events.Items), "events from", calUrl)
		for _, event := range events.Items {
			ev := &CalendarEvent{
				Event:       event,
				CalendarUrl: calUrl,
				EventUrl:    MakeEventUrl(calUrl, event.Id),
			}
			ret = append(ret, ev)
		}
	}
	return ret, nil
}