Add ticker for cleaning deleted users

This commit is contained in:
Melody Becker 2025-04-08 09:21:21 +02:00
parent 954e4c5a34
commit ecd4ed2ef8
Signed by: mstar
SSH key fingerprint: SHA256:9VAo09aaVNTWKzPW7Hq2LW+ox9OdwmTSHRoD4mlz1yI
4 changed files with 46 additions and 0 deletions

View file

@ -0,0 +1,23 @@
package cleaners
import (
"time"
"github.com/rs/zerolog/log"
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
)
func init() {
cleanerBuilders = append(cleanerBuilders, buildGdprUsers)
}
func tickGdprUsers(now time.Time) {
if err := dbgen.User.GdprUsers(); err != nil {
log.Error().Err(err).Msg("Failed to gdpr users")
}
}
func buildGdprUsers() (onTick func(time.Time), name string, tickSpeed time.Duration) {
return tickGdprUsers, "gdpr-users", time.Hour
}

View file

@ -3,6 +3,8 @@ package cleaners
import ( import (
"sync" "sync"
"time" "time"
"github.com/rs/zerolog/log"
) )
type CleanerManager struct { type CleanerManager struct {
@ -26,6 +28,7 @@ func NewManager() *CleanerManager {
exitChan := make(chan any, 1) exitChan := make(chan any, 1)
onTick, name, tickSpeed := builder() onTick, name, tickSpeed := builder()
cm.exitChans = append(cm.exitChans, exitChan) cm.exitChans = append(cm.exitChans, exitChan)
log.Info().Str("name", name).Msg("Starting ticker for cleaner")
go cm.tickOrExit(tickSpeed, name, exitChan, onTick) go cm.tickOrExit(tickSpeed, name, exitChan, onTick)
} }
@ -63,6 +66,7 @@ func (m *CleanerManager) wrapOnTick(name string, now time.Time, onTick func(time
} }
m.activeCleaners[name] = true m.activeCleaners[name] = true
m.activeCleanerLock.Unlock() m.activeCleanerLock.Unlock()
log.Info().Str("cleaner", name).Msg("Ticking cleaner")
onTick(now) onTick(now)
m.activeCleanerLock.Lock() m.activeCleanerLock.Lock()
m.activeCleaners[name] = false m.activeCleaners[name] = false

View file

@ -1460,6 +1460,7 @@ type IUserDo interface {
GetPagedTruePublic(pageNr uint) (result []models.User, err error) GetPagedTruePublic(pageNr uint) (result []models.User, err error)
GetPagedAllDeleted(pageNr uint) (result []models.User, err error) GetPagedAllDeleted(pageNr uint) (result []models.User, err error)
GetPagedAllNonDeleted(pageNr uint) (result []models.User, err error) GetPagedAllNonDeleted(pageNr uint) (result []models.User, err error)
GdprUsers() (err error)
} }
// Get a user by a username // Get a user by a username
@ -1552,6 +1553,20 @@ func (u userDo) GetPagedAllNonDeleted(pageNr uint) (result []models.User, err er
return return
} }
// Gdpr deleted users
//
// DELETE FROM @@table WHERE deleted_at IS NOT NULL AND deleted_at < NOW()
func (u userDo) GdprUsers() (err error) {
var generateSQL strings.Builder
generateSQL.WriteString("DELETE FROM users WHERE deleted_at IS NOT NULL AND deleted_at < NOW() ")
var executeSQL *gorm.DB
executeSQL = u.UnderlyingDB().Exec(generateSQL.String()) // ignore_security_alert
err = executeSQL.Error
return
}
func (u userDo) Debug() IUserDo { func (u userDo) Debug() IUserDo {
return u.withDO(u.DO.Debug()) return u.withDO(u.DO.Debug())
} }

View file

@ -112,4 +112,8 @@ type IUser interface {
// LIMIT 50 // LIMIT 50
// OFFSET @pageNr * 50 // OFFSET @pageNr * 50
GetPagedAllNonDeleted(pageNr uint) ([]gen.T, error) GetPagedAllNonDeleted(pageNr uint) ([]gen.T, error)
// Gdpr deleted users
//
// DELETE FROM @@table WHERE deleted_at IS NOT NULL AND deleted_at < NOW()
GdprUsers() error
} }