mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-24 00:33:14 +00:00
settigs storage & api
This commit is contained in:
parent
eb0db50413
commit
0761da85e7
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
57
storage/settings.go
Normal 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
|
||||
}
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user