From 622fe59f5c5beca1888991d12c53c4faaa2cf99d Mon Sep 17 00:00:00 2001 From: Jeppe B <2jepp9350@gmail.com> Date: Tue, 4 Aug 2026 18:08:31 +0200 Subject: [PATCH] origin/schema-migration-xlvask-autopilot (#348) Co-authored-by: Jeppe Bundgaard --- services/nginx/app/cli.php | 4 ++ .../app/cron/EnsureXLVaskAutomationSchema.php | 68 +++++++++++++++++++ services/nginx/app/index.php | 2 +- 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 services/nginx/app/cron/EnsureXLVaskAutomationSchema.php diff --git a/services/nginx/app/cli.php b/services/nginx/app/cli.php index a6905cb8..2e84875b 100644 --- a/services/nginx/app/cli.php +++ b/services/nginx/app/cli.php @@ -106,6 +106,10 @@ if ($args[1] === 'run') { echo "[" . date('Y-m-d H:i:s') . "][CRON_WORKER] Starting cron worker\n"; (new \classes\cron_worker())->run(); break; + case 'xlvask-automation-migrate': + echo "[" . date('Y-m-d H:i:s') . "][XLVASK] Ensuring automation schema readiness\n"; + require_once 'cron/EnsureXLVaskAutomationSchema.php'; + break; default: echo "Invalid script name"; break; diff --git a/services/nginx/app/cron/EnsureXLVaskAutomationSchema.php b/services/nginx/app/cron/EnsureXLVaskAutomationSchema.php new file mode 100644 index 00000000..f3273911 --- /dev/null +++ b/services/nginx/app/cron/EnsureXLVaskAutomationSchema.php @@ -0,0 +1,68 @@ + false, + 'db_target' => $dbTarget, + 'preflight' => null, + 'applied' => false, + 'postflight' => null, + 'wash_id_uniqueness_ready' => false, + 'wash_id_uniqueness_activated' => false, + 'wash_id_uniqueness_blocked' => false, + 'error' => null, +]; + +try { + $preflight = migration_20260804_xlvask_ai_auto_policy_v2::preflight(); + $result['preflight'] = $preflight; + + if (!(bool)($preflight['ready'] ?? false)) { + $result['postflight'] = migration_20260804_xlvask_ai_auto_policy_v2::apply(); + $result['applied'] = true; + } else { + $result['postflight'] = $preflight; + } + + $postflight = (array)$result['postflight']; + if (!(bool)($postflight['ready'] ?? false)) { + throw new RuntimeException('XL Vask automation schema is still not ready after apply.'); + } + + if (xlvask_usage_logs_schema_bootstrap::washIdUniquenessReady()) { + $result['wash_id_uniqueness_ready'] = true; + } else { + $activated = xlvask_usage_logs_schema_bootstrap::applyWashIdUniquenessMigration(); + $result['wash_id_uniqueness_ready'] = $activated && xlvask_usage_logs_schema_bootstrap::washIdUniquenessReady(); + $result['wash_id_uniqueness_activated'] = $result['wash_id_uniqueness_ready']; + $result['wash_id_uniqueness_blocked'] = !$result['wash_id_uniqueness_ready']; + } + + $result['success'] = (bool)$result['wash_id_uniqueness_ready']; + if (!$result['success']) { + $result['error'] = 'Wash-id uniqueness is blocked, likely due duplicate normalized wash_id values.'; + } +} catch (Throwable $throwable) { + $result['error'] = $throwable->getMessage(); +} + +echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) . PHP_EOL; + +if (!$result['success']) { + throw new RuntimeException((string)($result['error'] ?: 'XL Vask schema readiness failed.')); +} + diff --git a/services/nginx/app/index.php b/services/nginx/app/index.php index 0b80af84..4795355a 100644 --- a/services/nginx/app/index.php +++ b/services/nginx/app/index.php @@ -14,7 +14,7 @@ require_once __DIR__ . '/classes/cors_policy.php'; /** CORS */ // OPTIONS requests are preflight requests for CORS, we can just return a 200 OK response -if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { +if (($_SERVER['REQUEST_METHOD'] ?? '') === 'OPTIONS') { $preflight = \classes\cors_policy::preflightResponse($_SERVER['HTTP_ORIGIN'] ?? '', (string)($CORS ?? '')); \classes\cors_policy::emitHeaders($preflight['headers']); http_response_code($preflight['status']);