From babb98d8706371a9a5842bfc9f4806d768498ce5 Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Tue, 7 Jul 2020 11:50:34 +0100 Subject: [PATCH] single, stateless endpoint for item list --- server/handlers.go | 48 ++++++++---------------------- server/server.go | 2 -- storage/storage.go | 2 ++ template/static/javascripts/api.js | 11 +++++-- template/static/javascripts/app.js | 16 +++++----- 5 files changed, 33 insertions(+), 46 deletions(-) diff --git a/server/handlers.go b/server/handlers.go index 2104413..35d1957 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -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 { 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) { 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) } else { rw.WriteHeader(http.StatusMethodNotAllowed) diff --git a/server/server.go b/server/server.go index 8621c49..bc3a0fb 100644 --- a/server/server.go +++ b/server/server.go @@ -73,10 +73,8 @@ var routes []Route = []Route{ p("/api/status", StatusHandler), p("/api/folders", FolderListHandler), p("/api/folders/:id", FolderHandler), - p("/api/folders/:id/items", FolderItemsHandler), p("/api/feeds", FeedListHandler), p("/api/feeds/:id", FeedHandler), - p("/api/feeds/:id/items", FeedItemsHandler), p("/api/feeds/find", FeedHandler), p("/api/items", ItemListHandler), p("/api/items/:id", ItemHandler), diff --git a/storage/storage.go b/storage/storage.go index 1650853..3218036 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -63,10 +63,12 @@ func New() (*Storage, error) { if err != nil { return nil, err } + /* _, err = db.Exec(initQuery) if err != nil { return nil, err } + */ logger := log.New(os.Stdout, "storage: ", log.Ldate | log.Ltime | log.Lshortfile) return &Storage{db: db, log: logger}, nil } diff --git a/template/static/javascripts/api.js b/template/static/javascripts/api.js index 5ce546a..29cd9b4 100644 --- a/template/static/javascripts/api.js +++ b/template/static/javascripts/api.js @@ -12,6 +12,13 @@ var json = function(res) { 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 = { feeds: { @@ -49,8 +56,8 @@ } }, items: { - list: function() { - return api('get', '/api/items').then(json) + list: function(query) { + return api('get', '/api/items' + param(query)).then(json) }, update: function(id, data) { return api('put', '/api/items/' + id, data) diff --git a/template/static/javascripts/app.js b/template/static/javascripts/app.js index 71e4072..f2652f3 100644 --- a/template/static/javascripts/app.js +++ b/template/static/javascripts/app.js @@ -77,19 +77,21 @@ var vm = new Vue({ }, refreshItems: function() { var promise = null - if (!this.feedSelected) { - promise = api.items.list() - } else { + var query = {} + if (this.feedSelected) { var parts = this.feedSelected.split(':', 2) var type = parts[0] var guid = parts[1] - if (type === 'feed') { - promise = api.feeds.list_items(guid) + if (type == 'feed') { + query.feed_id = guid } 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 }) },