346 lines
11 KiB
SQL
346 lines
11 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "KeyStatus" AS ENUM ('UNTESTED', 'VALID', 'INVALID', 'TESTING');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "DocStatus" AS ENUM ('PENDING', 'PROCESSING', 'OCR_COMPLETED', 'TRANSLATION_COMPLETED', 'COMPLETED', 'FAILED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "user_settings" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"ocrProvider" TEXT,
|
|
"ocrApiKey" TEXT,
|
|
"translationModel" TEXT,
|
|
"targetLanguage" TEXT NOT NULL DEFAULT 'chinese',
|
|
"customTargetLanguageName" TEXT,
|
|
"maxTokensPerChunk" INTEGER NOT NULL DEFAULT 2000,
|
|
"translationConcurrency" INTEGER NOT NULL DEFAULT 15,
|
|
"defaultSystemPrompt" TEXT,
|
|
"defaultUserPromptTemplate" TEXT,
|
|
"useCustomPrompts" BOOLEAN NOT NULL DEFAULT false,
|
|
"enableGlossary" BOOLEAN NOT NULL DEFAULT false,
|
|
"batchModeEnabled" BOOLEAN NOT NULL DEFAULT false,
|
|
"batchModeTemplate" TEXT,
|
|
"batchModeFormats" TEXT[],
|
|
"batchModeZipEnabled" BOOLEAN NOT NULL DEFAULT false,
|
|
"ocrConfig" JSONB,
|
|
"academicSearchConfig" JSONB,
|
|
"uiLayoutConfig" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "user_settings_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "api_keys" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"provider" TEXT NOT NULL,
|
|
"keyValue" TEXT NOT NULL,
|
|
"remark" TEXT,
|
|
"status" "KeyStatus" NOT NULL DEFAULT 'UNTESTED',
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"lastUsedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "api_keys_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "custom_source_sites" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT,
|
|
"displayName" TEXT NOT NULL,
|
|
"apiBaseUrl" TEXT NOT NULL,
|
|
"modelId" TEXT,
|
|
"availableModels" TEXT[],
|
|
"requestFormat" TEXT NOT NULL DEFAULT 'openai',
|
|
"temperature" DOUBLE PRECISION NOT NULL DEFAULT 0.5,
|
|
"maxTokens" INTEGER NOT NULL DEFAULT 8000,
|
|
"endpointMode" TEXT NOT NULL DEFAULT 'auto',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "custom_source_sites_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "documents" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"fileName" TEXT NOT NULL,
|
|
"fileSize" INTEGER,
|
|
"fileType" TEXT NOT NULL,
|
|
"filePath" TEXT,
|
|
"status" "DocStatus" NOT NULL DEFAULT 'PENDING',
|
|
"ocrProvider" TEXT,
|
|
"ocrText" TEXT,
|
|
"ocrMetadata" JSONB,
|
|
"translationModel" TEXT,
|
|
"translatedText" TEXT,
|
|
"translationMetadata" JSONB,
|
|
"summary" TEXT,
|
|
"toc" JSONB,
|
|
"metadata" JSONB,
|
|
"processingTime" INTEGER,
|
|
"errorMessage" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "documents_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "annotations" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"documentId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"color" TEXT,
|
|
"startIndex" INTEGER NOT NULL,
|
|
"endIndex" INTEGER NOT NULL,
|
|
"text" TEXT NOT NULL,
|
|
"note" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "annotations_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "semantic_groups" (
|
|
"id" TEXT NOT NULL,
|
|
"documentId" TEXT NOT NULL,
|
|
"groups" JSONB NOT NULL,
|
|
"version" TEXT,
|
|
"source" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "semantic_groups_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "glossaries" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"enabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"entries" JSONB NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "glossaries_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "system_config" (
|
|
"id" TEXT NOT NULL,
|
|
"key" TEXT NOT NULL,
|
|
"value" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "system_config_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "processed_files" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"fileIdentifier" TEXT NOT NULL,
|
|
"fileName" TEXT NOT NULL,
|
|
"processedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "processed_files_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "user_quotas" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"maxDocumentsPerDay" INTEGER NOT NULL DEFAULT -1,
|
|
"maxDocumentsPerMonth" INTEGER NOT NULL DEFAULT -1,
|
|
"maxStorageSize" INTEGER NOT NULL DEFAULT -1,
|
|
"maxApiKeysCount" INTEGER NOT NULL DEFAULT -1,
|
|
"documentsThisMonth" INTEGER NOT NULL DEFAULT 0,
|
|
"currentStorageUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"lastMonthlyReset" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "user_quotas_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "usage_logs" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"action" TEXT NOT NULL,
|
|
"resourceId" TEXT,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "usage_logs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "chat_messages" (
|
|
"id" TEXT NOT NULL,
|
|
"documentId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"role" TEXT NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"metadata" JSONB,
|
|
|
|
CONSTRAINT "chat_messages_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "references" (
|
|
"id" TEXT NOT NULL,
|
|
"documentId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"citationKey" TEXT NOT NULL,
|
|
"doi" TEXT,
|
|
"title" TEXT,
|
|
"authors" JSONB,
|
|
"year" INTEGER,
|
|
"journal" TEXT,
|
|
"volume" TEXT,
|
|
"pages" TEXT,
|
|
"url" TEXT,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "references_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "prompt_pool" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"prompts" JSONB NOT NULL,
|
|
"healthConfig" JSONB,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "prompt_pool_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "users_id_idx" ON "users"("id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "user_settings_userId_key" ON "user_settings"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "api_keys_userId_provider_idx" ON "api_keys"("userId", "provider");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "custom_source_sites_userId_idx" ON "custom_source_sites"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "documents_userId_createdAt_idx" ON "documents"("userId", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "documents_status_idx" ON "documents"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "annotations_documentId_idx" ON "annotations"("documentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "annotations_userId_idx" ON "annotations"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "semantic_groups_documentId_key" ON "semantic_groups"("documentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "glossaries_userId_idx" ON "glossaries"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "system_config_key_key" ON "system_config"("key");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "processed_files_userId_idx" ON "processed_files"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "processed_files_userId_fileIdentifier_key" ON "processed_files"("userId", "fileIdentifier");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "user_quotas_userId_key" ON "user_quotas"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "usage_logs_userId_createdAt_idx" ON "usage_logs"("userId", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "usage_logs_action_createdAt_idx" ON "usage_logs"("action", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "chat_messages_documentId_timestamp_idx" ON "chat_messages"("documentId", "timestamp");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "references_documentId_idx" ON "references"("documentId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "references_documentId_citationKey_key" ON "references"("documentId", "citationKey");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "prompt_pool_userId_key" ON "prompt_pool"("userId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "user_settings" ADD CONSTRAINT "user_settings_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "api_keys" ADD CONSTRAINT "api_keys_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "documents" ADD CONSTRAINT "documents_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "annotations" ADD CONSTRAINT "annotations_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "annotations" ADD CONSTRAINT "annotations_documentId_fkey" FOREIGN KEY ("documentId") REFERENCES "documents"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "semantic_groups" ADD CONSTRAINT "semantic_groups_documentId_fkey" FOREIGN KEY ("documentId") REFERENCES "documents"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "glossaries" ADD CONSTRAINT "glossaries_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "processed_files" ADD CONSTRAINT "processed_files_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "user_quotas" ADD CONSTRAINT "user_quotas_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "chat_messages" ADD CONSTRAINT "chat_messages_documentId_fkey" FOREIGN KEY ("documentId") REFERENCES "documents"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "chat_messages" ADD CONSTRAINT "chat_messages_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "references" ADD CONSTRAINT "references_documentId_fkey" FOREIGN KEY ("documentId") REFERENCES "documents"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "references" ADD CONSTRAINT "references_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "prompt_pool" ADD CONSTRAINT "prompt_pool_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|