settigs storage & api

This commit is contained in:
Nazar Kanaev 2020-07-06 13:14:10 +01:00
parent eb0db50413
commit 0761da85e7
4 changed files with 81 additions and 0 deletions

View File

@ -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)
}
}
}

View File

@ -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 {

57
storage/settings.go Normal file
View File

@ -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
}

View File

@ -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 {