Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.ts 调 registerDatabasePlugin() |
routes/databaseRoutes.ts |
路由 + 页面渲染,你主要在这里加内容 |
新增一类端点时:要么直接往 databaseRoutes.ts 加 app.get("/database/..."),
要么新建 routes/xxxRoutes.ts 并在 databaseRoutes.ts 里 registerXxxRoutes(app, {...})
注册一次。
约定(与 admin 面一致)
- 路由用绝对路径
"/database/...",不用 Fastify prefix —— 每条路由 grep 得到。 - guard 前置、fail closed:凡碰数据的端点第一行先跑
requireSession/requireOrgRole/requireProjectPermission(都在../admin/auth/guards.js)。 - 租户隔离(ADR-0020):每个 Prisma 查询都 scope 到
auth.organization.id, 不得跨 org。禁止无鉴权的数据路由。 - 数据库通过传入的
config.prisma访问(全进程单例,见../db.ts); 不要在这里new PrismaClient()。
为什么代码在 src/ 下
tsconfig.json 固定 rootDir: "src" 且 include: ["src/**/*.ts"]。只有
src/ 下的 .ts 会被 tsc 编译、被 tsx watch(npm run dev)加载。放在
src/ 之外的目录不会被构建,外部识别不到。