feat: allow only one server to be launched
This commit is contained in:
parent
e8805e0f2e
commit
655cf655da
5 changed files with 124 additions and 24 deletions
|
|
@ -5,10 +5,17 @@ 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 servers = visibleServers(req.group);
|
||||
return res.json({ servers: servers.map((server) => serializeServerForGroup(server, req.group)) });
|
||||
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) => {
|
||||
|
|
@ -23,10 +30,20 @@ router.post("/servers/:serverId/start", async (req, res) => {
|
|||
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);
|
||||
|
||||
|
|
@ -40,24 +57,24 @@ router.post("/servers/:serverId/start", async (req, res) => {
|
|||
|
||||
return res.json({
|
||||
status: "started",
|
||||
server: serializeServerForGroup(server, req.group),
|
||||
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 visibleServers(group) {
|
||||
function serversWithImages() {
|
||||
const images = readServerImages();
|
||||
return mergeServersWithStatus(readServers())
|
||||
.map((server) => ({
|
||||
...server,
|
||||
heroImage: images[server.id]?.url || null,
|
||||
}))
|
||||
.filter((server) => canAccessServer(group, server.id));
|
||||
return mergeServersWithStatus(readServers()).map((server) => ({
|
||||
...server,
|
||||
heroImage: images[server.id]?.url || null,
|
||||
}));
|
||||
}
|
||||
|
||||
export { router as serversRouter };
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue