package store import ( "strings" "time" ) // Vacuum strategy values for maintenance_policy.vacuum_strategy. const ( VacuumStrategyNone = "none" VacuumStrategyVacuum = "vacuum" VacuumStrategyAnalyze = "analyze" VacuumStrategyVacuumAnalyze = "vacuum_analyze" VacuumStrategyReindex = "reindex" ) // MaintenancePolicy is an instance-scoped PostgreSQL maintenance policy (control plane DB). type MaintenancePolicy struct { ID string `json:"id,omitempty"` Name string `json:"name"` TableName string `json:"table_name"` Condition string `json:"condition"` RetentionPeriodSec *int `json:"retention_period_sec,omitempty"` MaxRows *int `json:"max_rows,omitempty"` VacuumStrategy string `json:"vacuum_strategy"` Schedule string `json:"schedule"` Enabled bool `json:"enabled"` DryRunEnabled bool `json:"dry_run_enabled"` LastRunAt *time.Time `json:"last_run_at,omitempty"` LastStatus string `json:"last_status,omitempty"` LastError string `json:"last_error,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty"` } // MaintenancePolicyPatch is a partial update for maintenance_policy. type MaintenancePolicyPatch struct { Name *string `json:"name,omitempty"` TableName *string `json:"table_name,omitempty"` Condition *string `json:"condition,omitempty"` RetentionPeriodSec *int `json:"retention_period_sec,omitempty"` MaxRows *int `json:"max_rows,omitempty"` VacuumStrategy *string `json:"vacuum_strategy,omitempty"` Schedule *string `json:"schedule,omitempty"` Enabled *bool `json:"enabled,omitempty"` DryRunEnabled *bool `json:"dry_run_enabled,omitempty"` } // MaintenancePolicyConfigAudit is a configuration change log entry. type MaintenancePolicyConfigAudit struct { ID string `json:"id"` PolicyID string `json:"policy_id,omitempty"` ActorPrefix string `json:"actor_prefix"` Action string `json:"action"` Before map[string]any `json:"before,omitempty"` After map[string]any `json:"after,omitempty"` CreatedAt time.Time `json:"created_at"` } // ValidVacuumStrategy reports whether s is an allowed vacuum_strategy value. func ValidVacuumStrategy(s string) bool { switch strings.TrimSpace(s) { case VacuumStrategyNone, VacuumStrategyVacuum, VacuumStrategyAnalyze, VacuumStrategyVacuumAnalyze, VacuumStrategyReindex: return true default: return false } } // NormalizeMaintenancePolicyCondition returns a safe default WHERE fragment. func NormalizeMaintenancePolicyCondition(condition string) string { c := strings.TrimSpace(condition) if c == "" { return "true" } return c } // ValidateMaintenancePolicyInput checks required fields for create/update payloads. func ValidateMaintenancePolicyInput(name, tableName, vacuumStrategy, schedule string) error { if strings.TrimSpace(name) == "" || strings.TrimSpace(tableName) == "" || strings.TrimSpace(schedule) == "" { return ErrInvalidInput } if !ValidVacuumStrategy(vacuumStrategy) { return ErrInvalidInput } return nil }