3.3 KiB
Data Model: Backup/Restore Job Orchestration (049)
This feature relies on existing “run record” models/tables and (optionally) extends them to meet the orchestration requirements.
Entities
1) RestoreRun (restore_runs)
Purpose: Run record for restore executions and dry-run/preview workflows.
Model: App\Models\RestoreRun
Key fields (existing):
id(PK)tenant_id(FK → tenants)backup_set_id(FK → backup_sets)requested_by(string|null)is_dry_run(bool)status(string)requested_items(json|null)preview(json|null) — persisted preview outputresults(json|null) — persisted execution output (may include per-item outcomes)failure_reason(text|null)started_at/completed_at(timestamp|null)metadata(json|null)
Relationships:
RestoreRun belongsTo TenantRestoreRun belongsTo BackupSet
State transitions (target):
queued → running → succeeded|failed|partial
Validation constraints (creation/dispatch):
- tenant-scoped access required
backup_set_idmust belong to tenant- preview/dry-run must not perform writes (constitution Read/Write Separation)
2) BulkOperationRun (bulk_operation_runs)
Purpose: Run record for background operations that process many internal items, including backup-set capture-like actions.
Model: App\Models\BulkOperationRun
Key fields (existing):
id(PK)tenant_id(FK → tenants)user_id(FK → users)resource(string) — e.g.policy,backup_setaction(string) — e.g.export,add_policiesstatus(string) —pending,running,completed,completed_with_errors,failed,abortedtotal_items,processed_items,succeeded,failed,skippeditem_ids(jsonb)failures(jsonb|null) — safe per-item error summariesaudit_log_id(FK → audit_logs|null)
Relationships:
BulkOperationRun belongsTo TenantBulkOperationRun belongsTo User
Recommended additions (to satisfy FR-002/FR-004 cleanly):
idempotency_key(string, indexed; uniqueness enforced for active statuses via partial index)started_at/finished_at(timestampTz)error_code(string|null)error_context(jsonb|null)
State transitions (target):
queued → running → succeeded|failed|partialpendingmaps toqueuedcompleted_with_errorsmaps topartial
3) Notification Event (DB notifications)
Purpose: Persist state transitions and completion notices for the initiating user.
Storage: Laravel Notifications (DB channel).
Payload shape (target):
tenant_idrun_type(restore_run / bulk_operation_run)run_idstatus(queued/running/succeeded/failed/partial)counts(optional)safe_error_code+safe_error_context(optional)
Notes on “per-item outcomes” (FR-005)
- For restore workflows, per-item outcomes can initially be stored in
restore_runs.resultsas a structured JSON array/object keyed by internal item identifiers. - For bulk operations, per-item outcomes are already persisted as
bulk_operation_runs.failuresplus the counter columns. - If Phase 1 needs relational per-item tables for querying/filtering, introduce a dedicated “run item results” table per run type (Phase 2+ preferred).