From 9af596fb290d3ad968ea45b3d89c76b534041f6c Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Fri, 23 Aug 2024 10:52:17 +0200 Subject: [PATCH] wip --- handler/handler.go | 11 +++++--- storage/memory.go | 58 ++++++++++++++++++++++-------------------- storage/memory_test.go | 12 ++++----- storage/storage.go | 11 ++++---- 4 files changed, 50 insertions(+), 42 deletions(-) diff --git a/handler/handler.go b/handler/handler.go index d3a3f74..2262d70 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -13,7 +13,7 @@ func Index(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `{"status":"ok"}`) } -func NewSyncHandler(mem storage.Repository) func(w http.ResponseWriter, r *http.Request) { +func NewSyncHandler(mem storage.Syncer) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { timestamp := time.Time{} tsStr := r.URL.Query().Get("ts") @@ -25,7 +25,7 @@ func NewSyncHandler(mem storage.Repository) func(w http.ResponseWriter, r *http. } } - items, err := mem.NewSince(timestamp) + items, err := mem.Updated(timestamp) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -39,5 +39,10 @@ func NewSyncHandler(mem storage.Repository) func(w http.ResponseWriter, r *http. fmt.Fprint(w, string(body)) } - +} + +func NewStoreHandler(mem storage.Syncer) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + + } } diff --git a/storage/memory.go b/storage/memory.go index 8c4b7ca..a28a3b0 100644 --- a/storage/memory.go +++ b/storage/memory.go @@ -6,21 +6,34 @@ import ( "code.ewintr.nl/planner/planner" ) +type deletedItem struct { + ID string + Timestamp time.Time +} + type Memory struct { - items map[string]planner.Syncable + items map[string]planner.Syncable + deleted []deletedItem } func NewMemory() *Memory { return &Memory{ - items: make(map[string]planner.Syncable), + items: make(map[string]planner.Syncable), + deleted: make([]deletedItem, 0), } } -func (m *Memory) NewSince(timestamp time.Time) ([]planner.Syncable, error) { +func (m *Memory) Update(item planner.Syncable) error { + m.items[item.ID()] = item + + return nil +} + +func (m *Memory) Updated(timestamp time.Time) ([]planner.Syncable, error) { result := make([]planner.Syncable, 0) for _, i := range m.items { - if timestamp.IsZero() || i.Updated().After(timestamp) { + if timestamp.IsZero() || i.Updated().Equal(timestamp) || i.Updated().After(timestamp) { result = append(result, i) } } @@ -28,35 +41,26 @@ func (m *Memory) NewSince(timestamp time.Time) ([]planner.Syncable, error) { return result, nil } -func (m *Memory) Store(item planner.Syncable) error { - m.items[item.ID()] = item - - return nil -} - -/* -func (m *Memory) RemoveProject(id string) error { - if _, ok := m.items[id]; !ok { +func (m *Memory) Delete(id string) error { + if _, exists := m.items[id]; !exists { return ErrNotFound } + delete(m.items, id) + m.deleted = append(m.deleted, deletedItem{ + ID: id, + Timestamp: time.Now(), + }) return nil } -func (m *Memory) FindProject(id string) (Project, error) { - project, ok := m.items[id] - if !ok { - return Project{}, ErrNotFound +func (m *Memory) Deleted(t time.Time) ([]string, error) { + result := make([]string, 0) + for _, di := range m.deleted { + if di.Timestamp.Equal(t) || di.Timestamp.After(t) { + result = append(result, di.ID) + } } - return project, nil + return result, nil } - -func (m *Memory) FindAllProjects() ([]Project, error) { - items := make([]Project, 0, len(m.items)) - for _, p := range m.items { - items = append(items, p) - } - return items, nil -} -*/ diff --git a/storage/memory_test.go b/storage/memory_test.go index 55cd559..eebd23d 100644 --- a/storage/memory_test.go +++ b/storage/memory_test.go @@ -14,7 +14,7 @@ func TestMemoryItem(t *testing.T) { mem := storage.NewMemory() t.Log("start empty") - actItems, actErr := mem.NewSince(time.Time{}) + actItems, actErr := mem.Updated(time.Time{}) if actErr != nil { t.Errorf("exp nil, got %v", actErr) } @@ -24,10 +24,10 @@ func TestMemoryItem(t *testing.T) { t.Log("add one") t1 := planner.NewTask("test") - if actErr := mem.Store(t1); actErr != nil { + if actErr := mem.Update(t1); actErr != nil { t.Errorf("exp nil, got %v", actErr) } - actItems, actErr = mem.NewSince(time.Time{}) + actItems, actErr = mem.Updated(time.Time{}) if actErr != nil { t.Errorf("exp nil, got %v", actErr) } @@ -42,10 +42,10 @@ func TestMemoryItem(t *testing.T) { t.Log("add second") t2 := planner.NewTask("test 2") - if actErr := mem.Store(t2); actErr != nil { + if actErr := mem.Update(t2); actErr != nil { t.Errorf("exp nil, got %v", actErr) } - actItems, actErr = mem.NewSince(time.Time{}) + actItems, actErr = mem.Updated(time.Time{}) if actErr != nil { t.Errorf("exp nil, got %v", actErr) } @@ -59,7 +59,7 @@ func TestMemoryItem(t *testing.T) { t.Errorf("exp %v, got %v", actItems[1].ID(), t2.ID()) } - actItems, actErr = mem.NewSince(before) + actItems, actErr = mem.Updated(before) if actErr != nil { t.Errorf("exp nil, got %v", actErr) } diff --git a/storage/storage.go b/storage/storage.go index 9dd3b92..375110e 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -11,10 +11,9 @@ var ( ErrNotFound = errors.New("not found") ) -type Repository interface { - NewSince(t time.Time) ([]planner.Syncable, error) - Store(item planner.Syncable) error - // FindTask(id string) (planner.Task, error) - // FindAllTasks() ([]planner.Task, error) - // StoreTask(project planner.Task) error +type Syncer interface { + Update(item planner.Syncable) error + Updated(t time.Time) ([]planner.Syncable, error) + Delete(id string) error + Deleted(t time.Time) ([]string, error) }