Files
RenewCMS/internal/infrastructure/useCases/PurgeScheduler.go
T
2026-10-06 22:25:23 +02:00

60 lines
1.5 KiB
Go

package useCases
import (
"RenewCMS/internal/domain/audit"
"RenewCMS/internal/domain/purge"
"context"
"errors"
"time"
)
type PurgeRunner interface {
Execute(fingerprint *string) (purge.RunResult, error)
}
type PurgeSchedulerUseCase struct {
repository purge.Repository
runner PurgeRunner
recorder audit.Recorder
}
func NewPurgeSchedulerUseCase(repository purge.Repository, runner PurgeRunner, recorder audit.Recorder) *PurgeSchedulerUseCase {
return &PurgeSchedulerUseCase{repository, runner, recorder}
}
func (u *PurgeSchedulerUseCase) Tick(now time.Time) (purge.RunResult, bool, error) {
settings, err := u.repository.Get()
if err != nil {
return purge.RunResult{}, false, err
}
next := settings.NextPurgeAt()
if next == nil || now.Before(*next) {
return purge.RunResult{}, false, nil
}
result, err := u.runner.Execute(nil)
if err != nil {
u.recordFailedRun(err)
return purge.RunResult{}, false, err
}
if result.GroupsTotal > 0 {
event := systemPurgeEvent()
event.Params = purgeParams(result)
u.recorder.Record(context.Background(), event)
}
return result, true, nil
}
func (u *PurgeSchedulerUseCase) recordFailedRun(err error) {
if errors.Is(err, purge.ErrPurgeBusy) {
return
}
failFrom(context.Background(), u.recorder, systemPurgeEvent(), reasonFor(err))
}
func systemPurgeEvent() audit.Event {
event := audit.NewEvent(audit.ActionMediaPurgeScheduled, audit.CategorySystem)
event.Actor = audit.SystemActor()
event.Source = audit.SourceSystem
return event
}