148 lines
4.4 KiB
PHP
148 lines
4.4 KiB
PHP
<?php
|
||
/**
|
||
* Database & Models Installer
|
||
* Nutzung: php install_db.php
|
||
*/
|
||
|
||
if (php_sapi_name() !== 'cli') {
|
||
die("Dieses Script muss über die CLI ausgeführt werden.\n");
|
||
}
|
||
|
||
require_once __DIR__ . '/WEBROOT/src/database/databaseConnect.php';
|
||
require_once __DIR__ . '/WEBROOT/src/utils/databaseMethods.php';
|
||
|
||
$config = parse_ini_file(__DIR__ . '/WEBROOT/src/config/env.ini');
|
||
$env = strtoupper($config['APP_ENV']);
|
||
$dbName = $config["DB_{$env}_DATABASE"];
|
||
$workerUser = $config["DB_{$env}_USERNAME"];
|
||
$workerPass = $config["DB_{$env}_PASSWORD"];
|
||
|
||
echo "🚀 Starte Datenbank-Setup als Root...\n";
|
||
$rootConn = db_connect_root();
|
||
if (!$rootConn) {
|
||
die("❌ Fehler: Verbindung als Root fehlgeschlagen. Bitte prüfe DB_ROOT credentials in env.ini\n");
|
||
}
|
||
|
||
// 1. Datenbank erstellen
|
||
echo "📁 Erstelle Datenbank '$dbName'...\n";
|
||
$rootConn->query("CREATE DATABASE IF NOT EXISTS `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
||
|
||
// 2. Worker User erstellen und berechtigen (intern & extern)
|
||
echo "👤 Erstelle Worker-User '$workerUser'...\n";
|
||
$rootConn->query("CREATE USER IF NOT EXISTS '$workerUser'@'localhost' IDENTIFIED BY '$workerPass'");
|
||
$rootConn->query("CREATE USER IF NOT EXISTS '$workerUser'@'%' IDENTIFIED BY '$workerPass'");
|
||
|
||
echo "🔐 Vergebe Berechtigungen...\n";
|
||
$rootConn->query("GRANT ALL PRIVILEGES ON `$dbName`.* TO '$workerUser'@'localhost'");
|
||
$rootConn->query("GRANT ALL PRIVILEGES ON `$dbName`.* TO '$workerUser'@'%'");
|
||
$rootConn->query("FLUSH PRIVILEGES");
|
||
|
||
$rootConn->close();
|
||
|
||
echo "🚀 Starte Datenbank-Tabellen-Installation...\n";
|
||
|
||
// Definitionen der Tabellen und Models
|
||
$tables = [
|
||
'Mailing' => [
|
||
'columns' => "
|
||
`ID` INT AUTO_INCREMENT PRIMARY KEY,
|
||
`DATUM` DATETIME NOT NULL,
|
||
`SUBJECT` VARCHAR(255),
|
||
`MESSAGE` TEXT,
|
||
`URL` VARCHAR(255),
|
||
`CLIENT_IP` VARCHAR(45)
|
||
",
|
||
'model' => <<<PHP
|
||
<?php
|
||
|
||
namespace MVC\Model;
|
||
|
||
use MVC\Core\Model;
|
||
|
||
class Mailing extends Model {
|
||
protected static \$table = "Mailing";
|
||
|
||
public static function log(\$subject, \$message, \$url, \$ip, \$date) {
|
||
return self::insert([
|
||
'DATUM' => \$date,
|
||
'SUBJECT' => \$subject,
|
||
'MESSAGE' => \$message,
|
||
'URL' => \$url,
|
||
'CLIENT_IP' => \$ip
|
||
]);
|
||
}
|
||
}
|
||
PHP
|
||
],
|
||
'Users' => [
|
||
'columns' => "
|
||
`ID` INT AUTO_INCREMENT PRIMARY KEY,
|
||
`USERNAME` VARCHAR(50) UNIQUE NOT NULL,
|
||
`PASSWORD` VARCHAR(255) NOT NULL,
|
||
`EMAIL` VARCHAR(100),
|
||
`ROLE` VARCHAR(20) DEFAULT 'user',
|
||
`CREATED_AT` DATETIME DEFAULT CURRENT_TIMESTAMP
|
||
",
|
||
'model' => <<<PHP
|
||
<?php
|
||
|
||
namespace MVC\Model;
|
||
|
||
use MVC\Core\Model;
|
||
|
||
class Users extends Model {
|
||
protected static \$table = "Users";
|
||
|
||
/**
|
||
* Findet einen Benutzer nach seinem Namen.
|
||
*/
|
||
public static function getByUsername(\$username) {
|
||
\$result = self::where("USERNAME = ?", \$username);
|
||
return \$result[0] ?? null;
|
||
}
|
||
}
|
||
PHP
|
||
],
|
||
];
|
||
|
||
foreach ($tables as $tableName => $info) {
|
||
echo "--- Tabelle: $tableName ---\n";
|
||
try {
|
||
if (DatabaseCreateTable($tableName, $info['columns'])) {
|
||
echo "✅ Struktur bereit.\n";
|
||
|
||
$modelPath = __DIR__ . "/WEBROOT/src/MVC/Model/{$tableName}.php";
|
||
if (!file_exists($modelPath)) {
|
||
if (!is_dir(dirname($modelPath))) mkdir(dirname($modelPath), 0755, true);
|
||
file_put_contents($modelPath, $info['model']);
|
||
echo "✅ Model erstellt: $modelPath\n";
|
||
} else {
|
||
echo "ℹ️ Model existiert bereits.\n";
|
||
}
|
||
}
|
||
} catch (Exception $e) {
|
||
echo "❌ Fehler bei $tableName: " . $e->getMessage() . "\n";
|
||
}
|
||
}
|
||
|
||
// 3. Test-User anlegen
|
||
echo "👤 Erstelle Test-User...\n";
|
||
require_once __DIR__ . '/WEBROOT/src/MVC/Model/Users.php';
|
||
try {
|
||
if (!\MVC\Model\Users::getByUsername('admin')) {
|
||
\MVC\Model\Users::insert([
|
||
'USERNAME' => 'admin',
|
||
'PASSWORD' => password_hash('admin123', PASSWORD_DEFAULT),
|
||
'EMAIL' => 'admin@example.com',
|
||
'ROLE' => 'admin'
|
||
]);
|
||
echo "✅ Test-User 'admin' mit Passwort 'admin123' erstellt.\n";
|
||
} else {
|
||
echo "ℹ️ Test-User 'admin' existiert bereits.\n";
|
||
}
|
||
} catch (Exception $e) {
|
||
echo "❌ Fehler beim Erstellen des Test-Users: " . $e->getMessage() . "\n";
|
||
}
|
||
|
||
echo "\n✨ Installation abgeschlossen.\n";
|