79 lines
2.7 KiB
JavaScript
79 lines
2.7 KiB
JavaScript
import pool from '../db.js';
|
|
import { getSectorSettings } from './config.service.js';
|
|
import { findNextAvailableStarterCoordinates } from './planet.service.js';
|
|
import { generateStarterPlanetStats } from '../utils/planet.util.js';
|
|
|
|
/**
|
|
* Erstellt einen neuen Sektor-Account samt Heimatplanet in einer sicheren Datenbank-Transaktion.
|
|
*
|
|
* @param {string} lobby_uuid - Die UUID des Nutzers aus der Lobby.
|
|
* @param {string} username - Der Anzeigename.
|
|
* @param {string} gender - Das Geschlecht des Commanders.
|
|
*
|
|
* @returns {Promise<{local_uuid: string, triggerSectorClose: boolean}>}
|
|
*/
|
|
export const createLocalAccount = async (lobby_uuid, username, gender) => {
|
|
const client = await pool.connect();
|
|
|
|
try {
|
|
await client.query('BEGIN');
|
|
|
|
const { galaxy, system, position, triggerSectorClose } = await findNextAvailableStarterCoordinates();
|
|
const planetStats = generateStarterPlanetStats(position);
|
|
|
|
const settings = getSectorSettings();
|
|
const initialPremium = settings.account_registration_bonus.initial_res_premium;
|
|
|
|
const accountInsertQuery = `
|
|
INSERT INTO local_accounts (lobby_uuid, username, gender, res_premium)
|
|
VALUES ($1, $2, $3, $4)
|
|
RETURNING local_uuid
|
|
`;
|
|
const accountResult = await client.query(accountInsertQuery, [
|
|
lobby_uuid,
|
|
username,
|
|
gender,
|
|
initialPremium
|
|
]);
|
|
|
|
const local_uuid = accountResult.rows[0].local_uuid;
|
|
|
|
const planetName = "Unbekannter Planet";
|
|
const planetInsertQuery = `
|
|
INSERT INTO planets (
|
|
local_uuid, planet_name, galaxy, system, position,
|
|
temp_min, temp_max, diameter, fields_built, fields_explored, fields_max,
|
|
pop_idle, pop_injured, res_food_base
|
|
) VALUES (
|
|
$1, $2, $3, $4, $5,
|
|
$6, $7, $8, 0, 10, $9,
|
|
$10, $11, $12
|
|
)
|
|
`;
|
|
await client.query(planetInsertQuery, [
|
|
local_uuid,
|
|
planetName,
|
|
galaxy,
|
|
system,
|
|
position,
|
|
planetStats.temp_min,
|
|
planetStats.temp_max,
|
|
planetStats.diameter,
|
|
planetStats.fields_max,
|
|
planetStats.pop_idle,
|
|
planetStats.pop_injured,
|
|
planetStats.res_food_base
|
|
]);
|
|
|
|
await client.query('COMMIT');
|
|
|
|
return { local_uuid, triggerSectorClose };
|
|
|
|
} catch (error) {
|
|
await client.query('ROLLBACK');
|
|
console.error('[AccountService] Fehler bei der Account-Erstellung. Transaktion abgebrochen:', error);
|
|
throw error;
|
|
} finally {
|
|
client.release();
|
|
}
|
|
}; |