mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-24 00:33:14 +00:00
list all/folder/feed items
This commit is contained in:
parent
087f0d5657
commit
d01060ba3b
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
var parts = newVal.split(':', 2)
|
promise = api.items.list()
|
||||||
var type = parts[0]
|
} else {
|
||||||
var guid = parts[1]
|
var parts = newVal.split(':', 2)
|
||||||
if (type === 'feed') {
|
var type = parts[0]
|
||||||
api.feeds.list_items(guid).then(function(items) {
|
var guid = parts[1]
|
||||||
vm.items = items
|
if (type === 'feed') {
|
||||||
})
|
promise = api.feeds.list_items(guid)
|
||||||
|
} else if (type == 'folder') {
|
||||||
|
promise = api.folders.list_items(guid)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
promise.then(function(items) {
|
||||||
|
vm.items = items
|
||||||
|
})
|
||||||
},
|
},
|
||||||
'itemSelected': function(newVal, oldVal) {
|
'itemSelected': function(newVal, oldVal) {
|
||||||
this.itemSelectedDetails = this.itemsById[newVal]
|
this.itemSelectedDetails = this.itemsById[newVal]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user