list all/folder/feed items

This commit is contained in:
Nazar Kanaev 2020-07-05 20:19:03 +01:00
parent 087f0d5657
commit d01060ba3b
5 changed files with 83 additions and 36 deletions

View File

@ -263,7 +263,7 @@ func FeedItemsHandler(rw http.ResponseWriter, req *http.Request) {
return return
} }
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
items := db(req).ListFeedItems(id) items := db(req).ListItems(storage.ItemFilter{FeedID: &id})
writeJSON(rw, items) writeJSON(rw, items)
} }
@ -292,3 +292,26 @@ func ItemHandler(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(http.StatusMethodNotAllowed) rw.WriteHeader(http.StatusMethodNotAllowed)
} }
} }
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 := db(req).ListItems(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 := db(req).ListItems(storage.ItemFilter{})
writeJSON(rw, items)
} else {
rw.WriteHeader(http.StatusMethodNotAllowed)
}
}

View File

@ -73,10 +73,12 @@ 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/:id/items", FeedItemsHandler),
p("/api/feeds/find", FeedHandler), p("/api/feeds/find", FeedHandler),
p("/api/items", ItemListHandler),
p("/api/items/:id", ItemHandler), p("/api/items/:id", ItemHandler),
} }

View File

@ -3,6 +3,7 @@ package storage
import ( import (
"fmt" "fmt"
"time" "time"
"strings"
"encoding/json" "encoding/json"
) )
@ -54,6 +55,12 @@ type Item struct {
Image string `json:"image"` Image string `json:"image"`
} }
type ItemFilter struct {
FolderID *int64
FeedID *int64
Status *ItemStatus
}
func (s *Storage) CreateItems(items []Item) bool { func (s *Storage) CreateItems(items []Item) bool {
tx, err := s.db.Begin() tx, err := s.db.Begin()
if err != nil { if err != nil {
@ -89,15 +96,38 @@ func (s *Storage) CreateItems(items []Item) bool {
return true return true
} }
func itemQuery(s *Storage, cond string, v ...interface{}) []Item { func (s *Storage) ListItems(filter ItemFilter) []Item {
cond := make([]string, 0)
args := make([]interface{}, 0)
if filter.FolderID != nil {
cond = append(cond, "f.folder_id = ?")
args = append(args, *filter.FolderID)
}
if filter.FeedID != nil {
cond = append(cond, "i.feed_id = ?")
args = append(args, *filter.FeedID)
}
if filter.Status != nil {
cond = append(cond, "i.status = ?")
args = append(args, *filter.Status)
}
predicate := "1"
if len(cond) > 0 {
predicate = strings.Join(cond, " and ")
}
result := make([]Item, 0, 0) result := make([]Item, 0, 0)
query := fmt.Sprintf(` query := fmt.Sprintf(`
select select
id, guid, feed_id, title, link, description, i.id, i.guid, i.feed_id, i.title, i.link, i.description,
content, author, date, date_updated, status, image i.content, i.author, i.date, i.date_updated, i.status, i.image
from items from items i
where %s`, cond) join feeds f on f.id = i.feed_id
rows, err := s.db.Query(query, v...) where %s
order by i.date desc
`, predicate)
rows, err := s.db.Query(query, args...)
if err != nil { if err != nil {
s.log.Print(err) s.log.Print(err)
return result return result
@ -127,26 +157,6 @@ func itemQuery(s *Storage, cond string, v ...interface{}) []Item {
return result return result
} }
func (s *Storage) ListItems() []Item {
return itemQuery(s, `1`)
}
func (s *Storage) ListFolderItems(folder_id int64) []Item {
return itemQuery(s, `folder_id = ?`, folder_id)
}
func (s *Storage) ListFolderItemsFiltered(folder_id int64, status ItemStatus) []Item {
return itemQuery(s, `folder_id = ? and status = ?`, folder_id, status)
}
func (s *Storage) ListFeedItems(feed_id int64) []Item {
return itemQuery(s, `feed_id = ?`, feed_id)
}
func (s *Storage) ListFeedItemsFiltered(feed_id int64, status ItemStatus) []Item {
return itemQuery(s, `feed_id = ? and status = ?`, feed_id, status)
}
func (s *Storage) UpdateItemStatus(item_id int64, status ItemStatus) bool { func (s *Storage) UpdateItemStatus(item_id int64, status ItemStatus) bool {
_, err := s.db.Exec(`update items set status = ? where id = ?`, status, item_id) _, err := s.db.Exec(`update items set status = ? where id = ?`, status, item_id)
return err == nil return err == nil

View File

@ -44,8 +44,14 @@
delete: function(id) { delete: function(id) {
return api('delete', '/api/folders/' + id) return api('delete', '/api/folders/' + id)
}, },
list_items: function(id) {
return api('get', '/api/folders/' + id + '/items').then(json)
}
}, },
items: { items: {
list: function() {
return api('get', '/api/items').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

@ -42,16 +42,22 @@ var vm = new Vue({
}, },
watch: { watch: {
'feedSelected': function(newVal, oldVal) { 'feedSelected': function(newVal, oldVal) {
if (newVal === null) return var promise = null
var vm = this if (newVal === null) {
promise = api.items.list()
} else {
var parts = newVal.split(':', 2) var parts = newVal.split(':', 2)
var type = parts[0] var type = parts[0]
var guid = parts[1] var guid = parts[1]
if (type === 'feed') { if (type === 'feed') {
api.feeds.list_items(guid).then(function(items) { promise = api.feeds.list_items(guid)
} else if (type == 'folder') {
promise = api.folders.list_items(guid)
}
}
promise.then(function(items) {
vm.items = items vm.items = items
}) })
}
}, },
'itemSelected': function(newVal, oldVal) { 'itemSelected': function(newVal, oldVal) {
this.itemSelectedDetails = this.itemsById[newVal] this.itemSelectedDetails = this.itemsById[newVal]