From 924293ee5c3d5da06927c4cc6874982c61fe4c2e Mon Sep 17 00:00:00 2001 From: Julien Voisin Date: Wed, 6 Aug 2025 03:01:58 +0200 Subject: [PATCH] perf(storage): avoid heavy-weight SQL when marking feed as read There is no need to perform a heavy-weight SQL query gathering all the information available on a feed when we're only interested in its last check timestamp. --- internal/storage/feed.go | 12 ++++++++++++ internal/ui/feed_mark_as_read.go | 10 ++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/internal/storage/feed.go b/internal/storage/feed.go index c2c85a29..99e2d4ed 100644 --- a/internal/storage/feed.go +++ b/internal/storage/feed.go @@ -9,6 +9,7 @@ import ( "fmt" "log/slog" "sort" + "time" "miniflux.app/v2/internal/config" "miniflux.app/v2/internal/model" @@ -40,6 +41,17 @@ func (s *Storage) FeedExists(userID, feedID int64) bool { return result } +// CheckedAt returns when the feed was last checked. +func (s *Storage) CheckedAt(userID, feedID int64) (time.Time, error) { + var result time.Time + query := `SELECT checked_at FROM feeds WHERE user_id=$1 AND id=$2 LIMIT 1` + err := s.db.QueryRow(query, userID, feedID).Scan(&result) + if err != nil { + return time.Now(), err + } + return result, nil +} + // CategoryFeedExists returns true if the given feed exists that belongs to the given category. func (s *Storage) CategoryFeedExists(userID, categoryID, feedID int64) bool { var result bool diff --git a/internal/ui/feed_mark_as_read.go b/internal/ui/feed_mark_as_read.go index 3a2420f0..56d6163a 100644 --- a/internal/ui/feed_mark_as_read.go +++ b/internal/ui/feed_mark_as_read.go @@ -15,19 +15,13 @@ func (h *handler) markFeedAsRead(w http.ResponseWriter, r *http.Request) { feedID := request.RouteInt64Param(r, "feedID") userID := request.UserID(r) - feed, err := h.store.FeedByID(userID, feedID) - + checkedAt, err := h.store.CheckedAt(userID, feedID) if err != nil { - html.ServerError(w, r, err) - return - } - - if feed == nil { html.NotFound(w, r) return } - if err = h.store.MarkFeedAsRead(userID, feedID, feed.CheckedAt); err != nil { + if err = h.store.MarkFeedAsRead(userID, feedID, checkedAt); err != nil { html.ServerError(w, r, err) return }