feat(store): add MaintenancePolicy CRUD backend
Типы maintenance_policy, методы store.Backend и реализации для PostgreSQL и in-memory. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user