-
Notifications
You must be signed in to change notification settings - Fork 10
/
sink_adapter.go
109 lines (91 loc) · 2.77 KB
/
sink_adapter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package adapter
import (
"context"
"fmt"
"time"
"github.com/inovex/CalendarSync/internal/auth"
"github.com/inovex/CalendarSync/internal/models"
"github.com/charmbracelet/log"
"github.com/inovex/CalendarSync/internal/adapter/google"
outlook "github.com/inovex/CalendarSync/internal/adapter/outlook_http"
"github.com/inovex/CalendarSync/internal/adapter/port"
"github.com/inovex/CalendarSync/internal/sync"
)
type SinkAdapter struct {
client sync.Sink
calendarID string
typ Type
logger *log.Logger
}
// SinkClientFactory is a convenience factory. It is needed to retrieve new - default - client implementations.
func SinkClientFactory(typ Type) (sync.Sink, error) {
switch typ {
case GoogleCalendarType:
return new(google.CalendarAPI), nil
case OutlookHttpCalendarType:
return new(outlook.CalendarAPI), nil
default:
return nil, fmt.Errorf("unknown sink adapter client type %s", typ)
}
}
func NewSinkAdapterFromConfig(ctx context.Context, bindPort uint, config ConfigReader, storage auth.Storage, logger *log.Logger) (*SinkAdapter, error) {
client, err := SinkClientFactory(Type(config.Adapter().Type))
if err != nil {
return nil, err
}
if c, ok := client.(port.LogSetter); ok {
c.SetLogger(logger)
}
if c, ok := client.(port.OAuth2Adapter); ok {
if err := c.SetupOauth2(ctx,
auth.Credentials{
Client: auth.Client{
Id: config.Adapter().OAuth.ClientID,
Secret: config.Adapter().OAuth.ClientKey,
},
Tenant: auth.Tenant{
Id: config.Adapter().OAuth.TenantID,
},
CalendarId: config.Adapter().Calendar,
},
storage,
bindPort,
); err != nil {
return nil, err
}
}
// configure adapter client if possible
if c, ok := client.(port.Configurable); ok {
if err := c.Initialize(ctx, config.Adapter().Config); err != nil {
return nil, fmt.Errorf("unable to Initialize adapter %s: %w", config.Adapter().Type, err)
}
}
return &SinkAdapter{
client: client,
calendarID: config.Adapter().Calendar,
typ: Type(config.Adapter().Type),
logger: logger,
}, nil
}
func (a SinkAdapter) Name() string {
return string(a.typ)
}
func (a SinkAdapter) CalendarID() string {
return a.calendarID
}
func (a SinkAdapter) CreateEvent(ctx context.Context, e models.Event) error {
err := a.client.CreateEvent(ctx, e)
return err
}
func (a SinkAdapter) UpdateEvent(ctx context.Context, e models.Event) error {
return a.client.UpdateEvent(ctx, e)
}
func (a SinkAdapter) DeleteEvent(ctx context.Context, e models.Event) error {
return a.client.DeleteEvent(ctx, e)
}
func (a SinkAdapter) EventsInTimeframe(ctx context.Context, start time.Time, end time.Time) ([]models.Event, error) {
return a.client.EventsInTimeframe(ctx, start, end)
}
func (a SinkAdapter) GetCalendarID() string {
return a.client.GetCalendarID()
}