diff --git a/server/handlers.go b/server/handlers.go index 35d1957..f228adb 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -300,7 +300,19 @@ func ItemListHandler(rw http.ResponseWriter, req *http.Request) { filter.Status = &statusValue } items := db(req).ListItems(filter) + rw.WriteHeader(http.StatusOK) writeJSON(rw, items) + } else if req.Method == "PUT" { + query := req.URL.Query() + filter := storage.ItemFilter{} + if folderID, err := strconv.ParseInt(query.Get("folder_id"), 10, 64); err == nil { + filter.FolderID = &folderID + } + if feedID, err := strconv.ParseInt(query.Get("feed_id"), 10, 64); err == nil { + filter.FeedID = &feedID + } + db(req).MarkItemsRead(filter) + rw.WriteHeader(http.StatusOK) } else { rw.WriteHeader(http.StatusMethodNotAllowed) } diff --git a/storage/item.go b/storage/item.go index 56ff443..072db42 100644 --- a/storage/item.go +++ b/storage/item.go @@ -161,3 +161,34 @@ 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 } + +func (s *Storage) MarkItemsRead(filter ItemFilter) bool { + 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) + } + predicate := "1" + if len(cond) > 0 { + predicate = strings.Join(cond, " and ") + } + query := fmt.Sprintf(` + update items set status = %d + where id in ( + select i.id from items i + join feeds f on f.id = i.feed_id + where %s and i.status != %d + ) + `, READ, predicate, STARRED) + _, err := s.db.Exec(query, args...) + if err != nil { + s.log.Print(err) + } + return err == nil +} diff --git a/template/index.html b/template/index.html index cec4c66..17fb6ec 100644 --- a/template/index.html +++ b/template/index.html @@ -71,8 +71,13 @@ -
-
+
+
+ +
+