/** * /database/library —— 文件库浏览页(管理员后台的文件工具)。 * * 服务端渲染外壳 + 浏览器端 JS 调 /database/api/*(同源 session cookie)。 * 设计令牌与全局 UI 主题(uiTheme.ts)一致。能力面全部由 API 的 404/403 表达(D8)。 */ import type { FastifyInstance } from "fastify"; import type { PrismaClient } from "@prisma/client"; import { SESSION_COOKIE_NAME, verifySession } from "../../admin/auth/session.js"; export interface LibraryPageConfig { readonly prisma: PrismaClient; readonly sessionSecret: string; } export async function registerLibraryPage( app: FastifyInstance, config: LibraryPageConfig, ): Promise { app.get("/database/library", async (request, reply) => { const raw = request.cookies[SESSION_COOKIE_NAME]; const session = raw === undefined || raw === "" ? null : verifySession(raw, config.sessionSecret); if (session === null) return reply.redirect("/database/admin"); const user = await config.prisma.user.findUnique({ where: { id: session.userId }, select: { displayName: true }, }); if (user === null) return reply.redirect("/database/admin"); return reply.type("text/html").send(renderLibraryPage(user.displayName)); }); } function renderLibraryPage(displayName: string): string { const initial = displayName.slice(0, 1).replace(/[&<>"']/, "U"); return ` 文件库
从左侧选择一个文件夹或项目
`; }