Add cleaner services
Some checks are pending
/ test (push) Waiting to run

Initial cleaner is for expiring access tokens
This commit is contained in:
Melody Becker 2025-04-04 16:16:08 +02:00
parent 6f16289b41
commit 4ef9e19fbc
Signed by: mstar
SSH key fingerprint: SHA256:9VAo09aaVNTWKzPW7Hq2LW+ox9OdwmTSHRoD4mlz1yI
2 changed files with 89 additions and 0 deletions

View file

@ -0,0 +1,19 @@
package cleaners
import (
"time"
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
)
func init() {
cleanerBuilders = append(cleanerBuilders, buildExpireAccessTokens)
}
func tickExpireAccessTokens(now time.Time) {
dbgen.AccessToken.Where(dbgen.AccessToken.ExpiresAt.Lt(time.Now())).Delete()
}
func buildExpireAccessTokens() (onTick func(time.Time), name string, tickSpeed time.Duration) {
return tickExpireAccessTokens, "expire-access-tokens", time.Hour
}

View file

@ -0,0 +1,70 @@
package cleaners
import (
"sync"
"time"
)
type CleanerManager struct {
activeCleaners map[string]bool
activeCleanerLock sync.Mutex
exitChans []chan any
}
var cleanerBuilders = []func() (onTick func(time.Time), name string, tickSpeed time.Duration){}
func NewManager() *CleanerManager {
activeCleaners := make(map[string]bool)
exitChans := []chan any{}
cm := &CleanerManager{
activeCleaners: activeCleaners,
exitChans: exitChans,
}
// Launch all cleaner tickers in a new goroutine each
for _, builder := range cleanerBuilders {
exitChan := make(chan any, 1)
onTick, name, tickSpeed := builder()
cm.exitChans = append(cm.exitChans, exitChan)
go cm.tickOrExit(tickSpeed, name, exitChan, onTick)
}
return cm
}
func (m *CleanerManager) Stop() {
for _, exitChan := range m.exitChans {
exitChan <- 1
}
}
func (m *CleanerManager) tickOrExit(
tickSpeed time.Duration,
name string,
exitChan chan any,
onTick func(time.Time),
) {
ticker := time.Tick(tickSpeed)
for {
select {
case now := <-ticker:
go m.wrapOnTick(name, now, onTick)
case <-exitChan:
return
}
}
}
func (m *CleanerManager) wrapOnTick(name string, now time.Time, onTick func(time.Time)) {
m.activeCleanerLock.Lock()
if m.activeCleaners[name] {
m.activeCleanerLock.Unlock()
return
}
m.activeCleaners[name] = true
m.activeCleanerLock.Unlock()
onTick(now)
m.activeCleanerLock.Lock()
m.activeCleaners[name] = false
m.activeCleanerLock.Unlock()
}