origin/schema-migration-xlvask-autopilot (#348)

Co-authored-by: Jeppe Bundgaard <jb@truckwash.dk>
This commit is contained in:
Jeppe B
2026-08-04 16:08:31 +00:00
committed by GitHub
co-authored by Jeppe Bundgaard
parent 23fc410d25
commit 622fe59f5c
3 changed files with 73 additions and 1 deletions
+4
View File
@@ -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;
@@ -0,0 +1,68 @@
<?php
use classes\xlvask_usage_logs_schema_bootstrap;
use xlvask\migrations\migration_20260804_xlvask_ai_auto_policy_v2;
require_once WD . '/classes/xlvask_usage_logs_schema_bootstrap.php';
require_once WD . '/classes/xlvask_autopilot_service.php';
require_once WD . '/modules/xlvask/migrations/20260804_xlvask_ai_auto_policy_v2.php';
if (!defined('WD')) {
exit;
}
$dbTarget = strtolower(trim((string)(getenv('CONFIG_DB_TARGET') ?: 'live')));
$startedAt = date('Y-m-d H:i:s');
echo "[{$startedAt}][XLVASK] Target database: {$dbTarget}" . PHP_EOL;
$result = [
'success' => 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.'));
}
+1 -1
View File
@@ -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']);