Add SVN management console

This commit is contained in:
lwt
2026-06-18 10:11:25 +08:00
parent 539729ae00
commit 771635b372
10 changed files with 1336 additions and 3 deletions
+12
View File
@@ -7,16 +7,20 @@ import { fileURLToPath } from "node:url";
import express from "express";
import multer from "multer";
import { ensureSvnStorage, registerSvnRoutes } from "./svn-service.js";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const projectRoot = path.resolve(__dirname, "..");
const storageRoot = process.env.SUMI_STORAGE_DIR ? path.resolve(process.env.SUMI_STORAGE_DIR) : "";
const dataDir = path.resolve(process.env.SUMI_DATA_DIR || (storageRoot ? path.join(storageRoot, "data") : path.join(__dirname, "data")));
const uploadDir = path.resolve(process.env.SUMI_UPLOAD_DIR || (storageRoot ? path.join(storageRoot, "uploads") : path.join(__dirname, "uploads")));
const svnRoot = path.resolve(process.env.SUMI_SVN_DIR || (storageRoot ? path.join(storageRoot, "svn") : path.join(__dirname, "svn")));
const packageDir = path.join(uploadDir, "packages");
const iconDir = path.join(uploadDir, "icons");
const manifestDir = path.join(uploadDir, "manifests");
const dataFile = path.join(dataDir, "software.json");
const playerFile = path.join(dataDir, "players.json");
const svnDataFile = path.join(dataDir, "svn.json");
const port = Number(process.env.PORT || 3030);
const adminToken = process.env.ADMIN_TOKEN || "sumi-admin";
const playerSessionCookie = "sumi_player_session";
@@ -70,6 +74,7 @@ async function ensureStorage() {
fsp.mkdir(packageDir, { recursive: true }),
fsp.mkdir(iconDir, { recursive: true }),
fsp.mkdir(manifestDir, { recursive: true }),
fsp.mkdir(svnRoot, { recursive: true }),
]);
try {
await fsp.access(dataFile);
@@ -90,6 +95,8 @@ async function ensureStorage() {
if (process.env.PLAYER_USERNAME && process.env.PLAYER_PASSWORD) {
await upsertEnvPlayer();
}
await ensureSvnStorage({ svnRoot, svnDataFile });
}
async function readStore() {
@@ -1143,15 +1150,19 @@ app.delete("/api/admin/software/:id", requirePlayer, requireAdmin, async (req, r
}
});
registerSvnRoutes(app, { svnRoot, svnDataFile, requirePlayer, requireAdmin });
app.get("/software", (req, res) => res.redirect(301, "/software.html"));
app.get("/software/", (req, res) => res.sendFile(path.join(projectRoot, "software.html")));
app.get("/login", (req, res) => res.redirect(301, "/login.html"));
app.get("/admin/software", requirePlayer, (req, res) => res.sendFile(path.join(projectRoot, "admin", "software.html")));
app.get("/admin/svn", requirePlayer, (req, res) => res.sendFile(path.join(projectRoot, "admin", "svn.html")));
app.get("/", (req, res) => res.sendFile(path.join(projectRoot, "index.html")));
app.get("/index.html", (req, res) => res.sendFile(path.join(projectRoot, "index.html")));
app.get("/software.html", (req, res) => res.sendFile(path.join(projectRoot, "software.html")));
app.get("/login.html", (req, res) => res.sendFile(path.join(projectRoot, "login.html")));
app.get("/admin/software.html", requirePlayer, (req, res) => res.sendFile(path.join(projectRoot, "admin", "software.html")));
app.get("/admin/svn.html", requirePlayer, (req, res) => res.sendFile(path.join(projectRoot, "admin", "svn.html")));
app.use("/assets", express.static(path.join(projectRoot, "assets"), { fallthrough: false }));
app.use(async (error, req, res, next) => {
@@ -1166,6 +1177,7 @@ app.listen(port, () => {
console.log(`sumi.work software center running at http://localhost:${port}`);
console.log(`data directory: ${dataDir}`);
console.log(`upload directory: ${uploadDir}`);
console.log(`svn directory: ${svnRoot}`);
if (!process.env.ADMIN_TOKEN) {
console.log("ADMIN_TOKEN is not set. Using development token: sumi-admin");
}