feat: add Prisma schema with User, Project, Module, Endpoint models

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-02 11:36:10 +08:00
parent f644dc2dfd
commit 2a15cbaead
3 changed files with 119 additions and 4 deletions

View File

@@ -8,9 +8,9 @@
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"dev": "tsc --watch", "dev": "tsc --watch",
"db:generate": "prisma generate", "db:generate": "prisma generate --schema ../../prisma/schema.prisma",
"db:migrate": "prisma migrate dev", "db:migrate": "prisma migrate dev --schema ../../prisma/schema.prisma",
"db:push": "prisma db push" "db:push": "prisma db push --schema ../../prisma/schema.prisma"
}, },
"dependencies": { "dependencies": {
"@prisma/client": "^6.0.0" "@prisma/client": "^6.0.0"

View File

@@ -1,4 +1,7 @@
// Shared types — will be populated as we build features import type { User, Project, Module, Endpoint, ModuleSource } from '@prisma/client';
export type { User, Project, Module, Endpoint, ModuleSource };
export type ApiResponse<T = unknown> = { export type ApiResponse<T = unknown> = {
success: boolean; success: boolean;
data?: T; data?: T;
@@ -7,3 +10,23 @@ export type ApiResponse<T = unknown> = {
message: string; message: string;
}; };
}; };
export type ProjectWithStats = Project & {
_count: { endpoints: number; modules: number };
};
export type ModuleWithCount = Module & {
_count: { endpoints: number };
};
export type EndpointSummary = {
id: string;
method: string;
path: string;
summary: string | null;
deprecated: boolean;
};
export type EndpointDetail = Endpoint & {
moduleName: string;
};

92
prisma/schema.prisma Normal file
View File

@@ -0,0 +1,92 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(uuid())
email String @unique
passwordHash String?
name String
avatarUrl 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 Project {
id String @id @default(uuid())
userId String
name String
description String?
baseUrl String?
openApiSpec Json
openApiVersion String
apiKeyHash String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
modules Module[]
endpoints Endpoint[]
}
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])
}