Files
curriculum-project-hub/hub/src/database

src/database/

/database/* HTTP 面。代码写在这个目录里,hub.ts 通过 plugin.ts 挂载它, 所以服务器启动时能正确识别这些路由。

页面:

  • /database/admin —— 飞书登录页(唯一登录方式)
  • /database/dashboard —— 左菜单 + 右内容的后台,未登录会跳回 /database/admin

登录走平台既有的飞书 OAuth:登录页的按钮指向 /auth/feishu/<orgSlug> 回调由 src/admin/routes/authRoutes.ts 处理并种下 session cookie。

开发模式:用环境变量开启一键登录

本地开发没有真实飞书 app 时,可以用环境变量开启一键登录,跳过飞书 OAuth, 直接以现有 OWNER/ADMIN 身份登入后台。仅限开发,不是生产登录路径。

怎么开

hub/.env 里设:

HUB_DEV_LOGIN_BYPASS="true"

改完重启服务(npm run dev,或本地手动 npx tsx src/server.ts)。启动日志会 打印一行 DEV login bypass enabled: /database/dev-login ... 作为确认。

开启后:

  • /database/admin 登录页显示「 一键登录管理员」按钮
  • 后端注册 /database/dev-login 端点:按钮就是打它,它签发一个和飞书 OAuth 回调完全一样的 session,然后跳到 /database/dashboard

怎么关

把值设成 false(或 0 / no / off),或删掉这一行。关闭后按钮消失、 /database/dev-login 返回 404 —— 按钮和端点同进同退。

双重门禁(重要)

真正的开关是两个条件的(判断在 plugin.ts):

allowDevLoginBypass = (NODE_ENV !== "production") && HUB_DEV_LOGIN_BYPASS 为真

即:只要 NODE_ENV=production,无论 HUB_DEV_LOGIN_BYPASS 设成什么,一键登录 都强制关闭。 生产始终只能走真实飞书 OAuth。

提醒:HUB_DEV_LOGIN_BYPASS 是敏感开关,别把开着它的 .env 带到任何联网 / 共享环境。整个旁路逻辑自包含在本目录(plugin.ts + routes/databaseRoutes.ts), src/admin 的登录路由未受影响。

文件

文件 职责
plugin.ts 模块对外入口,hub.tsregisterDatabasePlugin()
routes/databaseRoutes.ts 路由 + 页面渲染,你主要在这里加内容

新增一类端点时:要么直接往 databaseRoutes.tsapp.get("/database/...") 要么新建 routes/xxxRoutes.ts 并在 databaseRoutes.tsregisterXxxRoutes(app, {...}) 注册一次。

约定(与 admin 面一致)

  1. 路由用绝对路径 "/database/...",不用 Fastify prefix —— 每条路由 grep 得到。
  2. guard 前置、fail closed:凡碰数据的端点第一行先跑 requireSession / requireOrgRole / requireProjectPermission (都在 ../admin/auth/guards.js)。
  3. 租户隔离ADR-0020):每个 Prisma 查询都 scope 到 auth.organization.id, 不得跨 org。禁止无鉴权的数据路由。
  4. 数据库通过传入的 config.prisma 访问(全进程单例,见 ../db.ts); 不要在这里 new PrismaClient()

为什么代码在 src/

tsconfig.json 固定 rootDir: "src"include: ["src/**/*.ts"]。只有 src/ 下的 .ts 会被 tsc 编译、被 tsx watchnpm run dev)加载。放在 src/ 之外的目录不会被构建,外部识别不到。