single, stateless endpoint for item list

This commit is contained in:
Nazar Kanaev 2020-07-07 11:50:34 +01:00
parent 7f8225b351
commit babb98d870
5 changed files with 33 additions and 46 deletions

View File

@ -259,26 +259,6 @@ func FeedHandler(rw http.ResponseWriter, req *http.Request) {
} }
} }
func findItems(db *storage.Storage, filter storage.ItemFilter) []storage.Item {
statusFilter := db.GetSettingsValue("filter")
if statusFilter != nil && len(statusFilter.(string)) != 0 {
status := storage.StatusValues[statusFilter.(string)]
filter.Status = &status
}
return db.ListItems(filter)
}
func FeedItemsHandler(rw http.ResponseWriter, req *http.Request) {
id, err := strconv.ParseInt(Vars(req)["id"], 10, 64)
if err != nil {
rw.WriteHeader(http.StatusBadRequest)
return
}
rw.WriteHeader(http.StatusOK)
items := findItems(db(req), storage.ItemFilter{FeedID: &id})
writeJSON(rw, items)
}
type UpdateItem struct { type UpdateItem struct {
Status *storage.ItemStatus `json:"status,omitempty"` Status *storage.ItemStatus `json:"status,omitempty"`
} }
@ -305,23 +285,21 @@ func ItemHandler(rw http.ResponseWriter, req *http.Request) {
} }
} }
func FolderItemsHandler(rw http.ResponseWriter, req *http.Request) {
if req.Method == "GET" {
id, err := strconv.ParseInt(Vars(req)["id"], 10, 64)
if err != nil {
rw.WriteHeader(http.StatusBadRequest)
return
}
items := findItems(db(req), storage.ItemFilter{FolderID: &id})
writeJSON(rw, items)
} else {
rw.WriteHeader(http.StatusMethodNotAllowed)
}
}
func ItemListHandler(rw http.ResponseWriter, req *http.Request) { func ItemListHandler(rw http.ResponseWriter, req *http.Request) {
if req.Method == "GET" { if req.Method == "GET" {
items := findItems(db(req), storage.ItemFilter{}) query := req.URL.Query()
filter := storage.ItemFilter{}
if folderID, err := strconv.ParseInt(query.Get("folder_id"), 10, 64); err == nil {
filter.FolderID = &folderID
}
if feedID, err := strconv.ParseInt(query.Get("feed_id"), 10, 64); err == nil {
filter.FeedID = &feedID
}
if status := query.Get("status"); len(status) != 0 {
statusValue := storage.StatusValues[status]
filter.Status = &statusValue
}
items := db(req).ListItems(filter)
writeJSON(rw, items) writeJSON(rw, items)
} else { } else {
rw.WriteHeader(http.StatusMethodNotAllowed) rw.WriteHeader(http.StatusMethodNotAllowed)

View File

@ -73,10 +73,8 @@ var routes []Route = []Route{
p("/api/status", StatusHandler), p("/api/status", StatusHandler),
p("/api/folders", FolderListHandler), p("/api/folders", FolderListHandler),
p("/api/folders/:id", FolderHandler), p("/api/folders/:id", FolderHandler),
p("/api/folders/:id/items", FolderItemsHandler),
p("/api/feeds", FeedListHandler), p("/api/feeds", FeedListHandler),
p("/api/feeds/:id", FeedHandler), p("/api/feeds/:id", FeedHandler),
p("/api/feeds/:id/items", FeedItemsHandler),
p("/api/feeds/find", FeedHandler), p("/api/feeds/find", FeedHandler),
p("/api/items", ItemListHandler), p("/api/items", ItemListHandler),
p("/api/items/:id", ItemHandler), p("/api/items/:id", ItemHandler),

View File

@ -63,10 +63,12 @@ func New() (*Storage, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
/*
_, err = db.Exec(initQuery) _, err = db.Exec(initQuery)
if err != nil { if err != nil {
return nil, err return nil, err
} }
*/
logger := log.New(os.Stdout, "storage: ", log.Ldate | log.Ltime | log.Lshortfile) logger := log.New(os.Stdout, "storage: ", log.Ldate | log.Ltime | log.Lshortfile)
return &Storage{db: db, log: logger}, nil return &Storage{db: db, log: logger}, nil
} }

View File

@ -12,6 +12,13 @@
var json = function(res) { var json = function(res) {
return res.json() return res.json()
} }
var param = function(query) {
if (!query) return ''
return '?' + Object.keys(query).map(function(key) {
return encodeURIComponent(key) + '=' + encodeURIComponent(query[key])
}).join('&')
}
window.api = { window.api = {
feeds: { feeds: {
@ -49,8 +56,8 @@
} }
}, },
items: { items: {
list: function() { list: function(query) {
return api('get', '/api/items').then(json) return api('get', '/api/items' + param(query)).then(json)
}, },
update: function(id, data) { update: function(id, data) {
return api('put', '/api/items/' + id, data) return api('put', '/api/items/' + id, data)

View File

@ -77,19 +77,21 @@ var vm = new Vue({
}, },
refreshItems: function() { refreshItems: function() {
var promise = null var promise = null
if (!this.feedSelected) { var query = {}
promise = api.items.list() if (this.feedSelected) {
} else {
var parts = this.feedSelected.split(':', 2) var parts = this.feedSelected.split(':', 2)
var type = parts[0] var type = parts[0]
var guid = parts[1] var guid = parts[1]
if (type === 'feed') { if (type == 'feed') {
promise = api.feeds.list_items(guid) query.feed_id = guid
} else if (type == 'folder') { } else if (type == 'folder') {
promise = api.folders.list_items(guid) query.folder_id = guid
} }
} }
promise.then(function(items) { if (this.filterSelected) {
query.status = this.filterSelected
}
api.items.list(query).then(function(items) {
vm.items = items vm.items = items
}) })
}, },