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++; } } // 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); }