WangDL 007b56dad5
All checks were successful
Deploy API Server / build-and-deploy (push) Successful in 1m0s
feat: AI三层架构 + 全局JwtAuthGuard + 12个Repository迁Prisma
- AI: 新三层架构 Provider→Gateway→Workflow(15文件,DeepSeek+MiniMax)
- Auth: 全局JwtAuthGuard + @Public()装饰器白名单路由
- DB: 12个Repository从Map/Array迁到Prisma
- Schema: 新增AiUsageLog、WaitlistEntry模型
- API: /api-docs-json加Basic Auth保护
- 清理: 删除infrastructure/ai、docs/旧文档

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 00:39:46 +08:00

593 lines
23 KiB
SQL

-- CreateTable
CREATE TABLE `User` (
`id` VARCHAR(191) NOT NULL,
`email` VARCHAR(255) NULL,
`nickname` VARCHAR(100) NULL,
`avatarUrl` VARCHAR(500) NULL,
`role` VARCHAR(32) NOT NULL DEFAULT 'USER',
`status` VARCHAR(32) NOT NULL DEFAULT 'active',
`onboardingCompleted` BOOLEAN NOT NULL DEFAULT false,
`lastLoginAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
`deletedAt` DATETIME(3) NULL,
INDEX `User_email_idx`(`email`),
INDEX `User_status_idx`(`status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `AuthAccount` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`provider` VARCHAR(32) NOT NULL,
`providerUserId` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NULL,
`rawProfileJson` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `AuthAccount_userId_idx`(`userId`),
UNIQUE INDEX `AuthAccount_provider_providerUserId_key`(`provider`, `providerUserId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `RefreshToken` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`tokenHash` VARCHAR(255) NOT NULL,
`deviceId` VARCHAR(255) NULL,
`deviceName` VARCHAR(255) NULL,
`expiresAt` DATETIME(3) NOT NULL,
`revokedAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `RefreshToken_userId_idx`(`userId`),
INDEX `RefreshToken_tokenHash_idx`(`tokenHash`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `UserProfile` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`learningIdentity` VARCHAR(100) NULL,
`learningDirection` VARCHAR(255) NULL,
`bio` TEXT NULL,
`currentGoal` VARCHAR(255) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `UserProfile_userId_key`(`userId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `UserPreference` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`preferredMethods` JSON NULL,
`defaultFocusMinutes` INTEGER NOT NULL DEFAULT 25,
`aiSuggestionLevel` VARCHAR(32) NOT NULL DEFAULT 'normal',
`language` VARCHAR(32) NOT NULL DEFAULT 'zh-CN',
`appearance` VARCHAR(32) NOT NULL DEFAULT 'system',
`notificationEnabled` BOOLEAN NOT NULL DEFAULT true,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `UserPreference_userId_key`(`userId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `UserConsent` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`consentType` VARCHAR(32) NOT NULL,
`version` VARCHAR(50) NOT NULL,
`acceptedAt` DATETIME(3) NOT NULL,
`ipAddress` VARCHAR(100) NULL,
`userAgent` VARCHAR(500) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `UserConsent_userId_idx`(`userId`),
INDEX `UserConsent_consentType_idx`(`consentType`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `KnowledgeBase` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`description` TEXT NULL,
`coverKey` VARCHAR(100) NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'active',
`itemCount` INTEGER NOT NULL DEFAULT 0,
`lastStudiedAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
`deletedAt` DATETIME(3) NULL,
INDEX `KnowledgeBase_userId_idx`(`userId`),
INDEX `KnowledgeBase_status_idx`(`status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `KnowledgeItem` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`knowledgeBaseId` VARCHAR(191) NOT NULL,
`parentId` VARCHAR(191) NULL,
`itemType` VARCHAR(32) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`content` LONGTEXT NULL,
`summary` TEXT NULL,
`sourceType` VARCHAR(32) NULL,
`sourceRef` VARCHAR(500) NULL,
`orderIndex` INTEGER NOT NULL DEFAULT 0,
`status` VARCHAR(32) NOT NULL DEFAULT 'active',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
`deletedAt` DATETIME(3) NULL,
INDEX `KnowledgeItem_userId_idx`(`userId`),
INDEX `KnowledgeItem_knowledgeBaseId_idx`(`knowledgeBaseId`),
INDEX `KnowledgeItem_parentId_idx`(`parentId`),
INDEX `KnowledgeItem_itemType_idx`(`itemType`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `KnowledgeItemRelation` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`sourceItemId` VARCHAR(191) NOT NULL,
`targetItemId` VARCHAR(191) NOT NULL,
`relationType` VARCHAR(32) NOT NULL,
`confidence` DECIMAL(5, 2) NULL,
`reason` TEXT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `KnowledgeItemRelation_sourceItemId_idx`(`sourceItemId`),
INDEX `KnowledgeItemRelation_targetItemId_idx`(`targetItemId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Tag` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`name` VARCHAR(100) NOT NULL,
`color` VARCHAR(32) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `Tag_userId_name_key`(`userId`, `name`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `KnowledgeItemTag` (
`id` VARCHAR(191) NOT NULL,
`knowledgeItemId` VARCHAR(191) NOT NULL,
`tagId` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `KnowledgeItemTag_knowledgeItemId_tagId_key`(`knowledgeItemId`, `tagId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `UploadedFile` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`filename` VARCHAR(255) NOT NULL,
`mimeType` VARCHAR(100) NULL,
`storagePath` VARCHAR(500) NOT NULL,
`sizeBytes` BIGINT NOT NULL DEFAULT 0,
`checksum` VARCHAR(255) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `UploadedFile_userId_idx`(`userId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `DocumentImport` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`knowledgeBaseId` VARCHAR(191) NULL,
`fileId` VARCHAR(191) NULL,
`sourceType` VARCHAR(32) NOT NULL,
`sourceName` VARCHAR(255) NULL,
`sourceUrl` VARCHAR(500) NULL,
`rawText` LONGTEXT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'pending',
`progress` INTEGER NOT NULL DEFAULT 0,
`errorMessage` TEXT NULL,
`resultJson` JSON NULL,
`startedAt` DATETIME(3) NULL,
`completedAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `DocumentImport_userId_idx`(`userId`),
INDEX `DocumentImport_status_idx`(`status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `LearningSession` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`knowledgeBaseId` VARCHAR(191) NULL,
`knowledgeItemId` VARCHAR(191) NULL,
`mode` VARCHAR(32) NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'active',
`startedAt` DATETIME(3) NOT NULL,
`endedAt` DATETIME(3) NULL,
`durationSeconds` INTEGER NOT NULL DEFAULT 0,
`focusMinutes` INTEGER NULL,
`metadata` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `LearningSession_userId_idx`(`userId`),
INDEX `LearningSession_knowledgeItemId_idx`(`knowledgeItemId`),
INDEX `LearningSession_startedAt_idx`(`startedAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `LearningRecord` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`sessionId` VARCHAR(191) NULL,
`recordType` VARCHAR(32) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`description` TEXT NULL,
`durationSeconds` INTEGER NOT NULL DEFAULT 0,
`occurredAt` DATETIME(3) NOT NULL,
`metadata` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `LearningRecord_userId_idx`(`userId`),
INDEX `LearningRecord_occurredAt_idx`(`occurredAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ActiveRecallQuestion` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`knowledgeItemId` VARCHAR(191) NULL,
`questionText` TEXT NOT NULL,
`difficulty` VARCHAR(32) NULL,
`createdBy` VARCHAR(32) NOT NULL DEFAULT 'ai',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `ActiveRecallQuestion_userId_idx`(`userId`),
INDEX `ActiveRecallQuestion_knowledgeItemId_idx`(`knowledgeItemId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ActiveRecallAnswer` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`questionId` VARCHAR(191) NULL,
`sessionId` VARCHAR(191) NULL,
`answerType` VARCHAR(32) NOT NULL DEFAULT 'text',
`answerText` LONGTEXT NULL,
`audioFileId` VARCHAR(191) NULL,
`submittedAt` DATETIME(3) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `ActiveRecallAnswer_userId_idx`(`userId`),
INDEX `ActiveRecallAnswer_questionId_idx`(`questionId`),
INDEX `ActiveRecallAnswer_sessionId_idx`(`sessionId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `AiAnalysisJob` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`sessionId` VARCHAR(191) NULL,
`answerId` VARCHAR(191) NULL,
`jobType` VARCHAR(32) NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'pending',
`progress` INTEGER NOT NULL DEFAULT 0,
`errorMessage` TEXT NULL,
`queuedAt` DATETIME(3) NULL,
`startedAt` DATETIME(3) NULL,
`completedAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `AiAnalysisJob_userId_idx`(`userId`),
INDEX `AiAnalysisJob_status_idx`(`status`),
INDEX `AiAnalysisJob_sessionId_idx`(`sessionId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `AiAnalysisResult` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`jobId` VARCHAR(191) NOT NULL,
`sessionId` VARCHAR(191) NULL,
`answerId` VARCHAR(191) NULL,
`summary` TEXT NULL,
`masteryScore` INTEGER NULL,
`strengths` JSON NULL,
`weaknesses` JSON NULL,
`suggestions` JSON NULL,
`nextActions` JSON NULL,
`rawResult` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `AiAnalysisResult_userId_idx`(`userId`),
INDEX `AiAnalysisResult_jobId_idx`(`jobId`),
INDEX `AiAnalysisResult_sessionId_idx`(`sessionId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `FocusItem` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`knowledgeBaseId` VARCHAR(191) NULL,
`knowledgeItemId` VARCHAR(191) NULL,
`analysisResultId` VARCHAR(191) NULL,
`title` VARCHAR(255) NOT NULL,
`reason` TEXT NULL,
`suggestion` TEXT NULL,
`priority` VARCHAR(32) NOT NULL DEFAULT 'normal',
`status` VARCHAR(32) NOT NULL DEFAULT 'open',
`masteryScore` INTEGER NULL,
`dueAt` DATETIME(3) NULL,
`completedAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
`deletedAt` DATETIME(3) NULL,
INDEX `FocusItem_userId_idx`(`userId`),
INDEX `FocusItem_status_idx`(`status`),
INDEX `FocusItem_dueAt_idx`(`dueAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ReviewCard` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`knowledgeItemId` VARCHAR(191) NULL,
`focusItemId` VARCHAR(191) NULL,
`frontText` TEXT NOT NULL,
`backText` TEXT NULL,
`difficulty` VARCHAR(32) NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'active',
`nextReviewAt` DATETIME(3) NULL,
`intervalDays` INTEGER NOT NULL DEFAULT 1,
`easeFactor` DECIMAL(4, 2) NOT NULL DEFAULT 2.50,
`repetitionCount` INTEGER NOT NULL DEFAULT 0,
`lapseCount` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
`deletedAt` DATETIME(3) NULL,
INDEX `ReviewCard_userId_idx`(`userId`),
INDEX `ReviewCard_nextReviewAt_idx`(`nextReviewAt`),
INDEX `ReviewCard_focusItemId_idx`(`focusItemId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ReviewLog` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`reviewCardId` VARCHAR(191) NOT NULL,
`sessionId` VARCHAR(191) NULL,
`rating` VARCHAR(32) NOT NULL,
`responseText` TEXT NULL,
`reviewedAt` DATETIME(3) NOT NULL,
`nextReviewAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `ReviewLog_userId_idx`(`userId`),
INDEX `ReviewLog_reviewCardId_idx`(`reviewCardId`),
INDEX `ReviewLog_reviewedAt_idx`(`reviewedAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ReviewPlan` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'active',
`scheduledAt` DATETIME(3) NULL,
`completedAt` DATETIME(3) NULL,
`cardCount` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `ReviewPlan_userId_idx`(`userId`),
INDEX `ReviewPlan_scheduledAt_idx`(`scheduledAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `DailyLearningActivity` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`activityDate` DATE NOT NULL,
`durationSeconds` INTEGER NOT NULL DEFAULT 0,
`sessionsCount` INTEGER NOT NULL DEFAULT 0,
`activeRecallCount` INTEGER NOT NULL DEFAULT 0,
`reviewCount` INTEGER NOT NULL DEFAULT 0,
`aiAnalysisCount` INTEGER NOT NULL DEFAULT 0,
`completedLoopCount` INTEGER NOT NULL DEFAULT 0,
`activityLevel` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `DailyLearningActivity_userId_idx`(`userId`),
UNIQUE INDEX `DailyLearningActivity_userId_activityDate_key`(`userId`, `activityDate`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Notification` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`type` VARCHAR(32) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`content` TEXT NULL,
`data` JSON NULL,
`readAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `Notification_userId_idx`(`userId`),
INDEX `Notification_readAt_idx`(`readAt`),
INDEX `Notification_type_idx`(`type`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Feedback` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NULL,
`email` VARCHAR(255) NULL,
`category` VARCHAR(64) NOT NULL,
`content` TEXT NOT NULL,
`deviceInfo` JSON NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'open',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `Feedback_userId_idx`(`userId`),
INDEX `Feedback_status_idx`(`status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `AppChangelog` (
`id` VARCHAR(191) NOT NULL,
`version` VARCHAR(50) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`content` TEXT NOT NULL,
`platform` VARCHAR(32) NOT NULL DEFAULT 'ios',
`publishedAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `AuthAccount` ADD CONSTRAINT `AuthAccount_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `RefreshToken` ADD CONSTRAINT `RefreshToken_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `UserProfile` ADD CONSTRAINT `UserProfile_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `UserPreference` ADD CONSTRAINT `UserPreference_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `UserConsent` ADD CONSTRAINT `UserConsent_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `KnowledgeBase` ADD CONSTRAINT `KnowledgeBase_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `KnowledgeItem` ADD CONSTRAINT `KnowledgeItem_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `KnowledgeItem` ADD CONSTRAINT `KnowledgeItem_knowledgeBaseId_fkey` FOREIGN KEY (`knowledgeBaseId`) REFERENCES `KnowledgeBase`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `KnowledgeItem` ADD CONSTRAINT `KnowledgeItem_parentId_fkey` FOREIGN KEY (`parentId`) REFERENCES `KnowledgeItem`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `KnowledgeItemRelation` ADD CONSTRAINT `KnowledgeItemRelation_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Tag` ADD CONSTRAINT `Tag_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `KnowledgeItemTag` ADD CONSTRAINT `KnowledgeItemTag_knowledgeItemId_fkey` FOREIGN KEY (`knowledgeItemId`) REFERENCES `KnowledgeItem`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `KnowledgeItemTag` ADD CONSTRAINT `KnowledgeItemTag_tagId_fkey` FOREIGN KEY (`tagId`) REFERENCES `Tag`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `UploadedFile` ADD CONSTRAINT `UploadedFile_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `DocumentImport` ADD CONSTRAINT `DocumentImport_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `LearningSession` ADD CONSTRAINT `LearningSession_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `LearningRecord` ADD CONSTRAINT `LearningRecord_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ActiveRecallQuestion` ADD CONSTRAINT `ActiveRecallQuestion_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ActiveRecallAnswer` ADD CONSTRAINT `ActiveRecallAnswer_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ActiveRecallAnswer` ADD CONSTRAINT `ActiveRecallAnswer_questionId_fkey` FOREIGN KEY (`questionId`) REFERENCES `ActiveRecallQuestion`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `AiAnalysisJob` ADD CONSTRAINT `AiAnalysisJob_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `AiAnalysisResult` ADD CONSTRAINT `AiAnalysisResult_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `AiAnalysisResult` ADD CONSTRAINT `AiAnalysisResult_jobId_fkey` FOREIGN KEY (`jobId`) REFERENCES `AiAnalysisJob`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `FocusItem` ADD CONSTRAINT `FocusItem_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `FocusItem` ADD CONSTRAINT `FocusItem_knowledgeBaseId_fkey` FOREIGN KEY (`knowledgeBaseId`) REFERENCES `KnowledgeBase`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ReviewCard` ADD CONSTRAINT `ReviewCard_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ReviewLog` ADD CONSTRAINT `ReviewLog_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ReviewLog` ADD CONSTRAINT `ReviewLog_reviewCardId_fkey` FOREIGN KEY (`reviewCardId`) REFERENCES `ReviewCard`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ReviewPlan` ADD CONSTRAINT `ReviewPlan_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `DailyLearningActivity` ADD CONSTRAINT `DailyLearningActivity_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Feedback` ADD CONSTRAINT `Feedback_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;