package persistence import ( "RenewCMS/internal/domain/audit" "RenewCMS/internal/infrastructure/persistence/mappers" entity "RenewCMS/internal/infrastructure/persistence/models" "errors" "time" "gorm.io/gorm" ) const auditSettingsRowID uint32 = 1 type AuditSettingsRepository struct { db *gorm.DB } var _ audit.SettingsRepository = &AuditSettingsRepository{} func NewAuditSettingsRepository(db *gorm.DB) *AuditSettingsRepository { return &AuditSettingsRepository{db} } func (a *AuditSettingsRepository) Get() (audit.Settings, error) { var model entity.AuditSettings err := a.db.First(&model, auditSettingsRowID).Error if errors.Is(err, gorm.ErrRecordNotFound) { return audit.DefaultSettings(), nil } if err != nil { return audit.Settings{}, err } return mappers.AuditSettingsToDomain(model), nil } func (a *AuditSettingsRepository) SaveRetention(days int, maxGB int) error { return a.update(map[string]any{"retention_days": days, "retention_max_gb": maxGB}, func(settings *audit.Settings) { settings.RetentionDays = days settings.RetentionMaxGB = maxGB }) } func (a *AuditSettingsRepository) SaveLastCleanup(at time.Time, removed int) error { utc := at.UTC() return a.update(map[string]any{"last_cleanup_at": utc, "last_cleanup_removed": removed}, func(settings *audit.Settings) { settings.LastCleanupAt = &utc settings.LastCleanupRemoved = removed }) } func (a *AuditSettingsRepository) update(columns map[string]any, apply func(*audit.Settings)) error { result := a.db.Model(&entity.AuditSettings{}).Where("id = ?", auditSettingsRowID).Updates(columns) if result.Error != nil || result.RowsAffected > 0 { return result.Error } settings := audit.DefaultSettings() apply(&settings) model := mappers.AuditSettingsToModel(settings) model.ID = auditSettingsRowID return a.db.Create(&model).Error }