Files
RenewCMS/internal/infrastructure/useCases/EnforceRetention.go
T

62 lines
1.5 KiB
Go

package useCases
import (
"RenewCMS/internal/domain/invite"
"RenewCMS/internal/domain/retention"
"RenewCMS/internal/domain/session"
"RenewCMS/internal/domain/user"
"time"
)
type EnforceRetentionUseCase struct {
users user.Repository
invites invite.Repository
sessions session.Repository
}
func NewEnforceRetentionUseCase(users user.Repository, invites invite.Repository, sessions session.Repository) *EnforceRetentionUseCase {
return &EnforceRetentionUseCase{users, invites, sessions}
}
func (e *EnforceRetentionUseCase) Tick(now time.Time) (retention.Result, error) {
var result retention.Result
var err error
if result.RevokedSessions, err = e.sessions.DeleteExpired(now); err != nil {
return result, err
}
if result.UnverifiedUsers, err = e.deleteStaleUnverifiedUsers(now); err != nil {
return result, err
}
result.Invites, err = e.deleteStaleInvites(now)
return result, err
}
func (e *EnforceRetentionUseCase) deleteStaleUnverifiedUsers(now time.Time) (int, error) {
removed := 0
for _, candidate := range e.users.GetAll() {
if !candidate.IsStaleUnverifiedAt(now) {
continue
}
if err := e.users.Delete(candidate.ID); err != nil {
return removed, err
}
removed++
}
return removed, nil
}
func (e *EnforceRetentionUseCase) deleteStaleInvites(now time.Time) (int, error) {
removed := 0
for _, candidate := range e.invites.GetAll() {
if !candidate.IsStaleAt(now) {
continue
}
if err := e.invites.Delete(candidate.ID); err != nil {
return removed, err
}
removed++
}
return removed, nil
}