Upload via GUI (338 Dateien)

This commit is contained in:
2026-10-25 17:46:56 +00:00
parent 071c0dae72
commit 115f48f957
+133
View File
@@ -1409,6 +1409,139 @@ function run_migrations(PDO $pdo, bool $verbose = false): array
}
}
// Migration 0050: Kategorien für Dienste auf der Statusseite.
if (!isset($done['php_0050_status_categories'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$cols = $pdo->query($drv === 'sqlite' ? 'PRAGMA table_info(status_components)' : 'SHOW COLUMNS FROM status_components')->fetchAll();
$hasCategory = false;
foreach ($cols as $col) if (($col['name'] ?? $col['Field'] ?? '') === 'category') $hasCategory = true;
if (!$hasCategory) $pdo->exec('ALTER TABLE status_components ADD COLUMN category VARCHAR(80) NULL');
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0050_status_categories']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0050_status_categories';
} catch (Throwable $e) {
$result['errors'][] = 'php_0050_status_categories: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0050_status_categories - ' . $e->getMessage();
}
}
// Migration 0051: Kategorien als eigene Datensätze mit Dropdown-Zuordnung.
if (!isset($done['php_0051_status_category_records'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$ai = $drv === 'sqlite' ? 'INTEGER PRIMARY KEY AUTOINCREMENT' : 'INT AUTO_INCREMENT PRIMARY KEY';
$eng = $drv === 'sqlite' ? '' : ' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4';
$pdo->exec("CREATE TABLE IF NOT EXISTS status_categories (
id $ai,
name VARCHAR(80) NOT NULL,
sort_order INT NOT NULL DEFAULT 0
)$eng");
$cols = $pdo->query($drv === 'sqlite' ? 'PRAGMA table_info(status_components)' : 'SHOW COLUMNS FROM status_components')->fetchAll();
$hasCategoryId = false;
foreach ($cols as $col) if (($col['name'] ?? $col['Field'] ?? '') === 'category_id') $hasCategoryId = true;
if (!$hasCategoryId) $pdo->exec('ALTER TABLE status_components ADD COLUMN category_id INT NULL');
$legacy = $pdo->query("SELECT DISTINCT category FROM status_components WHERE category IS NOT NULL AND TRIM(category) <> ''")->fetchAll(PDO::FETCH_COLUMN);
$find = $pdo->prepare('SELECT id FROM status_categories WHERE LOWER(name) = LOWER(?) LIMIT 1');
$add = $pdo->prepare('INSERT INTO status_categories (name, sort_order) VALUES (?,?)');
$assign = $pdo->prepare('UPDATE status_components SET category_id = ? WHERE category = ? AND category_id IS NULL');
foreach ($legacy as $name) {
$find->execute([$name]);
$categoryId = $find->fetchColumn();
if (!$categoryId) {
$add->execute([$name, 0]);
$categoryId = (int) $pdo->lastInsertId();
}
$assign->execute([$categoryId, $name]);
}
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0051_status_category_records']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0051_status_category_records';
} catch (Throwable $e) {
$result['errors'][] = 'php_0051_status_category_records: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0051_status_category_records - ' . $e->getMessage();
}
}
// Migration 0052: Statuswechsel der Dienste für eine ehrliche Verlaufsanzeige speichern.
if (!isset($done['php_0052_status_component_history'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$ai = $drv === 'sqlite' ? 'INTEGER PRIMARY KEY AUTOINCREMENT' : 'INT AUTO_INCREMENT PRIMARY KEY';
$eng = $drv === 'sqlite' ? '' : ' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4';
$pdo->exec("CREATE TABLE IF NOT EXISTS status_component_events (
id $ai,
component_id INT NOT NULL,
status VARCHAR(20) NOT NULL,
created_at DATETIME NOT NULL
)$eng");
// Der erste Messpunkt ist ab jetzt; frühere Zustände werden nicht geraten.
$existing = $pdo->prepare('SELECT COUNT(*) FROM status_component_events WHERE component_id = ?');
$seed = $pdo->prepare('INSERT INTO status_component_events (component_id, status, created_at) VALUES (?,?,?)');
foreach ($pdo->query('SELECT id, status FROM status_components')->fetchAll() as $component) {
$existing->execute([(int) $component['id']]);
if ((int) $existing->fetchColumn() === 0) $seed->execute([(int) $component['id'], (string) $component['status'], date('Y-m-d H:i:s')]);
}
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0052_status_component_history']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0052_status_component_history';
} catch (Throwable $e) {
$result['errors'][] = 'php_0052_status_component_history: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0052_status_component_history - ' . $e->getMessage();
}
}
// Migration 0053: automatische Statusprüfungen für Dienste konfigurieren.
if (!isset($done['php_0053_status_auto_checks'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$cols = $pdo->query($drv === 'sqlite' ? 'PRAGMA table_info(status_components)' : 'SHOW COLUMNS FROM status_components')->fetchAll();
$existing = [];
foreach ($cols as $col) $existing[] = (string) ($col['name'] ?? $col['Field'] ?? '');
$add = [
'monitor_type' => "VARCHAR(20) NOT NULL DEFAULT 'auto'",
'monitor_target' => 'VARCHAR(500) NULL',
'last_checked_at' => 'DATETIME NULL',
'last_check_ms' => 'INT NULL',
'last_check_error' => 'VARCHAR(255) NULL',
'consecutive_failures' => 'INT NOT NULL DEFAULT 0',
];
foreach ($add as $column => $definition) {
if (!in_array($column, $existing, true)) $pdo->exec("ALTER TABLE status_components ADD COLUMN $column $definition");
}
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0053_status_auto_checks']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0053_status_auto_checks';
} catch (Throwable $e) {
$result['errors'][] = 'php_0053_status_auto_checks: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0053_status_auto_checks - ' . $e->getMessage();
}
}
// Migration 0054: einzelne Prüfergebnisse für die Heartbeat-Leiste speichern.
if (!isset($done['php_0054_status_check_samples'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$ai = $drv === 'sqlite' ? 'INTEGER PRIMARY KEY AUTOINCREMENT' : 'INT AUTO_INCREMENT PRIMARY KEY';
$eng = $drv === 'sqlite' ? '' : ' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4';
$pdo->exec("CREATE TABLE IF NOT EXISTS status_component_checks (
id $ai,
component_id INT NOT NULL,
status VARCHAR(20) NOT NULL,
checked_at DATETIME NOT NULL,
response_ms INT NULL
)$eng");
$pdo->exec('CREATE INDEX idx_status_component_checks_lookup ON status_component_checks (component_id, checked_at, id)');
$pdo->exec('CREATE INDEX idx_status_component_checks_checked_at ON status_component_checks (checked_at)');
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0054_status_check_samples']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0054_status_check_samples';
} catch (Throwable $e) {
$result['errors'][] = 'php_0054_status_check_samples: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0054_status_check_samples - ' . $e->getMessage();
}
}
// Migration 0049: gesammelte, noch nicht übersetzte Texte (Sammelmodus der Mehrsprachigkeit).
if (!isset($done['php_0049_i18n_missing'])) {
try {