diff --git a/server/fever.go b/server/fever.go index 3294a83..220d3f7 100644 --- a/server/fever.go +++ b/server/fever.go @@ -7,6 +7,7 @@ import ( "net/http" "strconv" "strings" + "time" ) 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) { filter := storage.ItemFilter{} query := req.URL.Query() + // TODO: must be switch case? if _, ok := query["with_ids"]; ok { ids := make([]int64, 0) 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) { + 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") + } } diff --git a/server/handlers.go b/server/handlers.go index 3d4c300..1556b0f 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -358,7 +358,7 @@ func ItemListHandler(rw http.ResponseWriter, req *http.Request) { }) } else if req.Method == "PUT" { query := req.URL.Query() - filter := storage.ItemFilter{} + filter := storage.MarkFilter{} if folderID, err := strconv.ParseInt(query.Get("folder_id"), 10, 64); err == nil { filter.FolderID = &folderID } diff --git a/storage/item.go b/storage/item.go index 233a956..d827c09 100644 --- a/storage/item.go +++ b/storage/item.go @@ -67,6 +67,13 @@ type ItemFilter struct { SinceID *int64 } +type MarkFilter struct { + FolderID *int64 + FeedID *int64 + + Before *time.Time +} + func (s *Storage) CreateItems(items []Item) bool { tx, err := s.db.Begin() if err != nil { @@ -240,7 +247,7 @@ func (s *Storage) UpdateItemStatus(item_id int64, status ItemStatus) bool { return err == nil } -func (s *Storage) MarkItemsRead(filter ItemFilter) bool { +func (s *Storage) MarkItemsRead(filter MarkFilter) bool { cond := make([]string, 0) args := make([]interface{}, 0) @@ -252,6 +259,7 @@ func (s *Storage) MarkItemsRead(filter ItemFilter) bool { cond = append(cond, "i.feed_id = ?") args = append(args, *filter.FeedID) } + // TODO: filter.Before predicate := "1" if len(cond) > 0 { predicate = strings.Join(cond, " and ")