121 lines
4.2 KiB
PHP
121 lines
4.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Config\ConfigLoader;
|
|
use App\Config\ConfigValidator;
|
|
use App\Database\ConnectionFactory;
|
|
use App\Module\Permissions\Permissions;
|
|
use App\Module\PlanetGenerator\Service\PlanetGenerator;
|
|
use Dotenv\Dotenv;
|
|
|
|
require __DIR__ . '/../vendor/autoload.php';
|
|
|
|
$repoRoot = dirname(__DIR__, 2);
|
|
if (file_exists($repoRoot . '/.env')) {
|
|
$dotenv = Dotenv::createImmutable($repoRoot);
|
|
$dotenv->safeLoad();
|
|
}
|
|
|
|
$pdo = ConnectionFactory::create();
|
|
$pdo->beginTransaction();
|
|
|
|
try {
|
|
$stmt = $pdo->prepare("INSERT INTO roles (key, name) VALUES (:key, :name) ON CONFLICT (key) DO NOTHING");
|
|
$stmt->execute(['key' => 'player', 'name' => 'Spieler']);
|
|
$stmt->execute(['key' => 'admin', 'name' => 'Admin']);
|
|
|
|
$permStmt = $pdo->prepare(
|
|
'INSERT INTO permissions (key, module, description) VALUES (:key, :module, :description)
|
|
ON CONFLICT (key) DO NOTHING'
|
|
);
|
|
foreach (Permissions::definitions() as $perm) {
|
|
$permStmt->execute($perm);
|
|
}
|
|
|
|
$pdo->exec("INSERT INTO role_permissions (role_id, permission_id)
|
|
SELECT r.id, p.id
|
|
FROM roles r
|
|
JOIN permissions p ON p.key = 'planet.public.view'
|
|
WHERE r.key = 'player'
|
|
ON CONFLICT DO NOTHING");
|
|
|
|
$pdo->exec("INSERT INTO role_permissions (role_id, permission_id)
|
|
SELECT r.id, p.id
|
|
FROM roles r
|
|
JOIN permissions p ON p.key = 'planet.admin.generate'
|
|
WHERE r.key = 'admin'
|
|
ON CONFLICT DO NOTHING");
|
|
|
|
$stmt = $pdo->prepare(
|
|
"INSERT INTO users (username, email, password_hash, race_key, title, avatar_key)
|
|
VALUES (:username, :email, :password_hash, :race_key, :title, :avatar_key)
|
|
ON CONFLICT (username) DO NOTHING"
|
|
);
|
|
$stmt->execute([
|
|
'username' => 'dev',
|
|
'email' => 'dev@example.test',
|
|
'password_hash' => password_hash('change-me', PASSWORD_DEFAULT),
|
|
'race_key' => 'human',
|
|
'title' => 'Pionier',
|
|
'avatar_key' => 'avatar-01',
|
|
]);
|
|
|
|
$userId = (int)$pdo->query("SELECT id FROM users WHERE username = 'dev'")->fetchColumn();
|
|
|
|
$pdo->exec("INSERT INTO user_roles (user_id, role_id)
|
|
SELECT {$userId}, r.id
|
|
FROM roles r
|
|
WHERE r.key = 'player'
|
|
ON CONFLICT DO NOTHING");
|
|
|
|
$planetExists = $pdo->prepare('SELECT id FROM planets WHERE user_id = :user_id LIMIT 1');
|
|
$planetExists->execute(['user_id' => $userId]);
|
|
$planetId = $planetExists->fetchColumn();
|
|
|
|
if (!$planetId) {
|
|
$configLoader = new ConfigLoader(new ConfigValidator(), $repoRoot . '/config');
|
|
$generator = new PlanetGenerator($configLoader);
|
|
$generated = $generator->generate('temperate', 'normal', 42);
|
|
|
|
$resources = [];
|
|
foreach ($configLoader->planetClasses()['resources'] as $res) {
|
|
$resources[$res] = 500.0;
|
|
}
|
|
|
|
$stmt = $pdo->prepare(
|
|
'INSERT INTO planets (user_id, name, class_key, planet_seed, temperature_c, modifiers, resources, last_resource_update_at)
|
|
VALUES (:user_id, :name, :class_key, :planet_seed, :temperature_c, :modifiers, :resources, :last_update)
|
|
RETURNING id'
|
|
);
|
|
$stmt->execute([
|
|
'user_id' => $userId,
|
|
'name' => 'Earth Prime',
|
|
'class_key' => $generated['class_key'],
|
|
'planet_seed' => 42,
|
|
'temperature_c' => (int)$generated['temperature_c'],
|
|
'modifiers' => json_encode($generated['modifiers'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
|
|
'resources' => json_encode($resources, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
|
|
'last_update' => (new DateTimeImmutable('now'))->format('Y-m-d H:i:s'),
|
|
]);
|
|
$planetId = (int)$stmt->fetchColumn();
|
|
|
|
$stmt = $pdo->prepare(
|
|
'INSERT INTO planet_buildings (planet_id, building_key, count, level)
|
|
VALUES (:planet_id, :building_key, :count, 0)
|
|
ON CONFLICT (planet_id, building_key) DO NOTHING'
|
|
);
|
|
$stmt->execute([
|
|
'planet_id' => $planetId,
|
|
'building_key' => 'build_center',
|
|
'count' => 1,
|
|
]);
|
|
}
|
|
|
|
$pdo->commit();
|
|
echo "Seed abgeschlossen.\n";
|
|
} catch (Throwable $e) {
|
|
$pdo->rollBack();
|
|
throw $e;
|
|
}
|