mirror of
https://github.com/miniflux/v2.git
synced 2025-06-27 16:36:00 +00:00
Make configurable the number of days to remove old sessions
This commit is contained in:
parent
8d8f78241d
commit
3a60abbac0
6 changed files with 57 additions and 12 deletions
|
@ -882,6 +882,41 @@ func TestArchiveReadDays(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemoveSessionsDays(t *testing.T) {
|
||||||
|
os.Clearenv()
|
||||||
|
os.Setenv("REMOVE_SESSIONS_DAYS", "7")
|
||||||
|
|
||||||
|
parser := NewParser()
|
||||||
|
opts, err := parser.ParseEnvironmentVariables()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing failure: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := 7
|
||||||
|
result := opts.RemoveSessionsDays()
|
||||||
|
|
||||||
|
if result != expected {
|
||||||
|
t.Fatalf(`Unexpected REMOVE_SESSIONS_DAYS value, got %v instead of %v`, result, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDefaultRemoveSessionsDays(t *testing.T) {
|
||||||
|
os.Clearenv()
|
||||||
|
|
||||||
|
parser := NewParser()
|
||||||
|
opts, err := parser.ParseEnvironmentVariables()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(`Parsing failure: %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := 30
|
||||||
|
result := opts.RemoveSessionsDays()
|
||||||
|
|
||||||
|
if result != expected {
|
||||||
|
t.Fatalf(`Unexpected REMOVE_SESSIONS_DAYS value, got %v instead of %v`, result, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRunMigrationsWhenUnset(t *testing.T) {
|
func TestRunMigrationsWhenUnset(t *testing.T) {
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ const (
|
||||||
defaultDatabaseMaxConns = 20
|
defaultDatabaseMaxConns = 20
|
||||||
defaultDatabaseMinConns = 1
|
defaultDatabaseMinConns = 1
|
||||||
defaultArchiveReadDays = 60
|
defaultArchiveReadDays = 60
|
||||||
|
defaultRemoveSessionsDays = 30
|
||||||
defaultListenAddr = "127.0.0.1:8080"
|
defaultListenAddr = "127.0.0.1:8080"
|
||||||
defaultCertFile = ""
|
defaultCertFile = ""
|
||||||
defaultKeyFile = ""
|
defaultKeyFile = ""
|
||||||
|
@ -67,6 +68,7 @@ type Options struct {
|
||||||
certKeyFile string
|
certKeyFile string
|
||||||
cleanupFrequency int
|
cleanupFrequency int
|
||||||
archiveReadDays int
|
archiveReadDays int
|
||||||
|
removeSessionsDays int
|
||||||
pollingFrequency int
|
pollingFrequency int
|
||||||
batchSize int
|
batchSize int
|
||||||
workerPoolSize int
|
workerPoolSize int
|
||||||
|
@ -105,6 +107,7 @@ func NewOptions() *Options {
|
||||||
certKeyFile: defaultKeyFile,
|
certKeyFile: defaultKeyFile,
|
||||||
cleanupFrequency: defaultCleanupFrequency,
|
cleanupFrequency: defaultCleanupFrequency,
|
||||||
archiveReadDays: defaultArchiveReadDays,
|
archiveReadDays: defaultArchiveReadDays,
|
||||||
|
removeSessionsDays: defaultRemoveSessionsDays,
|
||||||
pollingFrequency: defaultPollingFrequency,
|
pollingFrequency: defaultPollingFrequency,
|
||||||
batchSize: defaultBatchSize,
|
batchSize: defaultBatchSize,
|
||||||
workerPoolSize: defaultWorkerPoolSize,
|
workerPoolSize: defaultWorkerPoolSize,
|
||||||
|
@ -271,6 +274,11 @@ func (o *Options) ArchiveReadDays() int {
|
||||||
return o.archiveReadDays
|
return o.archiveReadDays
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveSessionsDays returns the number of days after which to remove sessions.
|
||||||
|
func (o *Options) RemoveSessionsDays() int {
|
||||||
|
return o.removeSessionsDays
|
||||||
|
}
|
||||||
|
|
||||||
// PocketConsumerKey returns the Pocket Consumer Key if configured.
|
// PocketConsumerKey returns the Pocket Consumer Key if configured.
|
||||||
func (o *Options) PocketConsumerKey(defaultValue string) string {
|
func (o *Options) PocketConsumerKey(defaultValue string) string {
|
||||||
if o.pocketConsumerKey != "" {
|
if o.pocketConsumerKey != "" {
|
||||||
|
|
|
@ -118,6 +118,8 @@ func (p *Parser) parseLines(lines []string) (err error) {
|
||||||
p.opts.batchSize = parseInt(value, defaultBatchSize)
|
p.opts.batchSize = parseInt(value, defaultBatchSize)
|
||||||
case "ARCHIVE_READ_DAYS":
|
case "ARCHIVE_READ_DAYS":
|
||||||
p.opts.archiveReadDays = parseInt(value, defaultArchiveReadDays)
|
p.opts.archiveReadDays = parseInt(value, defaultArchiveReadDays)
|
||||||
|
case "REMOVE_SESSIONS_DAYS":
|
||||||
|
p.opts.removeSessionsDays = parseInt(value, defaultRemoveSessionsDays)
|
||||||
case "PROXY_IMAGES":
|
case "PROXY_IMAGES":
|
||||||
p.opts.proxyImages = parseString(value, defaultProxyImages)
|
p.opts.proxyImages = parseString(value, defaultProxyImages)
|
||||||
case "CREATE_ADMIN":
|
case "CREATE_ADMIN":
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
func Serve(store *storage.Storage, pool *worker.Pool) {
|
func Serve(store *storage.Storage, pool *worker.Pool) {
|
||||||
logger.Info(`Starting scheduler...`)
|
logger.Info(`Starting scheduler...`)
|
||||||
go feedScheduler(store, pool, config.Opts.PollingFrequency(), config.Opts.BatchSize())
|
go feedScheduler(store, pool, config.Opts.PollingFrequency(), config.Opts.BatchSize())
|
||||||
go cleanupScheduler(store, config.Opts.CleanupFrequency(), config.Opts.ArchiveReadDays())
|
go cleanupScheduler(store, config.Opts.CleanupFrequency(), config.Opts.ArchiveReadDays(), config.Opts.RemoveSessionsDays())
|
||||||
}
|
}
|
||||||
|
|
||||||
func feedScheduler(store *storage.Storage, pool *worker.Pool, frequency, batchSize int) {
|
func feedScheduler(store *storage.Storage, pool *worker.Pool, frequency, batchSize int) {
|
||||||
|
@ -33,11 +33,11 @@ func feedScheduler(store *storage.Storage, pool *worker.Pool, frequency, batchSi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func cleanupScheduler(store *storage.Storage, frequency int, archiveDays int) {
|
func cleanupScheduler(store *storage.Storage, frequency int, archiveDays int, sessionsDays int) {
|
||||||
c := time.Tick(time.Duration(frequency) * time.Hour)
|
c := time.Tick(time.Duration(frequency) * time.Hour)
|
||||||
for range c {
|
for range c {
|
||||||
nbSessions := store.CleanOldSessions()
|
nbSessions := store.CleanOldSessions(sessionsDays)
|
||||||
nbUserSessions := store.CleanOldUserSessions()
|
nbUserSessions := store.CleanOldUserSessions(sessionsDays)
|
||||||
logger.Info("[Scheduler:Cleanup] Cleaned %d sessions and %d user sessions", nbSessions, nbUserSessions)
|
logger.Info("[Scheduler:Cleanup] Cleaned %d sessions and %d user sessions", nbSessions, nbUserSessions)
|
||||||
|
|
||||||
if err := store.ArchiveEntries(archiveDays); err != nil {
|
if err := store.ArchiveEntries(archiveDays); err != nil {
|
||||||
|
|
|
@ -100,10 +100,10 @@ func (s *Storage) FlushAllSessions() (err error) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CleanOldSessions removes sessions older than 30 days.
|
// CleanOldSessions removes sessions older than specified days.
|
||||||
func (s *Storage) CleanOldSessions() int64 {
|
func (s *Storage) CleanOldSessions(days int) int64 {
|
||||||
query := `DELETE FROM sessions
|
query := fmt.Sprintf(`DELETE FROM sessions
|
||||||
WHERE id IN (SELECT id FROM sessions WHERE created_at < now() - interval '30 days')`
|
WHERE id IN (SELECT id FROM sessions WHERE created_at < now() - interval '%d days')`, days)
|
||||||
|
|
||||||
result, err := s.db.Exec(query)
|
result, err := s.db.Exec(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -124,10 +124,10 @@ func (s *Storage) RemoveUserSessionByID(userID, sessionID int64) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CleanOldUserSessions removes user sessions older than 30 days.
|
// CleanOldUserSessions removes user sessions older than specified days.
|
||||||
func (s *Storage) CleanOldUserSessions() int64 {
|
func (s *Storage) CleanOldUserSessions(days int) int64 {
|
||||||
query := `DELETE FROM user_sessions
|
query := fmt.Sprintf(`DELETE FROM user_sessions
|
||||||
WHERE id IN (SELECT id FROM user_sessions WHERE created_at < now() - interval '30 days')`
|
WHERE id IN (SELECT id FROM user_sessions WHERE created_at < now() - interval '%d days')`, days)
|
||||||
|
|
||||||
result, err := s.db.Exec(query)
|
result, err := s.db.Exec(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue