1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-26 18:21:01 +00:00

refactor(http): use time.Duration for refresh interval

It's not clear which units of time used for refresh interval.
Convert to time.Duration for clarity.
This commit is contained in:
gudvinr 2025-08-18 23:10:18 +03:00 committed by Frédéric Guillot
parent 30453ad7ec
commit c6536e8d90
6 changed files with 26 additions and 15 deletions

View file

@ -784,12 +784,22 @@ func TestForceRefreshInterval(t *testing.T) {
t.Fatalf(`Parsing failure: %v`, err) t.Fatalf(`Parsing failure: %v`, err)
} }
expected := 42 expected := 42 * time.Second
result := opts.ForceRefreshInterval() result := opts.ForceRefreshInterval()
if result != expected { if result != expected {
t.Fatalf(`Unexpected FORCE_REFRESH_INTERVAL value, got %v instead of %v`, result, expected) t.Fatalf(`Unexpected FORCE_REFRESH_INTERVAL value, got %v instead of %v`, result, expected)
} }
sorted := opts.SortedOptions(false)
i := slices.IndexFunc(sorted, func(opt *option) bool {
return opt.Key == "FORCE_REFRESH_INTERVAL"
})
expectedSerialized := 42
if got := sorted[i].Value; got != expectedSerialized {
t.Fatalf(`Unexpected value in option output, got %q instead of %q`, got, expectedSerialized)
}
} }
func TestDefaultBatchSizeValue(t *testing.T) { func TestDefaultBatchSizeValue(t *testing.T) {

View file

@ -29,7 +29,7 @@ const (
defaultBasePath = "" defaultBasePath = ""
defaultWorkerPoolSize = 16 defaultWorkerPoolSize = 16
defaultPollingFrequency = 60 defaultPollingFrequency = 60
defaultForceRefreshInterval = 30 defaultForceRefreshInterval = 30 * time.Second
defaultBatchSize = 100 defaultBatchSize = 100
defaultPollingScheduler = "round_robin" defaultPollingScheduler = "round_robin"
defaultSchedulerEntryFrequencyMinInterval = 5 * time.Minute defaultSchedulerEntryFrequencyMinInterval = 5 * time.Minute
@ -130,7 +130,7 @@ type options struct {
cleanupArchiveUnreadDays int cleanupArchiveUnreadDays int
cleanupArchiveBatchSize int cleanupArchiveBatchSize int
cleanupRemoveSessionsDays int cleanupRemoveSessionsDays int
forceRefreshInterval int forceRefreshInterval time.Duration
batchSize int batchSize int
schedulerEntryFrequencyMinInterval time.Duration schedulerEntryFrequencyMinInterval time.Duration
schedulerEntryFrequencyMaxInterval time.Duration schedulerEntryFrequencyMaxInterval time.Duration
@ -392,7 +392,7 @@ func (o *options) WorkerPoolSize() int {
} }
// ForceRefreshInterval returns the force refresh interval // ForceRefreshInterval returns the force refresh interval
func (o *options) ForceRefreshInterval() int { func (o *options) ForceRefreshInterval() time.Duration {
return o.forceRefreshInterval return o.forceRefreshInterval
} }
@ -769,7 +769,7 @@ func (o *options) SortedOptions(redactSecret bool) []*option {
"OAUTH2_REDIRECT_URL": o.oauth2RedirectURL, "OAUTH2_REDIRECT_URL": o.oauth2RedirectURL,
"OAUTH2_USER_CREATION": o.oauth2UserCreationAllowed, "OAUTH2_USER_CREATION": o.oauth2UserCreationAllowed,
"DISABLE_LOCAL_AUTH": o.disableLocalAuth, "DISABLE_LOCAL_AUTH": o.disableLocalAuth,
"FORCE_REFRESH_INTERVAL": o.forceRefreshInterval, "FORCE_REFRESH_INTERVAL": int(o.forceRefreshInterval.Seconds()),
"POLLING_FREQUENCY": o.pollingFrequency, "POLLING_FREQUENCY": o.pollingFrequency,
"POLLING_LIMIT_PER_HOST": o.pollingLimitPerHost, "POLLING_LIMIT_PER_HOST": o.pollingLimitPerHost,
"POLLING_PARSING_ERROR_LIMIT": o.pollingParsingErrorLimit, "POLLING_PARSING_ERROR_LIMIT": o.pollingParsingErrorLimit,

View file

@ -139,7 +139,7 @@ func (p *parser) parseLines(lines []string) (err error) {
case "WORKER_POOL_SIZE": case "WORKER_POOL_SIZE":
p.opts.workerPoolSize = parseInt(value, defaultWorkerPoolSize) p.opts.workerPoolSize = parseInt(value, defaultWorkerPoolSize)
case "FORCE_REFRESH_INTERVAL": case "FORCE_REFRESH_INTERVAL":
p.opts.forceRefreshInterval = parseInt(value, defaultForceRefreshInterval) p.opts.forceRefreshInterval = parseInterval(value, time.Second, defaultForceRefreshInterval)
case "BATCH_SIZE": case "BATCH_SIZE":
p.opts.batchSize = parseInt(value, defaultBatchSize) p.opts.batchSize = parseInt(value, defaultBatchSize)
case "POLLING_FREQUENCY": case "POLLING_FREQUENCY":

View file

@ -6,6 +6,7 @@ package request // import "miniflux.app/v2/internal/http/request"
import ( import (
"net/http" "net/http"
"strconv" "strconv"
"time"
"miniflux.app/v2/internal/model" "miniflux.app/v2/internal/model"
) )
@ -135,13 +136,13 @@ func FlashErrorMessage(r *http.Request) string {
} }
// LastForceRefresh returns the last force refresh timestamp. // LastForceRefresh returns the last force refresh timestamp.
func LastForceRefresh(r *http.Request) int64 { func LastForceRefresh(r *http.Request) time.Time {
jsonStringValue := getContextStringValue(r, LastForceRefreshContextKey) jsonStringValue := getContextStringValue(r, LastForceRefreshContextKey)
timestamp, err := strconv.ParseInt(jsonStringValue, 10, 64) timestamp, err := strconv.ParseInt(jsonStringValue, 10, 64)
if err != nil { if err != nil {
return 0 return time.Time{}
} }
return timestamp return time.Unix(timestamp, 0)
} }
// ClientIP returns the client IP address stored in the context. // ClientIP returns the client IP address stored in the context.

View file

@ -32,9 +32,9 @@ func (h *handler) refreshCategory(w http.ResponseWriter, r *http.Request) int64
sess := session.New(h.store, request.SessionID(r)) sess := session.New(h.store, request.SessionID(r))
// Avoid accidental and excessive refreshes. // Avoid accidental and excessive refreshes.
if time.Now().UTC().Unix()-request.LastForceRefresh(r) < int64(config.Opts.ForceRefreshInterval())*60 { if time.Since(request.LastForceRefresh(r)) < config.Opts.ForceRefreshInterval() {
time := config.Opts.ForceRefreshInterval() seconds := int(config.Opts.ForceRefreshInterval().Seconds())
sess.NewFlashErrorMessage(printer.Plural("alert.too_many_feeds_refresh", time, time)) sess.NewFlashErrorMessage(printer.Plural("alert.too_many_feeds_refresh", seconds, seconds))
} else { } else {
userID := request.UserID(r) userID := request.UserID(r)
// We allow the end-user to force refresh all its feeds in this category // We allow the end-user to force refresh all its feeds in this category

View file

@ -37,9 +37,9 @@ func (h *handler) refreshAllFeeds(w http.ResponseWriter, r *http.Request) {
sess := session.New(h.store, request.SessionID(r)) sess := session.New(h.store, request.SessionID(r))
// Avoid accidental and excessive refreshes. // Avoid accidental and excessive refreshes.
if time.Now().UTC().Unix()-request.LastForceRefresh(r) < int64(config.Opts.ForceRefreshInterval())*60 { if time.Since(request.LastForceRefresh(r)) < config.Opts.ForceRefreshInterval() {
time := config.Opts.ForceRefreshInterval() seconds := int(config.Opts.ForceRefreshInterval().Seconds())
sess.NewFlashErrorMessage(printer.Plural("alert.too_many_feeds_refresh", time, time)) sess.NewFlashErrorMessage(printer.Plural("alert.too_many_feeds_refresh", seconds, seconds))
} else { } else {
userID := request.UserID(r) userID := request.UserID(r)
// We allow the end-user to force refresh all its feeds // We allow the end-user to force refresh all its feeds