From 0761da85e7c09900dbbf2d8a097dc5b6471ff03b Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Mon, 6 Jul 2020 13:14:10 +0100 Subject: [PATCH] settigs storage & api --- server/handlers.go | 18 ++++++++++++++ server/server.go | 1 + storage/settings.go | 57 +++++++++++++++++++++++++++++++++++++++++++++ storage/storage.go | 5 ++++ 4 files changed, 81 insertions(+) create mode 100644 storage/settings.go diff --git a/server/handlers.go b/server/handlers.go index fb5ba47..9d5ac62 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -314,3 +314,21 @@ func ItemListHandler(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusMethodNotAllowed) } } + +func SettingsHandler(rw http.ResponseWriter, req *http.Request) { + if req.Method == "GET" { + rw.WriteHeader(http.StatusOK) + writeJSON(rw, db(req).GetSettings()) + } else if req.Method == "PUT" { + settings := make(map[string]interface{}) + if err := json.NewDecoder(req.Body).Decode(&settings); err != nil { + rw.WriteHeader(http.StatusBadRequest) + return + } + if db(req).UpdateSettings(settings) { + rw.WriteHeader(http.StatusOK) + } else { + rw.WriteHeader(http.StatusBadRequest) + } + } +} diff --git a/server/server.go b/server/server.go index be34468..8621c49 100644 --- a/server/server.go +++ b/server/server.go @@ -80,6 +80,7 @@ var routes []Route = []Route{ p("/api/feeds/find", FeedHandler), p("/api/items", ItemListHandler), p("/api/items/:id", ItemHandler), + p("/api/settings", SettingsHandler), } func Vars(req *http.Request) map[string]string { diff --git a/storage/settings.go b/storage/settings.go new file mode 100644 index 0000000..054e4b3 --- /dev/null +++ b/storage/settings.go @@ -0,0 +1,57 @@ +package storage + +import "encoding/json" + +func settingsDefaults() map[string]interface{} { + return map[string]interface{}{ + "filter": "all", + "feed_list_width": 300, + "item_list_width": 300, + } +} + +func (s *Storage) GetSettings() map[string]interface{} { + result := settingsDefaults() + rows, err := s.db.Query(`select key, val from settings;`) + if err != nil { + s.log.Print(err) + return result + } + for rows.Next() { + var key string + var val []byte + var valDecoded interface{} + + rows.Scan(&key, &val) + if err = json.Unmarshal([]byte(val), &valDecoded); err != nil { + s.log.Print(err) + continue + } + result[key] = valDecoded + } + return result +} + +func (s *Storage) UpdateSettings(kv map[string]interface{}) bool { + defaults := settingsDefaults() + for key, val := range kv { + if defaults[key] == nil { + continue + } + valEncoded, err := json.Marshal(val) + if err != nil { + s.log.Print(err) + return false + } + _, err = s.db.Exec(` + insert into settings (key, val) values (?, ?) + on conflict (key) do update set val=?`, + key, valEncoded, valEncoded, + ) + if err != nil { + s.log.Print(err) + return false + } + } + return true +} diff --git a/storage/storage.go b/storage/storage.go index 92085c3..1650853 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -45,6 +45,11 @@ create table if not exists items ( create index if not exists idx_item_feed_id on items(feed_id); create index if not exists idx_item_status on items(status); create unique index if not exists idx_item_guid on items(guid); + +create table if not exists settings ( + key string primary key, + val blob +); ` type Storage struct {