package api import ( "context" "fmt" "time" "task-dashboard/internal/models" "google.golang.org/api/calendar/v3" "google.golang.org/api/option" ) type GoogleCalendarClient struct { srv *calendar.Service calendarID string } func NewGoogleCalendarClient(ctx context.Context, credentialsFile, calendarID string) (*GoogleCalendarClient, error) { srv, err := calendar.NewService(ctx, option.WithCredentialsFile(credentialsFile)) if err != nil { return nil, fmt.Errorf("unable to retrieve Calendar client: %v", err) } return &GoogleCalendarClient{ srv: srv, calendarID: calendarID, }, nil } func (c *GoogleCalendarClient) GetUpcomingEvents(ctx context.Context, maxResults int) ([]models.CalendarEvent, error) { t := time.Now().Format(time.RFC3339) events, err := c.srv.Events.List(c.calendarID).ShowDeleted(false). SingleEvents(true).TimeMin(t).MaxResults(int64(maxResults)).OrderBy("startTime").Do() if err != nil { return nil, fmt.Errorf("unable to retrieve events: %v", err) } var calendarEvents []models.CalendarEvent for _, item := range events.Items { var start, end time.Time if item.Start.DateTime == "" { // All-day event start, _ = time.Parse("2006-01-02", item.Start.Date) end, _ = time.Parse("2006-01-02", item.End.Date) } else { start, _ = time.Parse(time.RFC3339, item.Start.DateTime) end, _ = time.Parse(time.RFC3339, item.End.DateTime) } calendarEvents = append(calendarEvents, models.CalendarEvent{ ID: item.Id, Summary: item.Summary, Description: item.Description, Start: start, End: end, HTMLLink: item.HtmlLink, }) } return calendarEvents, nil }