@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
COASTER WORLD DATA · {{ $platformVersion }}

{{ __('admin.operations.title') }}

{{ __('admin.operations.subtitle') }}

✓
{{ __('admin.operations.states.'.$integrityState) }}{{ __('admin.operations.integrity_state') }}
▣
{{ count($snapshots) }}{{ __('admin.operations.snapshot_count') }}
#
{{ __('admin.operations.states.'.$latestVerification) }}{{ __('admin.operations.latest_verification') }}
⚙
{{ $readiness['ready'] ? __('admin.yes') : __('admin.no') }}{{ __('admin.operations.snapshot_engine') }}
↗
{{ __('admin.operations.states.'.$replicaState) }}{{ __('admin.operations.replica_metric') }}
↺
{{ __('admin.operations.states.'.$restoreState) }}{{ __('admin.operations.restore_drill_metric') }}

{{ __('admin.operations.integrity_title') }}

{{ __('admin.operations.integrity_hint') }}

@csrf
@if ($integrity)
{{ __('admin.operations.current_state') }}{{ $integrity['generated_at'] ?? '—' }} {{ __('admin.operations.states.'.$integrityState) }}
{{ __('admin.operations.passed') }}{{ __('admin.operations.checks_summary') }} {{ data_get($integrity, 'summary.passed', 0) }}
{{ __('admin.operations.warnings') }}{{ __('admin.operations.checks_summary') }} {{ data_get($integrity, 'summary.warnings', 0) }}
{{ __('admin.operations.critical') }}{{ __('admin.operations.checks_summary') }} {{ data_get($integrity, 'summary.critical', 0) }}
@foreach (($integrity['checks'] ?? []) as $check) @php $checkClass = match ($check['status'] ?? 'unknown') { 'pass' => 'status-success', 'warning' => 'status-degraded', 'critical' => 'status-critical', default => 'status-unknown', }; @endphp @endforeach
{{ __('admin.operations.check') }}{{ __('admin.status') }}{{ __('admin.operations.result') }}
{{ $check['key'] ?? '—' }} {{ __('admin.operations.states.'.($check['status'] ?? 'missing')) }} {{ $check['message'] ?? '—' }}
@else
{{ __('admin.operations.no_integrity') }}
@endif

{{ __('admin.operations.recovery_title') }}

{{ __('admin.operations.recovery_hint') }}

{{ __('admin.operations.snapshot_ready') }}{{ __('admin.operations.readiness_reasons.'.$readiness['reason']) }}{{ $readiness['ready'] ? __('admin.yes') : __('admin.no') }}
{{ __('admin.operations.database_driver') }}{{ __('admin.operations.database_driver_hint') }}{{ $readiness['database_driver'] }}
{{ __('admin.operations.private_storage') }}{{ $operationsConfig['snapshot_disk'] }}{{ $operationsConfig['snapshot_path'] }}
{{ __('admin.operations.retention') }}{{ __('admin.operations.retention_hint') }}{{ $operationsConfig['retention_count'] }} / {{ $operationsConfig['retention_days'] }} {{ __('admin.operations.days') }}
{{ __('admin.operations.integrity_schedule') }}{{ $operationsConfig['integrity_schedule'] }}{{ $operationsConfig['integrity_schedule_enabled'] ? __('admin.enabled') : __('admin.disabled') }}
{{ __('admin.operations.snapshot_schedule') }}{{ $operationsConfig['snapshot_schedule'] }}{{ $operationsConfig['snapshot_schedule_enabled'] ? __('admin.enabled') : __('admin.disabled') }}
{{ __('admin.operations.replica_target') }}{{ __('admin.operations.replica_readiness_reasons.'.$replicaReadiness['reason']) }}{{ __('admin.operations.states.'.$replicaState) }}
{{ __('admin.operations.replica_schedule') }}{{ $operationsConfig['replica_schedule'] }}{{ $operationsConfig['replica_schedule_enabled'] ? __('admin.enabled') : __('admin.disabled') }}
{{ __('admin.operations.restore_drill_ready') }}{{ __('admin.operations.restore_readiness_reasons.'.$restoreReadiness['reason']) }}{{ $restoreReadiness['ready'] ? __('admin.yes') : __('admin.no') }}
{{ __('admin.operations.restore_drill_latest') }}{{ $restoreDrill['generated_at'] ?? __('admin.operations.never') }}{{ __('admin.operations.states.'.$restoreState) }}

{{ __('admin.operations.private_note') }}

{{ __('admin.operations.replica_note') }}

{{ __('admin.operations.snapshots_title') }}

{{ __('admin.operations.snapshots_hint') }}

@csrf
@if ($snapshots === [])
{{ __('admin.operations.no_snapshots') }}
@else
@foreach ($snapshots as $snapshot) @php $state = $snapshot['state'] ?? 'missing'; $verification = data_get($snapshot, 'verification.status', 'missing'); $stateClass = $state === 'complete' ? 'status-success' : ($state === 'failed' ? 'status-critical' : 'status-degraded'); $verificationClass = match ($verification) { 'verified' => 'status-success', 'warning' => 'status-degraded', 'invalid' => 'status-critical', default => 'status-unknown', }; @endphp @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 @endforeach
{{ __('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) }}{{ __('admin.operations.states.'.$rowReplica) }} {{ $snapshot['label'] ?? '—' }} @if ($state === 'complete')
@csrf
@csrf
@else — @endif
@endif

{{ __('admin.operations.restore_drill_title') }}

{{ __('admin.operations.restore_drill_hint') }}

@if ($restoreDrill)
{{ __('admin.operations.current_state') }}{{ $restoreDrill['generated_at'] ?? '—' }}{{ __('admin.operations.states.'.$restoreState) }}
{{ __('admin.operations.snapshot_id') }}{{ $restoreDrill['snapshot_id'] ?? '—' }}
@foreach (($restoreDrill['checks'] ?? []) as $check) @php $drillCheckClass = match ($check['status'] ?? 'unknown') { 'pass' => 'status-success', 'warning' => 'status-degraded', 'critical' => 'status-critical', default => 'status-unknown', }; @endphp @endforeach
{{ __('admin.operations.check') }}{{ __('admin.status') }}{{ __('admin.operations.result') }}
{{ $check['key'] ?? '—' }} {{ __('admin.operations.states.'.($check['status'] ?? 'missing')) }} {{ $check['message'] ?? '—' }}
@else
{{ __('admin.operations.no_restore_drill') }}
@endif

{{ __('admin.operations.cli_title') }}

{{ __('admin.operations.cli_hint') }}

{{ __('admin.operations.integrity_command') }}php artisan cw:data:integrity
{{ __('admin.operations.snapshot_command') }}php artisan cw:data:snapshot --label=manual
{{ __('admin.operations.verify_command') }}php artisan cw:data:snapshot:verify latest
{{ __('admin.operations.restore_command') }}php artisan cw:data:restore:check latest
{{ __('admin.operations.replica_command') }}php artisan cw:data:snapshot:replicate latest
{{ __('admin.operations.restore_drill_command') }}php artisan cw:data:restore:drill latest

{{ __('admin.operations.restore_note') }}

{{ __('admin.operations.restore_drill_note') }}

@endsection