80 lines
2.5 KiB
JavaScript
80 lines
2.5 KiB
JavaScript
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 };
|