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:
parent
30453ad7ec
commit
c6536e8d90
6 changed files with 26 additions and 15 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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":
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue