From 5774323f2ef646bea3e078a8bee382ea45a7e276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Thu, 5 Oct 2023 21:37:45 -0700 Subject: [PATCH] Add API endpoint to flush history --- client/client.go | 6 ++++++ internal/api/api.go | 1 + internal/api/entry.go | 6 ++++++ internal/storage/entry.go | 2 +- internal/tests/entry_test.go | 37 +++++++++++++++++++++++++++++++++--- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/client/client.go b/client/client.go index bac7bdf1..d9d7fa8c 100644 --- a/client/client.go +++ b/client/client.go @@ -512,6 +512,12 @@ func (c *Client) FetchCounters() (*FeedCounters, error) { return &result, nil } +// FlushHistory changes all entries with the status "read" to "removed". +func (c *Client) FlushHistory() error { + _, err := c.request.Put("/v1/flush-history", nil) + return err +} + func buildFilterQueryString(path string, filter *Filter) string { if filter != nil { values := url.Values{} diff --git a/internal/api/api.go b/internal/api/api.go index 1a53336c..2da998b5 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -66,4 +66,5 @@ func Serve(router *mux.Router, store *storage.Storage, pool *worker.Pool) { sr.HandleFunc("/entries/{entryID}/bookmark", handler.toggleBookmark).Methods(http.MethodPut) sr.HandleFunc("/entries/{entryID}/save", handler.saveEntry).Methods(http.MethodPost) sr.HandleFunc("/entries/{entryID}/fetch-content", handler.fetchContent).Methods(http.MethodGet) + sr.HandleFunc("/flush-history", handler.flushHistory).Methods(http.MethodPut, http.MethodDelete) } diff --git a/internal/api/entry.go b/internal/api/entry.go index 1355fa3b..e6c00e3a 100644 --- a/internal/api/entry.go +++ b/internal/api/entry.go @@ -283,6 +283,12 @@ func (h *handler) fetchContent(w http.ResponseWriter, r *http.Request) { json.OK(w, r, map[string]string{"content": entry.Content}) } +func (h *handler) flushHistory(w http.ResponseWriter, r *http.Request) { + loggedUserID := request.UserID(r) + go h.store.FlushHistory(loggedUserID) + json.Accepted(w, r) +} + func configureFilters(builder *storage.EntryQueryBuilder, r *http.Request) { if beforeEntryID := request.QueryInt64Param(r, "before_entry_id", 0); beforeEntryID > 0 { builder.BeforeEntryID(beforeEntryID) diff --git a/internal/storage/entry.go b/internal/storage/entry.go index e36646b4..0ddbeebf 100644 --- a/internal/storage/entry.go +++ b/internal/storage/entry.go @@ -442,7 +442,7 @@ func (s *Storage) ToggleBookmark(userID int64, entryID int64) error { return nil } -// FlushHistory set all entries with the status "read" to "removed". +// FlushHistory changes all entries with the status "read" to "removed". func (s *Storage) FlushHistory(userID int64) error { query := ` UPDATE diff --git a/internal/tests/entry_test.go b/internal/tests/entry_test.go index 5d9ac03e..dde5582a 100644 --- a/internal/tests/entry_test.go +++ b/internal/tests/entry_test.go @@ -434,9 +434,9 @@ func TestHistoryOrder(t *testing.T) { t.Fatal(err) } - selectedEntry := result.Entries[2].ID + selectedEntryID := result.Entries[2].ID - err = client.UpdateEntries([]int64{selectedEntry}, miniflux.EntryStatusRead) + err = client.UpdateEntries([]int64{selectedEntryID}, miniflux.EntryStatusRead) if err != nil { t.Fatal(err) } @@ -446,7 +446,38 @@ func TestHistoryOrder(t *testing.T) { t.Fatal(err) } - if history.Entries[0].ID != selectedEntry { + if history.Entries[0].ID != selectedEntryID { t.Fatal("The entry that we just read should be at the top of the history") } } + +func TestFlushHistory(t *testing.T) { + client := createClient(t) + createFeed(t, client) + + result, err := client.Entries(&miniflux.Filter{Limit: 1}) + if err != nil { + t.Fatal(err) + } + + selectedEntryID := result.Entries[0].ID + + err = client.UpdateEntries([]int64{selectedEntryID}, miniflux.EntryStatusRead) + if err != nil { + t.Fatal(err) + } + + err = client.FlushHistory() + if err != nil { + t.Fatal(err) + } + + history, err := client.Entries(&miniflux.Filter{Status: miniflux.EntryStatusRemoved}) + if err != nil { + t.Fatal(err) + } + + if history.Entries[0].ID != selectedEntryID { + t.Fatal("The entry that we just read should have the removed status") + } +}