118 lines
3.8 KiB
PHP
118 lines
3.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', '1');
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
|
|
try {
|
|
$config = require __DIR__ . '/../config/config.php';
|
|
$dbCfg = $config['db'];
|
|
|
|
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=%s', $dbCfg['host'], $dbCfg['dbname'], $dbCfg['charset']);
|
|
$pdo = new PDO($dsn, $dbCfg['username'], $dbCfg['password'], [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
]);
|
|
|
|
$sqlFile = __DIR__ . '/../sql/schema.sql';
|
|
if (!file_exists($sqlFile)) {
|
|
echo json_encode(['status' => 'error', 'message' => 'schema.sql file not found']);
|
|
exit;
|
|
}
|
|
|
|
$rawSql = file_get_contents($sqlFile);
|
|
|
|
// Remove comments
|
|
$lines = explode("\n", $rawSql);
|
|
$cleanLines = [];
|
|
foreach ($lines as $line) {
|
|
$trimmed = trim($line);
|
|
if (str_starts_with($trimmed, '--') || str_starts_with($trimmed, '#')) {
|
|
continue;
|
|
}
|
|
$cleanLines[] = $line;
|
|
}
|
|
$cleanSql = implode("\n", $cleanLines);
|
|
|
|
// Split queries by semicolon
|
|
$queries = array_filter(array_map('trim', explode(';', $cleanSql)));
|
|
|
|
$executed = 0;
|
|
foreach ($queries as $q) {
|
|
if (!empty($q)) {
|
|
$pdo->exec($q);
|
|
$executed++;
|
|
}
|
|
}
|
|
|
|
// Execute migration files in sql/migrations/
|
|
$migrationDir = __DIR__ . '/../sql/migrations';
|
|
if (is_dir($migrationDir)) {
|
|
$files = glob($migrationDir . '/*.sql');
|
|
sort($files);
|
|
foreach ($files as $mFile) {
|
|
$mSql = file_get_contents($mFile);
|
|
$mLines = explode("\n", $mSql);
|
|
$mClean = [];
|
|
foreach ($mLines as $l) {
|
|
$t = trim($l);
|
|
if (str_starts_with($t, '--') || str_starts_with($t, '#')) continue;
|
|
$mClean[] = $l;
|
|
}
|
|
$mQueries = array_filter(array_map('trim', explode(';', implode("\n", $mClean))));
|
|
foreach ($mQueries as $mq) {
|
|
if (!empty($mq)) {
|
|
try {
|
|
$pdo->exec($mq);
|
|
$executed++;
|
|
} catch (Throwable $e) {
|
|
// Ignore harmless duplicate column / migration errors
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Create / update Admin user: admin / Admin1337!
|
|
$adminUsername = 'admin';
|
|
$adminPassword = 'Admin1337!';
|
|
$passwordHash = password_hash($adminPassword, PASSWORD_ARGON2ID);
|
|
|
|
$stmt = $pdo->prepare('
|
|
INSERT INTO dc_users (username, password_hash, created_at)
|
|
VALUES (:u, :p, NOW())
|
|
ON DUPLICATE KEY UPDATE password_hash = VALUES(password_hash)
|
|
');
|
|
$stmt->execute([':u' => $adminUsername, ':p' => $passwordHash]);
|
|
|
|
// Seed default endpoints setting in dc_settings
|
|
$endpoints = json_encode([
|
|
'validate' => '/api/license/v1/validate',
|
|
'deactivate' => '/api/license/v1/deactivate',
|
|
]);
|
|
$stmtSet = $pdo->prepare('INSERT INTO dc_settings (skey, svalue) VALUES ("endpoints", :v) ON DUPLICATE KEY UPDATE svalue = VALUES(svalue)');
|
|
$stmtSet->execute([':v' => $endpoints]);
|
|
|
|
// Query created tables to verify
|
|
$tables = $pdo->query('SHOW TABLES')->fetchAll(PDO::FETCH_COLUMN);
|
|
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'message' => "Successfully executed {$executed} SQL statements!",
|
|
'created_user' => 'admin',
|
|
'tables_in_db' => $tables,
|
|
'timestamp' => date('Y-m-d H:i:s')
|
|
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
|
|
} catch (Throwable $t) {
|
|
http_response_code(500);
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => $t->getMessage(),
|
|
'file' => $t->getFile(),
|
|
'line' => $t->getLine()
|
|
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
}
|