@extends('admin.layout') @section('title', __('admin.operations.title').' · '.__('admin.brand')) @section('content') @php $integrityState = $integrity['status'] ?? 'missing'; $integrityClass = match ($integrityState) { 'healthy' => 'status-healthy', 'warning' => 'status-degraded', 'critical' => 'status-critical', default => 'status-unknown', }; $latestVerification = data_get($latestSnapshot, 'verification.status', 'missing'); $latestVerificationClass = match ($latestVerification) { 'verified' => 'status-success', 'warning' => 'status-degraded', 'invalid' => 'status-critical', default => 'status-unknown', }; $replicaState = $replicaReadiness['ready'] ? 'verified' : ($replicaReadiness['configured'] ? 'warning' : 'missing'); $replicaClass = $replicaReadiness['ready'] ? 'status-success' : ($replicaReadiness['configured'] ? 'status-degraded' : 'status-unknown'); $restoreState = $restoreDrill['status'] ?? 'missing'; $restoreClass = match ($restoreState) { 'verified' => 'status-success', 'warning' => 'status-degraded', 'invalid' => 'status-critical', default => 'status-unknown', }; $humanBytes = static function (int $bytes): string { if ($bytes < 1024) return $bytes.' B'; $units = ['KB', 'MB', 'GB', 'TB']; $value = $bytes / 1024; foreach ($units as $unit) { if ($value < 1024 || $unit === 'TB') return number_format($value, 2).' '.$unit; $value /= 1024; } return $bytes.' B'; }; @endphp
{{ __('admin.operations.subtitle') }}
{{ __('admin.operations.integrity_hint') }}
| {{ __('admin.operations.check') }} | {{ __('admin.status') }} | {{ __('admin.operations.result') }} |
|---|---|---|
{{ $check['key'] ?? '—' }} |
{{ __('admin.operations.states.'.($check['status'] ?? 'missing')) }} | {{ $check['message'] ?? '—' }} |
{{ __('admin.operations.recovery_hint') }}
{{ $operationsConfig['snapshot_path'] }}{{ __('admin.operations.private_note') }}
{{ __('admin.operations.replica_note') }}
{{ __('admin.operations.snapshots_hint') }}
| {{ __('admin.operations.snapshot_id') }} | {{ __('admin.operations.created') }} | {{ __('admin.status') }} | {{ __('admin.operations.driver') }} | {{ __('admin.operations.size') }} | {{ __('admin.validation') }} | {{ __('admin.operations.replica') }} | {{ __('admin.operations.label') }} | {{ __('admin.actions') }} |
|---|---|---|---|---|---|---|---|---|
{{ $snapshot['snapshot_id'] ?? '—' }} |
{{ $snapshot['created_at'] ?? '—' }} | {{ __('admin.operations.states.'.$state) }} | {{ data_get($snapshot, 'database.driver', '—') }} | {{ $humanBytes((int) data_get($snapshot, 'database.size_bytes', 0)) }} | {{ __('admin.operations.states.'.$verification) }} | @php $rowReplica = data_get($snapshot, 'replica.status', 'missing'); $rowReplicaClass = match ($rowReplica) { 'verified' => 'status-success', 'warning' => 'status-degraded', 'invalid', 'failed' => 'status-critical', default => 'status-unknown', }; @endphp{{ __('admin.operations.states.'.$rowReplica) }} | {{ $snapshot['label'] ?? '—' }} |
@if ($state === 'complete')
|
{{ __('admin.operations.restore_drill_hint') }}
{{ $restoreDrill['snapshot_id'] ?? '—' }}| {{ __('admin.operations.check') }} | {{ __('admin.status') }} | {{ __('admin.operations.result') }} |
|---|---|---|
{{ $check['key'] ?? '—' }} |
{{ __('admin.operations.states.'.($check['status'] ?? 'missing')) }} | {{ $check['message'] ?? '—' }} |
{{ __('admin.operations.cli_hint') }}
php artisan cw:data:integrityphp artisan cw:data:snapshot --label=manualphp artisan cw:data:snapshot:verify latestphp artisan cw:data:restore:check latestphp artisan cw:data:snapshot:replicate latestphp artisan cw:data:restore:drill latest{{ __('admin.operations.restore_note') }}
{{ __('admin.operations.restore_drill_note') }}