diff --git a/cal/memory.go b/cal/memory.go new file mode 100644 index 0000000..3cbab2f --- /dev/null +++ b/cal/memory.go @@ -0,0 +1,60 @@ +package main + +import ( + "errors" + "sync" + + "go-mod.ewintr.nl/planner/item" +) + +type Memory struct { + events map[string]item.Event + mutex sync.RWMutex +} + +func NewMemory() *Memory { + return &Memory{ + events: make(map[string]item.Event), + } +} + +func (r *Memory) Find(id string) (item.Event, error) { + r.mutex.RLock() + defer r.mutex.RUnlock() + + event, exists := r.events[id] + if !exists { + return item.Event{}, errors.New("event not found") + } + return event, nil +} + +func (r *Memory) FindAll() ([]item.Event, error) { + r.mutex.RLock() + defer r.mutex.RUnlock() + + events := make([]item.Event, 0, len(r.events)) + for _, event := range r.events { + events = append(events, event) + } + return events, nil +} + +func (r *Memory) Store(e item.Event) error { + r.mutex.Lock() + defer r.mutex.Unlock() + + r.events[e.ID] = e + return nil +} + +func (r *Memory) Delete(id string) error { + r.mutex.Lock() + defer r.mutex.Unlock() + + if _, exists := r.events[id]; !exists { + return errors.New("event not found") + } + delete(r.events, id) + return nil +} diff --git a/sync/service/memory.go b/sync/service/memory.go index c421ee5..cbcaf8b 100644 --- a/sync/service/memory.go +++ b/sync/service/memory.go @@ -2,6 +2,7 @@ package main import ( "slices" + "sync" "time" "go-mod.ewintr.nl/planner/item" @@ -9,6 +10,7 @@ import ( type Memory struct { items map[string]item.Item + mutex sync.RWMutex } func NewMemory() *Memory { @@ -18,12 +20,18 @@ func NewMemory() *Memory { } func (m *Memory) Update(item item.Item) error { + m.mutex.Lock() + defer m.mutex.Unlock() + m.items[item.ID] = item return nil } func (m *Memory) Updated(kinds []item.Kind, timestamp time.Time) ([]item.Item, error) { + m.mutex.RLock() + defer m.mutex.RUnlock() + result := make([]item.Item, 0) for _, i := range m.items {