forked from EduCraft/curriculum-project-hub
refactor(database)!: 后端不再渲染任何 HTML,只出 JSON
删掉约 1770 行服务端模板拼接:renderDashboard / renderLoginPage
(databaseRoutes)、adminPanels、libraryBrowser、uiTheme,以及
libraryPage —— 后者迁移前已是无人引用的死代码。
新增两个端点承接原先在 page handler 里 inline 算的东西:
GET /database/config 免鉴权 bootstrap(org slug + dev 开关);
注册位置刻意早于 silo org 的提前返回,
org 未就绪时登录页仍要能渲染。
GET /database/api/stats 概览统计,要求 silo org OWNER/ADMIN ——
它聚合的是 org 级计数与审计流,不是
单节点权限视图。
静态托管收敛到 static.ts:一份 filelib-web 构建产物挂 /app 与
/database 两个前缀,资源路由只注册一次。并发症是路由顺序成了硬约束
—— 具体页面路由必须先于 SPA 通配注册,否则重演 /database/dashboard
盖住 SPA 的老 bug(ADR-0029)。
/database/library 改为 302 到 /database/dashboard/library。
BREAKING: 部署需先构建 filelib-web,否则 static.ts 的 existsSync
守卫会让 /app 与 /database 全部 404。
This commit is contained in:
@@ -1,15 +1,12 @@
|
||||
/**
|
||||
* 老师端用户前端托管(标准前后端分离):
|
||||
* GET /app/* — filelib-web(Svelte SPA)构建产物静态托管 + SPA 回退
|
||||
* GET /database/api/login-info — 登录页配置(org slug / dev 开关)
|
||||
* GET /app/dev-login{,-teacher} — DEV ONLY 一键登录(管理员 / 普通老师)
|
||||
* 老师端后端支撑(标准前后端分离):
|
||||
* GET /database/api/login-info — 登录页配置(org slug / dev 开关)
|
||||
* GET /app/dev-login-teacher — DEV ONLY 一键登录(普通老师)
|
||||
*
|
||||
* 服务端不再渲染老师端页面;页面由独立前端工程 hub/filelib-web 产出。
|
||||
* 服务端不渲染任何页面。`/app/*` 的静态托管与 SPA 回退在 ../static.ts —— 那里
|
||||
* 与管理后台 `/database/*` 共用同一份 filelib-web 构建产物,资源路由只注册一次。
|
||||
*/
|
||||
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import fastifyStatic from "@fastify/static";
|
||||
import type { FastifyInstance } from "fastify";
|
||||
import type { PrismaClient } from "@prisma/client";
|
||||
import { SESSION_COOKIE_NAME, signSession } from "../../admin/auth/session.js";
|
||||
@@ -33,26 +30,6 @@ export async function registerTeacherApp(
|
||||
devLoginEnabled: config.allowDevLoginBypass,
|
||||
}));
|
||||
|
||||
// 标准分离:静态托管 SPA 构建产物;非文件路径回退 index.html 交给前端。
|
||||
const distDir = path.resolve(import.meta.dirname, "../../../filelib-web/dist");
|
||||
if (fs.existsSync(path.join(distDir, "index.html"))) {
|
||||
await app.register(fastifyStatic, { root: distDir, prefix: "/app/", decorateReply: true });
|
||||
app.setNotFoundHandler((request, reply) => {
|
||||
if (request.url.startsWith("/app")) {
|
||||
return reply.sendFile("index.html", distDir);
|
||||
}
|
||||
return reply.status(404).send({ error: { code: "not_found", message: "not found" } });
|
||||
});
|
||||
} else {
|
||||
app.log.warn({ distDir }, "filelib-web dist not found; build it with `npm run build --prefix filelib-web`");
|
||||
app.get("/app", async (_request, reply) =>
|
||||
reply
|
||||
.status(503)
|
||||
.type("text/plain")
|
||||
.send("filelib-web 未构建。请先运行 npm run build --prefix hub/filelib-web"),
|
||||
);
|
||||
}
|
||||
|
||||
if (!config.allowDevLoginBypass) return;
|
||||
registerDevLogins(app, config);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user