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

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