1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-01 17:38:37 +00:00

Refactor Batch Builder and prevent accidental and excessive refreshes from the web ui

This commit is contained in:
Frédéric Guillot 2023-10-20 15:12:02 -07:00
parent 95ee1c423b
commit 4cc99881d8
32 changed files with 251 additions and 176 deletions

View file

@ -6,10 +6,13 @@ package ui // import "miniflux.app/v2/internal/ui"
import (
"log/slog"
"net/http"
"time"
"miniflux.app/v2/internal/http/request"
"miniflux.app/v2/internal/http/response/html"
"miniflux.app/v2/internal/http/route"
"miniflux.app/v2/internal/locale"
"miniflux.app/v2/internal/ui/session"
)
func (h *handler) refreshCategoryEntriesPage(w http.ResponseWriter, r *http.Request) {
@ -25,21 +28,38 @@ func (h *handler) refreshCategoryFeedsPage(w http.ResponseWriter, r *http.Reques
func (h *handler) refreshCategory(w http.ResponseWriter, r *http.Request) int64 {
userID := request.UserID(r)
categoryID := request.RouteInt64Param(r, "categoryID")
printer := locale.NewPrinter(request.UserLanguage(r))
sess := session.New(h.store, request.SessionID(r))
jobs, err := h.store.NewCategoryBatch(userID, categoryID, h.store.CountFeeds(userID))
if err != nil {
html.ServerError(w, r, err)
return 0
// Avoid accidental and excessive refreshes.
if time.Now().UTC().Unix()-request.LastForceRefresh(r) < 1800 {
sess.NewFlashErrorMessage(printer.Printf("alert.too_many_feeds_refresh"))
} else {
// We allow the end-user to force refresh all its feeds in this category
// without taking into consideration the number of errors.
batchBuilder := h.store.NewBatchBuilder()
batchBuilder.WithoutDisabledFeeds()
batchBuilder.WithUserID(userID)
batchBuilder.WithCategoryID(categoryID)
jobs, err := batchBuilder.FetchJobs()
if err != nil {
html.ServerError(w, r, err)
return 0
}
slog.Info(
"Triggered a manual refresh of all feeds for a given category from the web ui",
slog.Int64("user_id", userID),
slog.Int64("category_id", categoryID),
slog.Int("nb_jobs", len(jobs)),
)
go h.pool.Push(jobs)
sess.SetLastForceRefresh()
sess.NewFlashMessage(printer.Printf("alert.background_feed_refresh"))
}
slog.Info(
"Triggered a manual refresh of all feeds for a given category from the web ui",
slog.Int64("user_id", userID),
slog.Int64("category_id", categoryID),
slog.Int("nb_jobs", len(jobs)),
)
go h.pool.Push(jobs)
return categoryID
}