🎉 first commit
This commit is contained in:
201
prisma/migrations/20250922030707_init/migration.sql
Normal file
201
prisma/migrations/20250922030707_init/migration.sql
Normal file
@@ -0,0 +1,201 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "ChatUsage" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"chatId" TEXT NOT NULL,
|
||||
"messageId" TEXT NOT NULL,
|
||||
"inputTokens" INTEGER NOT NULL DEFAULT 0,
|
||||
"outputTokens" INTEGER NOT NULL DEFAULT 0,
|
||||
"cachedTokens" INTEGER NOT NULL DEFAULT 0,
|
||||
"reasoningTokens" INTEGER NOT NULL DEFAULT 0,
|
||||
"totalTokens" INTEGER NOT NULL DEFAULT 0,
|
||||
"calledAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"status" TEXT NOT NULL,
|
||||
"modelName" TEXT,
|
||||
"prompt" TEXT,
|
||||
"metadata" JSONB,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "ChatUsage_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Chat" (
|
||||
"id" TEXT NOT NULL,
|
||||
"urlId" TEXT,
|
||||
"userId" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"version" INTEGER NOT NULL DEFAULT 1,
|
||||
"metadata" JSONB,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Chat_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Message" (
|
||||
"id" TEXT NOT NULL,
|
||||
"chatId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"role" TEXT NOT NULL,
|
||||
"content" TEXT NOT NULL,
|
||||
"revisionId" TEXT,
|
||||
"annotations" JSONB,
|
||||
"isDiscarded" BOOLEAN NOT NULL DEFAULT false,
|
||||
"metadata" JSONB,
|
||||
"parts" JSONB,
|
||||
"version" INTEGER NOT NULL DEFAULT 1,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Message_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Page" (
|
||||
"id" TEXT NOT NULL,
|
||||
"messageId" TEXT NOT NULL,
|
||||
"pages" JSONB NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Page_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Section" (
|
||||
"id" TEXT NOT NULL,
|
||||
"messageId" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL DEFAULT 'section',
|
||||
"action" TEXT NOT NULL DEFAULT 'add',
|
||||
"actionId" TEXT NOT NULL,
|
||||
"pageName" TEXT NOT NULL DEFAULT '',
|
||||
"content" TEXT NOT NULL,
|
||||
"domId" TEXT NOT NULL,
|
||||
"rootDomId" TEXT,
|
||||
"sort" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Section_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Deployment" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"chatId" TEXT NOT NULL,
|
||||
"platform" TEXT NOT NULL,
|
||||
"deploymentId" TEXT NOT NULL,
|
||||
"url" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL,
|
||||
"metadata" JSONB,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Deployment_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "UserSetting" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"category" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"value" TEXT NOT NULL,
|
||||
"isSecret" BOOLEAN NOT NULL DEFAULT false,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "UserSetting_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ChatUsage_userId_idx" ON "ChatUsage"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ChatUsage_messageId_idx" ON "ChatUsage"("messageId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ChatUsage_chatId_idx" ON "ChatUsage"("chatId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ChatUsage_calledAt_idx" ON "ChatUsage"("calledAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ChatUsage_status_idx" ON "ChatUsage"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Chat_urlId_key" ON "Chat"("urlId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Chat_userId_idx" ON "Chat"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Chat_urlId_idx" ON "Chat"("urlId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Message_chatId_idx" ON "Message"("chatId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Message_userId_idx" ON "Message"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Page_messageId_key" ON "Page"("messageId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Page_messageId_idx" ON "Page"("messageId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Section_messageId_idx" ON "Section"("messageId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Section_domId_idx" ON "Section"("domId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Section_rootDomId_idx" ON "Section"("rootDomId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Deployment_userId_idx" ON "Deployment"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Deployment_chatId_idx" ON "Deployment"("chatId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Deployment_platform_idx" ON "Deployment"("platform");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Deployment_status_idx" ON "Deployment"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Deployment_createdAt_idx" ON "Deployment"("createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "UserSetting_userId_idx" ON "UserSetting"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "UserSetting_category_idx" ON "UserSetting"("category");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "UserSetting_key_idx" ON "UserSetting"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "UserSetting_isSecret_idx" ON "UserSetting"("isSecret");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "UserSetting_userId_category_key_key" ON "UserSetting"("userId", "category", "key");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Message" ADD CONSTRAINT "Message_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Page" ADD CONSTRAINT "Page_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Section" ADD CONSTRAINT "Section_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Deployment" ADD CONSTRAINT "Deployment_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
3
prisma/migrations/migration_lock.toml
Normal file
3
prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (e.g., Git)
|
||||
provider = "postgresql"
|
||||
225
prisma/schema.prisma
Normal file
225
prisma/schema.prisma
Normal file
@@ -0,0 +1,225 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
// 聊天使用记录,每个 message 对应多条。
|
||||
model ChatUsage {
|
||||
id String @id @default(uuid())
|
||||
// 用户 ID
|
||||
userId String
|
||||
// 聊天的 id
|
||||
chatId String
|
||||
// 消息的 id
|
||||
messageId String
|
||||
// 输入令牌数
|
||||
inputTokens Int @default(0)
|
||||
// 输出令牌数
|
||||
outputTokens Int @default(0)
|
||||
// 缓存令牌数
|
||||
cachedTokens Int @default(0)
|
||||
// 推理令牌数
|
||||
reasoningTokens Int @default(0)
|
||||
// 总令牌数
|
||||
totalTokens Int @default(0)
|
||||
// 调用时间
|
||||
calledAt DateTime @default(now())
|
||||
// 调用状态
|
||||
status String
|
||||
// 使用的模型名称
|
||||
modelName String?
|
||||
// 提示文本
|
||||
prompt String?
|
||||
// 包含额外调用信息的元数据
|
||||
metadata Json? /// @type {Object}
|
||||
// 创建时间
|
||||
createdAt DateTime @default(now())
|
||||
// 更新时间
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([userId])
|
||||
@@index([messageId])
|
||||
@@index([chatId])
|
||||
@@index([calledAt])
|
||||
@@index([status])
|
||||
}
|
||||
|
||||
// 聊天,一个聊天会包含多个消息。
|
||||
model Chat {
|
||||
id String @id @default(uuid())
|
||||
// URL 标识符
|
||||
urlId String? @unique
|
||||
// 用户 ID
|
||||
userId String
|
||||
// 聊天描述
|
||||
description String?
|
||||
// 时间戳
|
||||
timestamp DateTime @default(now())
|
||||
// 版本,每次更新时,版本号加 1
|
||||
version Int @default(1)
|
||||
// 包含额外信息的元数据
|
||||
metadata Json? /// @type {{gitUrl?: string, gitBranch?: string, netlifySiteId?: string}}
|
||||
// 创建时间
|
||||
createdAt DateTime @default(now())
|
||||
// 更新时间
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
// 关联的消息
|
||||
messages Message[] @relation("ChatToMessages")
|
||||
// 关联的部署记录
|
||||
deployments Deployment[]
|
||||
|
||||
@@index([userId])
|
||||
@@index([urlId])
|
||||
}
|
||||
|
||||
// 聊天消息,消息是需要有序的。 @ai-sdk/ui-utils 的 Message 类型。
|
||||
model Message {
|
||||
id String @id @default(uuid())
|
||||
// 消息所属聊天
|
||||
chatId String
|
||||
// 消息所属用户
|
||||
userId String
|
||||
// 'user' 或 'assistant'
|
||||
role String
|
||||
// 消息内容
|
||||
content String @db.Text
|
||||
// 版本 ID
|
||||
revisionId String?
|
||||
// 注释
|
||||
annotations Json? /// @type {Array<{id: string, text: string, start: number, end: number}>}
|
||||
|
||||
// 是否为遗弃消息
|
||||
isDiscarded Boolean @default(false)
|
||||
|
||||
// 消息的元数据
|
||||
metadata Json? /// @type {Record<string, any>}
|
||||
|
||||
// 消息的部分内容,用于存储 UIMessage 的 parts
|
||||
parts Json? /// @type {Array<{type: string, text?: string, [key: string]: any}>}
|
||||
|
||||
version Int @default(1)
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
chat Chat @relation("ChatToMessages", fields: [chatId], references: [id], onDelete: Cascade)
|
||||
// 关联的页面
|
||||
page Page? @relation("MessageToPage")
|
||||
// 关联的部分
|
||||
sections Section[] @relation("MessageToSections")
|
||||
|
||||
@@index([chatId])
|
||||
@@index([userId])
|
||||
}
|
||||
|
||||
model Page {
|
||||
id String @id @default(uuid())
|
||||
// 关联的消息 ID
|
||||
messageId String @unique
|
||||
// 页面数据 (JSON 数组格式)
|
||||
pages Json /// @type {Array<Object>} 自定义编辑器的页面数据结构数组,每个元素代表一个页面
|
||||
// 创建时间
|
||||
createdAt DateTime @default(now())
|
||||
// 更新时间
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
// 关联的消息
|
||||
message Message @relation("MessageToPage", fields: [messageId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([messageId])
|
||||
}
|
||||
|
||||
model Section {
|
||||
id String @id @default(uuid())
|
||||
// 所属消息 ID
|
||||
messageId String
|
||||
// 部分类型,通常为 "section"
|
||||
type String @default("section")
|
||||
// 操作类型:add, update, remove 等
|
||||
action String @default("add")
|
||||
// 操作的 ID
|
||||
actionId String
|
||||
// 页面名称
|
||||
pageName String @default("")
|
||||
// Section 内容 (HTML/CSS)
|
||||
content String @db.Text
|
||||
// DOM ID
|
||||
domId String
|
||||
// 根 DOM ID,用于标识父级容器
|
||||
rootDomId String?
|
||||
// 排序顺序
|
||||
sort Int @default(0)
|
||||
// 创建时间
|
||||
createdAt DateTime @default(now())
|
||||
// 更新时间
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
// 关联的消息
|
||||
message Message @relation("MessageToSections", fields: [messageId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([messageId])
|
||||
@@index([domId])
|
||||
@@index([rootDomId])
|
||||
}
|
||||
|
||||
// 部署记录表,记录用户将代码部署到各平台的信息
|
||||
model Deployment {
|
||||
id String @id @default(uuid())
|
||||
// 用户 ID
|
||||
userId String
|
||||
// 聊天 ID
|
||||
chatId String
|
||||
// 部署平台(1Panel、Netlify、Vercel 等)
|
||||
platform String
|
||||
// 平台上的部署 ID
|
||||
deploymentId String
|
||||
// 部署后的访问链接
|
||||
url String
|
||||
// 部署状态
|
||||
status String
|
||||
// 包含平台特定信息的元数据
|
||||
metadata Json? /// @type {Object}
|
||||
// 创建时间
|
||||
createdAt DateTime @default(now())
|
||||
// 更新时间
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
// 关联的聊天
|
||||
chat Chat? @relation(fields: [chatId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([userId])
|
||||
@@index([chatId])
|
||||
@@index([platform])
|
||||
@@index([status])
|
||||
@@index([createdAt])
|
||||
}
|
||||
|
||||
// 用户设置表,用于保存用户的各种设置
|
||||
model UserSetting {
|
||||
id String @id @default(uuid())
|
||||
// 用户 ID
|
||||
userId String
|
||||
// 设置类别(profile、connectivity、services 等)
|
||||
category String
|
||||
// 设置键名
|
||||
key String
|
||||
// 设置值
|
||||
value String @db.Text
|
||||
// 是否为敏感信息(如 API 密钥)
|
||||
isSecret Boolean @default(false)
|
||||
// 创建时间
|
||||
createdAt DateTime @default(now())
|
||||
// 更新时间
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([userId, category, key])
|
||||
@@index([userId])
|
||||
@@index([category])
|
||||
@@index([key])
|
||||
@@index([isSecret])
|
||||
}
|
||||
Reference in New Issue
Block a user