fever write api [wip]

This commit is contained in:
Nazar Kanaev 2020-10-25 16:29:26 +00:00
parent 40a9773beb
commit b0364087ad
3 changed files with 46 additions and 2 deletions

View File

@ -7,6 +7,7 @@ import (
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"
"time"
) )
var feverHandlers = map[string]func(rw http.ResponseWriter, req *http.Request){ var feverHandlers = map[string]func(rw http.ResponseWriter, req *http.Request){
@ -199,6 +200,7 @@ func FeverFaviconsHandler(rw http.ResponseWriter, req *http.Request) {
func FeverItemsHandler(rw http.ResponseWriter, req *http.Request) { func FeverItemsHandler(rw http.ResponseWriter, req *http.Request) {
filter := storage.ItemFilter{} filter := storage.ItemFilter{}
query := req.URL.Query() query := req.URL.Query()
// TODO: must be switch case?
if _, ok := query["with_ids"]; ok { if _, ok := query["with_ids"]; ok {
ids := make([]int64, 0) ids := make([]int64, 0)
for _, idstr := range strings.Split(query.Get("with_ids"), ",") { for _, idstr := range strings.Split(query.Get("with_ids"), ",") {
@ -262,5 +264,39 @@ func FeverLinksHandler(rw http.ResponseWriter, req *http.Request) {
} }
func FeverMarkHandler(rw http.ResponseWriter, req *http.Request) { func FeverMarkHandler(rw http.ResponseWriter, req *http.Request) {
query := req.URL.Query()
id, err := strconv.ParseInt(query.Get("id"), 10, 0)
if err != nil {
handler(req).log.Print("invalid id:", err)
return
}
switch query.Get("mark") {
case "item":
var status storage.ItemStatus
switch query.Get("as") {
case "read":
status = storage.READ
case "unread":
status = storage.UNREAD
case "saved":
status = storage.STARRED
case "unsaved":
status = storage.READ
default:
fmt.Println("TODO: handle")
}
db(req).UpdateItemStatus(id, status)
case "feed":
x, _ := strconv.ParseInt(query.Get("before"), 10, 0)
before := time.Unix(x, 0)
db(req).MarkItemsRead(storage.MarkFilter{FeedID: &id, Before: &before})
case "group":
x, _ := strconv.ParseInt(query.Get("before"), 10, 0)
before := time.Unix(x, 0)
db(req).MarkItemsRead(storage.MarkFilter{FolderID: &id, Before: &before})
default:
fmt.Println("TODO: handle")
}
} }

View File

@ -358,7 +358,7 @@ func ItemListHandler(rw http.ResponseWriter, req *http.Request) {
}) })
} else if req.Method == "PUT" { } else if req.Method == "PUT" {
query := req.URL.Query() query := req.URL.Query()
filter := storage.ItemFilter{} filter := storage.MarkFilter{}
if folderID, err := strconv.ParseInt(query.Get("folder_id"), 10, 64); err == nil { if folderID, err := strconv.ParseInt(query.Get("folder_id"), 10, 64); err == nil {
filter.FolderID = &folderID filter.FolderID = &folderID
} }

View File

@ -67,6 +67,13 @@ type ItemFilter struct {
SinceID *int64 SinceID *int64
} }
type MarkFilter struct {
FolderID *int64
FeedID *int64
Before *time.Time
}
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 {
@ -240,7 +247,7 @@ func (s *Storage) UpdateItemStatus(item_id int64, status ItemStatus) bool {
return err == nil return err == nil
} }
func (s *Storage) MarkItemsRead(filter ItemFilter) bool { func (s *Storage) MarkItemsRead(filter MarkFilter) bool {
cond := make([]string, 0) cond := make([]string, 0)
args := make([]interface{}, 0) args := make([]interface{}, 0)
@ -252,6 +259,7 @@ func (s *Storage) MarkItemsRead(filter ItemFilter) bool {
cond = append(cond, "i.feed_id = ?") cond = append(cond, "i.feed_id = ?")
args = append(args, *filter.FeedID) args = append(args, *filter.FeedID)
} }
// TODO: filter.Before
predicate := "1" predicate := "1"
if len(cond) > 0 { if len(cond) > 0 {
predicate = strings.Join(cond, " and ") predicate = strings.Join(cond, " and ")