generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum Role { USER ADMIN } model User { id String @id @default(uuid()) email String @unique passwordHash String? name String avatarUrl String? role Role @default(USER) disabled Boolean @default(false) apiKeyHash String? apiKeyEncrypted String? apiKeyPrefix String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt oauthAccounts OAuthAccount[] projects Project[] } model OAuthAccount { id String @id @default(uuid()) userId String provider String providerAccountId String createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) } model McpCallLog { id String @id @default(uuid()) projectId String toolName String calledAt DateTime @default(now()) durationMs Int success Boolean requestParams Json @default("{}") responseSize Int @default(0) clientIp String @default("") estimatedTokens Int? project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) @@index([projectId]) @@index([calledAt]) @@index([toolName]) } model Project { id String @id @default(uuid()) userId String name String description String? baseUrl String? openApiSpec Json openApiVersion String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) modules Module[] endpoints Endpoint[] mcpCallLogs McpCallLog[] } enum ModuleSource { tag path_prefix manual } model Module { id String @id @default(uuid()) projectId String name String description String? sortOrder Int @default(0) source ModuleSource createdAt DateTime @default(now()) updatedAt DateTime @updatedAt project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) endpoints Endpoint[] @@index([projectId]) } model Endpoint { id String @id @default(uuid()) projectId String moduleId String method String path String summary String? description String? operationId String? parameters Json @default("[]") requestBody Json? responses Json @default("{}") tags String[] @default([]) deprecated Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) module Module @relation(fields: [moduleId], references: [id], onDelete: Cascade) @@index([projectId]) @@index([moduleId]) @@index([projectId, moduleId]) }