import express from "express"; import { canAccessServer, serializeServerForGroup } from "../services/permissions.js"; import { appendLaunchLog, readServerImages, readServers } from "../services/storage.js"; import { mergeServersWithStatus } from "../services/status.js"; import { getStartProfile, launchServer } from "../services/serverLauncher.js"; const router = express.Router(); let launchInProgress = false; router.get("/servers", (req, res) => { const allServers = serversWithImages(); const anyServerActive = allServers.some((server) => server.active); const servers = allServers.filter((server) => canAccessServer(req.group, server.id)); return res.json({ servers: servers.map((server) => serializeServerForGroup(server, req.group, { anyServerActive }) ), }); }); router.post("/servers/:serverId/start", async (req, res) => { const servers = mergeServersWithStatus(readServers()); const server = servers.find((entry) => entry.id === req.params.serverId); if (!server || !canAccessServer(req.group, server.id)) { return res.status(404).json({ error: "Serveur introuvable" }); } if (server.active) { return res.status(409).json({ error: "Le serveur est deja en ligne" }); } if (servers.some((entry) => entry.active)) { return res.status(409).json({ error: "Un serveur est deja en cours" }); } if (launchInProgress) { return res.status(409).json({ error: "Un lancement est deja en cours" }); } if (!getStartProfile(server)) { return res.status(400).json({ error: "Aucun profil de lancement configure" }); } launchInProgress = true; try { const { stdout, stderr } = await launchServer(server); appendLaunchLog({ createdAt: new Date().toISOString(), groupId: req.group.id, groupName: req.group.name, serverId: server.id, serverName: server.game, }); return res.json({ status: "started", server: serializeServerForGroup(server, req.group, { anyServerActive: true }), stdout: stdout?.trim() || "", stderr: stderr?.trim() || "", }); } catch (error) { console.error(`[servers] Failed to start ${server.id}:`, error); return res.status(500).json({ error: "Impossible de lancer le serveur" }); } finally { launchInProgress = false; } }); function serversWithImages() { const images = readServerImages(); return mergeServersWithStatus(readServers()).map((server) => ({ ...server, heroImage: images[server.id]?.url || null, })); } export { router as serversRouter };