Files
hongjr03 b4dd8f09e1 feat(hub): Prisma schema + DB singleton,对齐 spec/System 契约
按 ADR-0001..0004/0017 重塑 schema,非照搬旧服务:
- ADR-0001: ProjectGroupBinding project↔chat 1:1(chatId @unique 钉单射不变式)
- ADR-0002: ProjectAgentLock projectId @id(at-most-one)+runId @unique;holder=run 非 session
- ADR-0004: PermissionGrant(resource×principal×role)+PermissionSettings(六旋钮)新落;
  PermissionRole=read/edit/manage 与 PlatformRole=admin/teacher 分离(旧 schema 混淆了)
- ADR-0017: AgentSession 无 claudeSessionId,改 provider+model(切 model 即新 session)
- RunState 对齐 spec:加 WAITING_FOR_USER/TIMED_OUT(枚举完整性 OPEN)
- Audit:runId 是 PINNED 关系,其余 OPEN
旧 schema 的 FeishuProjectBinding(user/chat 混表)拆为单一 ProjectGroupBinding。
prisma validate 通过;generate 通过;tsc --noEmit rc=0;
类型级 schema 约束检查全部通过(ADR-0002 主键/唯一、ADR-0017 无 claudeSessionId 等)。
2026-07-06 22:48:28 +08:00

22 lines
744 B
TypeScript

/**
* Prisma client singleton.
*
* Prisma's client is a connection-pooled datasource; constructing it per-query
* exhausts connections. This module exports one shared instance per process.
* Hot-reload (tsx watch) can re-import this module — the global guard prevents
* a second PrismaClient from being created.
*/
import { PrismaClient } from "@prisma/client";
const globalForPrisma = globalThis as unknown as { __hubPrisma?: PrismaClient };
export const prisma: PrismaClient =
globalForPrisma.__hubPrisma ??
new PrismaClient({
log: process.env["HUB_PRISMA_LOG"] !== undefined ? ["query", "error", "warn"] : ["error", "warn"],
});
if (process.env["NODE_ENV"] !== "production") {
globalForPrisma.__hubPrisma = prisma;
}