1+ package main
2+
3+ import (
4+ "context"
5+ "database/sql"
6+ "fmt"
7+ )
8+
9+ // CalendarFactory handles creation and management of calendar providers
10+ type CalendarFactory struct {
11+ config * Config
12+ db * sql.DB
13+ ctx context.Context
14+ }
15+
16+ // NewCalendarFactory creates a new calendar factory instance
17+ func NewCalendarFactory (ctx context.Context , config * Config , db * sql.DB ) * CalendarFactory {
18+ return & CalendarFactory {
19+ config : config ,
20+ db : db ,
21+ ctx : ctx ,
22+ }
23+ }
24+
25+ // GetAllCalendars returns all calendar providers for all accounts
26+ func (cf * CalendarFactory ) GetAllCalendars () (map [string ]map [string ]CalendarProvider , map [string ][]CalendarInfo , error ) {
27+ calendars := getCalendarsFromDB (cf .db )
28+ providers := make (map [string ]map [string ]CalendarProvider )
29+
30+ for accountName , calendarInfos := range calendars {
31+ providers [accountName ] = make (map [string ]CalendarProvider )
32+
33+ // Initialize providers for each type needed by this account
34+ for i , calInfo := range calendarInfos {
35+ switch calInfo .ProviderType {
36+ case "google" :
37+ if _ , exists := providers [accountName ]["google" ]; ! exists {
38+ client := getClient (cf .ctx , oauthConfig , cf .db , accountName , cf .config )
39+ googleProvider , err := NewGoogleCalendarProvider (cf .ctx , client )
40+ if err != nil {
41+ return nil , nil , fmt .Errorf ("error creating Google calendar provider: %w" , err )
42+ }
43+ providers [accountName ]["google" ] = googleProvider
44+ }
45+
46+ case "caldav" :
47+ // Get the server configuration based on provider_config
48+ var serverConfig CalDAVConfig
49+ serverName := calInfo .ProviderConfig
50+
51+ // If there's no server name stored, we need to ask the user to reconfigure this calendar
52+ if serverName == "" || serverName == "default" {
53+ return nil , nil , fmt .Errorf ("calendar references removed legacy CalDAV configuration; please remove and re-add this calendar" )
54+ }
55+
56+ // Use the server from the CalDAV servers config
57+ if server , ok := cf .config .CalDAVs [serverName ]; ok {
58+ serverConfig = server
59+ } else {
60+ return nil , nil , fmt .Errorf ("CalDAV server '%s' not found in configuration" , serverName )
61+ }
62+
63+ // Create a provider key that includes the server name to allow multiple servers
64+ providerKey := "caldav-" + serverName
65+
66+ // Only create the provider if we don't already have one for this server
67+ if _ , exists := providers [accountName ][providerKey ]; ! exists {
68+ caldavProvider , err := NewCalDAVProvider (cf .ctx , serverConfig .ServerURL , serverConfig .Username , serverConfig .Password )
69+ if err != nil {
70+ return nil , nil , fmt .Errorf ("error connecting to CalDAV server %s: %w" , serverName , err )
71+ }
72+ providers [accountName ][providerKey ] = caldavProvider
73+ }
74+
75+ // Update the calendar info to use the correct provider key
76+ calendarInfos [i ].ProviderKey = providerKey
77+
78+ default :
79+ return nil , nil , fmt .Errorf ("unsupported provider type: %s" , calInfo .ProviderType )
80+ }
81+ }
82+ }
83+
84+ return providers , calendars , nil
85+ }
86+
87+ // CreateCalendarProvider creates a specific calendar provider
88+ func (cf * CalendarFactory ) CreateCalendarProvider (providerType string , accountName string , serverName string ) (CalendarProvider , error ) {
89+ switch providerType {
90+ case "google" :
91+ client := getClient (cf .ctx , oauthConfig , cf .db , accountName , cf .config )
92+ return NewGoogleCalendarProvider (cf .ctx , client )
93+
94+ case "caldav" :
95+ // Get the server configuration
96+ if serverName == "" || serverName == "default" {
97+ return nil , fmt .Errorf ("no server name provided for CalDAV provider" )
98+ }
99+
100+ // Use the server from the CalDAV servers config
101+ var serverConfig CalDAVConfig
102+ if server , ok := cf .config .CalDAVs [serverName ]; ok {
103+ serverConfig = server
104+ } else {
105+ return nil , fmt .Errorf ("CalDAV server '%s' not found in configuration" , serverName )
106+ }
107+
108+ return NewCalDAVProvider (cf .ctx , serverConfig .ServerURL , serverConfig .Username , serverConfig .Password )
109+
110+ default :
111+ return nil , fmt .Errorf ("unsupported provider type: %s" , providerType )
112+ }
113+ }
114+
115+ // ValidateCalendarAccess checks if the provided calendar ID is accessible
116+ func (cf * CalendarFactory ) ValidateCalendarAccess (provider CalendarProvider , calendarID string ) error {
117+ return provider .GetCalendar (calendarID )
118+ }
0 commit comments