MVP version

This commit is contained in:
Shinuwa 2026-06-12 14:34:44 +02:00
commit 3f96943858
25 changed files with 3962 additions and 0 deletions

63
src/routes/servers.js Normal file
View file

@ -0,0 +1,63 @@
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();
router.get("/servers", (req, res) => {
const servers = visibleServers(req.group);
return res.json({ servers: servers.map((server) => serializeServerForGroup(server, req.group)) });
});
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 (!getStartProfile(server)) {
return res.status(400).json({ error: "Aucun profil de lancement configure" });
}
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),
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" });
}
});
function visibleServers(group) {
const images = readServerImages();
return mergeServersWithStatus(readServers())
.map((server) => ({
...server,
heroImage: images[server.id]?.url || null,
}))
.filter((server) => canAccessServer(group, server.id));
}
export { router as serversRouter };