Split API and frontend, migrate SQLite to PostgreSQL

- api.fahrschultermin.de: full API entry point with CORS + session auth
- fahrschultermin.de: frontend only, no more /api/v1 routing
- Database.php: PostgreSQL support (pgsql driver + lastval())
- All repositories: use Database::lastInsertId() for PG compatibility
- config/app.php: PostgreSQL connection settings + CORS config
- bootstrap.php: pass full $config to Database::configure()
- public/index.php: fetch-patch to redirect /api/v1 to api.fahrschultermin.de
- database/schema_pgsql.sql: full PostgreSQL schema (BIGSERIAL)
- database/import_pgsql.sql: 518 rows migrated from SQLite
This commit is contained in:
Hermes Agent
2026-05-18 23:49:42 +02:00
parent 33d61c2fc7
commit 2d6c0ad3aa
15 changed files with 930 additions and 89 deletions

View File

@@ -5,15 +5,17 @@ declare(strict_types=1);
namespace App\Support;
use PDO;
use PDOException;
final class Database
{
private static string $path;
private static ?PDO $connection = null;
private static array $config = [];
public static function configure(string $path): void
public static function configure(array $config): void
{
self::$path = $path;
self::$config = $config;
self::$connection = null; // reset on reconfigure
}
public static function connection(): PDO
@@ -22,16 +24,43 @@ final class Database
return self::$connection;
}
$directory = dirname(self::$path);
if (!is_dir($directory)) {
mkdir($directory, 0775, true);
$driver = self::$config['db_driver'] ?? 'sqlite';
if ($driver === 'pgsql') {
$host = self::$config['db_host'] ?? '127.0.0.1';
$port = self::$config['db_port'] ?? '5432';
$dbname = self::$config['db_database'] ?? '';
$user = self::$config['db_username'] ?? '';
$password = self::$config['db_password'] ?? '';
$dsn = "pgsql:host={$host};port={$port};dbname={$dbname}";
self::$connection = new PDO($dsn, $user, $password);
} else {
$path = self::$config['db_path'] ?? self::$config['db_path'] ?? '';
$directory = dirname($path);
if (!is_dir($directory)) {
mkdir($directory, 0775, true);
}
self::$connection = new PDO('sqlite:' . $path);
self::$connection->exec('PRAGMA foreign_keys = ON');
}
self::$connection = new PDO('sqlite:' . self::$path);
self::$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
self::$connection->exec('PRAGMA foreign_keys = ON');
return self::$connection;
}
public static function isPostgres(): bool
{
return (self::$config['db_driver'] ?? 'sqlite') === 'pgsql';
}
public static function lastInsertId(): string
{
if (self::isPostgres()) {
return self::$connection->query('SELECT lastval()')->fetchColumn();
}
return self::$connection->lastInsertId();
}
}