Parcourir la source

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.
Julien Voisin il y a 8 mois
Parent
commit
924293ee5c
2 fichiers modifiés avec 14 ajouts et 8 suppressions
  1. 12 0
      internal/storage/feed.go
  2. 2 8
      internal/ui/feed_mark_as_read.go

+ 12 - 0
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

+ 2 - 8
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
 	}