diff --git a/app.js b/app.js index 2a1b7e3..2f66497 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,7 @@ const ROUTES = { instances: "/admin/instance", backup: "/admin/backup-repo", servers: "/admin/server", + seats: "/server", keys: "/admin/key", crm: "/crm", }; @@ -918,6 +919,31 @@ async function serversLoadData() { } }) .filter(Boolean); + /* ─── Fetch seat data ─────────────────────────────────────── */ + let seatMap = {}; + try { + const seatRes = await fetch("https://n8n.derez.ai/webhook/server"); + if (seatRes.ok) { + const seatJson = await seatRes.json(); + const seatArr = Array.isArray(seatJson) + ? Array.isArray(seatJson[0]?.data) + ? seatJson[0].data + : seatJson + : []; + for (const s of seatArr) { + if (s.server) seatMap[s.server.toLowerCase().trim()] = s; + } + } + } catch (_) { + /* seat data is optional */ + } + + /* ─── Merge seats into server data ─────────────────────────── */ + for (const sv of serversData) { + const key = (sv.server?.name ?? "").toLowerCase().trim(); + sv.seats = seatMap[key] || null; + } + if (serversData.length === 0) throw new Error("No server data in response"); currentServerIdx = 0; serversRenderTabs(); @@ -1090,9 +1116,6 @@ function serversRenderDashboard(idx) {
Score
-

- ${escHtml(summary.short_summary)} -

@@ -1174,26 +1197,46 @@ function serversRenderDashboard(idx) {
Exposed Ports
${portsHtml}
Vuln score: ${security.vulnerability_score ?? "—"}
+ - ${ - security.risk_flags?.length - ? ` -
- ${security.risk_flags.map((f) => `${escHtml(f)}`).join("")} -
` - : "" - } - -
-
- - - - - Containers +
+
+ + + + Seats +
+ ${ + s.seats + ? ` +
+
+
${s.seats.Seats ?? "—"}
+
Total
+
+
+
${s.seats["Seats taken"] ?? "—"}
+
Taken
+
+
+
${s.seats["Seats Available"] ?? "—"}
+
Available
+
+
` + : `
No seat data available
` + }
+ +
+
+ + + + + Containers +
${containers.running}