From a1ee001bba00b49a0d402871aa97b5fcc7240d3d Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Thu, 22 Aug 2024 07:18:50 +0200 Subject: [PATCH] sync endpoint --- handler/handler.go | 16 +++++++++++++--- main.go | 2 +- storage/memory.go | 20 ++++++++++++++++++-- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/handler/handler.go b/handler/handler.go index 8f54513..d3a3f74 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "time" "code.ewintr.nl/planner/storage" ) @@ -14,8 +15,17 @@ func Index(w http.ResponseWriter, r *http.Request) { func NewSyncHandler(mem storage.Repository) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { - token := r.URL.Query().Get("token") - items, err := mem.NewSince(token) + timestamp := time.Time{} + tsStr := r.URL.Query().Get("ts") + if tsStr != "" { + var err error + if timestamp, err = time.Parse(time.RFC3339, tsStr); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + } + + items, err := mem.NewSince(timestamp) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -27,7 +37,7 @@ func NewSyncHandler(mem storage.Repository) func(w http.ResponseWriter, r *http. return } - fmt.Fprint(w, body) + fmt.Fprint(w, string(body)) } } diff --git a/main.go b/main.go index 2405df0..f012966 100644 --- a/main.go +++ b/main.go @@ -13,5 +13,5 @@ func main() { http.HandleFunc("/", handler.Index) http.HandleFunc("/sync", handler.NewSyncHandler(mem)) - http.ListenAndServer(":8092", nil) + http.ListenAndServe(":8092", nil) } diff --git a/storage/memory.go b/storage/memory.go index 77d6680..8c4b7ca 100644 --- a/storage/memory.go +++ b/storage/memory.go @@ -1,6 +1,10 @@ package storage -import "code.ewintr.nl/planner/planner" +import ( + "time" + + "code.ewintr.nl/planner/planner" +) type Memory struct { items map[string]planner.Syncable @@ -12,7 +16,19 @@ func NewMemory() *Memory { } } -func (m *Memory) StoreProject(item planner.Syncable) error { +func (m *Memory) NewSince(timestamp time.Time) ([]planner.Syncable, error) { + result := make([]planner.Syncable, 0) + + for _, i := range m.items { + if timestamp.IsZero() || i.Updated().After(timestamp) { + result = append(result, i) + } + } + + return result, nil +} + +func (m *Memory) Store(item planner.Syncable) error { m.items[item.ID()] = item return nil