-- AlterTable: UploadedFile ALTER TABLE `UploadedFile` ADD COLUMN `sha256` VARCHAR(64) NULL, ADD COLUMN `purpose` VARCHAR(32) NULL; CREATE INDEX `UploadedFile_sha256_idx` ON `UploadedFile`(`sha256`); -- AlterTable: DocumentImport ALTER TABLE `DocumentImport` ADD COLUMN `sourceId` VARCHAR(191) NULL, ADD COLUMN `step` VARCHAR(32) NULL, ADD COLUMN `workerId` VARCHAR(255) NULL, ADD COLUMN `retryCount` INT NOT NULL DEFAULT 0, ADD COLUMN `maxRetries` INT NOT NULL DEFAULT 3, ADD COLUMN `heartbeatAt` DATETIME(3) NULL, ADD COLUMN `errorCode` VARCHAR(32) NULL, MODIFY `status` VARCHAR(32) NOT NULL DEFAULT 'QUEUED'; CREATE INDEX `DocumentImport_sourceId_idx` ON `DocumentImport`(`sourceId`); CREATE INDEX `DocumentImport_workerId_idx` ON `DocumentImport`(`workerId`); -- AlterTable: KnowledgeItem ALTER TABLE `KnowledgeItem` ADD COLUMN `sourceDeleted` BOOLEAN NOT NULL DEFAULT false, ADD COLUMN `sourceTitleSnapshot` VARCHAR(255) NULL, ADD COLUMN `sourceSnippetSnapshot` TEXT NULL; -- CreateTable: KnowledgeSource CREATE TABLE `KnowledgeSource` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NOT NULL, `knowledgeBaseId` VARCHAR(191) NOT NULL, `fileId` VARCHAR(191) NULL, `type` VARCHAR(32) NOT NULL DEFAULT 'file', `title` VARCHAR(255) NULL, `originalFilename` VARCHAR(255) NULL, `mimeType` VARCHAR(100) NULL, `sizeBytes` BIGINT NOT NULL DEFAULT 0, `textLength` INT NOT NULL DEFAULT 0, `parseStatus` VARCHAR(32) NOT NULL DEFAULT 'pending', `indexStatus` VARCHAR(32) NOT NULL DEFAULT 'pending', `learningStatus` VARCHAR(32) NOT NULL DEFAULT 'pending', `parsedObjectKey` VARCHAR(500) NULL, `metadataObjectKey` VARCHAR(500) NULL, `originalObjectKey` VARCHAR(500) NULL, `version` INT NOT NULL DEFAULT 1, `parentSourceId` VARCHAR(191) NULL, `replacedBySourceId` VARCHAR(191) NULL, `errorCode` VARCHAR(32) NULL, `errorMessage` TEXT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, `deletedAt` DATETIME(3) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE INDEX `KnowledgeSource_userId_idx` ON `KnowledgeSource`(`userId`); CREATE INDEX `KnowledgeSource_knowledgeBaseId_idx` ON `KnowledgeSource`(`knowledgeBaseId`); CREATE INDEX `KnowledgeSource_fileId_idx` ON `KnowledgeSource`(`fileId`); CREATE INDEX `KnowledgeSource_parseStatus_idx` ON `KnowledgeSource`(`parseStatus`); CREATE INDEX `KnowledgeSource_indexStatus_idx` ON `KnowledgeSource`(`indexStatus`); -- CreateTable: KnowledgeChunk CREATE TABLE `KnowledgeChunk` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NOT NULL, `knowledgeBaseId` VARCHAR(191) NOT NULL, `sourceId` VARCHAR(191) NOT NULL, `content` LONGTEXT NOT NULL, `chunkIndex` INT NOT NULL, `pageNumber` INT NULL, `sectionTitle` VARCHAR(500) NULL, `tokenCount` INT NOT NULL DEFAULT 0, `externalVectorId` VARCHAR(255) NULL, `embeddingModel` VARCHAR(100) NULL, `embeddingStatus` VARCHAR(32) NOT NULL DEFAULT 'pending', `metadataJson` JSON NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, `deletedAt` DATETIME(3) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE INDEX `KnowledgeChunk_userId_idx` ON `KnowledgeChunk`(`userId`); CREATE INDEX `KnowledgeChunk_sourceId_idx` ON `KnowledgeChunk`(`sourceId`); CREATE INDEX `KnowledgeChunk_knowledgeBaseId_idx` ON `KnowledgeChunk`(`knowledgeBaseId`); CREATE INDEX `KnowledgeChunk_externalVectorId_idx` ON `KnowledgeChunk`(`externalVectorId`); -- CreateTable: ImportCandidate CREATE TABLE `ImportCandidate` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NOT NULL, `knowledgeBaseId` VARCHAR(191) NOT NULL, `sourceId` VARCHAR(191) NOT NULL, `importId` VARCHAR(191) NOT NULL, `title` VARCHAR(255) NOT NULL, `summary` TEXT NULL, `content` LONGTEXT NULL, `tagsJson` JSON NULL, `recallQuestionsJson` JSON NULL, `sourceTextSnippet` TEXT NULL, `sourceChunkIds` JSON NULL, `confidence` DECIMAL(4, 3) NOT NULL DEFAULT 0, `difficulty` VARCHAR(16) NULL, `orderIndex` INT NOT NULL DEFAULT 0, `status` VARCHAR(16) NOT NULL DEFAULT 'PENDING', `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; CREATE INDEX `ImportCandidate_userId_idx` ON `ImportCandidate`(`userId`); CREATE INDEX `ImportCandidate_sourceId_idx` ON `ImportCandidate`(`sourceId`); CREATE INDEX `ImportCandidate_importId_idx` ON `ImportCandidate`(`importId`); CREATE INDEX `ImportCandidate_status_idx` ON `ImportCandidate`(`status`); -- CreateTable: BackupJob CREATE TABLE `BackupJob` ( `id` VARCHAR(191) NOT NULL, `type` VARCHAR(16) NOT NULL, `status` VARCHAR(16) NOT NULL DEFAULT 'RUNNING', `localPath` VARCHAR(500) NULL, `cosObjectKey` VARCHAR(500) NULL, `fileSizeBytes` BIGINT NOT NULL DEFAULT 0, `startedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `completedAt` DATETIME(3) NULL, `errorMessage` TEXT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable: MembershipPlan CREATE TABLE `MembershipPlan` ( `id` VARCHAR(191) NOT NULL, `code` VARCHAR(32) NOT NULL, `name` VARCHAR(100) NOT NULL, `priceMonthly` INT NOT NULL DEFAULT 0, `priceYearly` INT NOT NULL DEFAULT 0, `maxKnowledgeBases` INT NOT NULL DEFAULT 1, `maxStorageBytes` BIGINT NOT NULL DEFAULT 0, `maxFileSizeBytes` BIGINT NOT NULL DEFAULT 0, `monthlyOcrPages` INT NOT NULL DEFAULT 0, `monthlyVisionPages` INT NOT NULL DEFAULT 0, `monthlyChatCount` INT NOT NULL DEFAULT 0, `monthlyAiAnalysisCount` INT NOT NULL DEFAULT 0, `monthlyRecallCount` INT NOT NULL DEFAULT 0, `monthlyCardGenCount` INT NOT NULL DEFAULT 0, `isActive` BOOLEAN NOT NULL DEFAULT true, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `MembershipPlan_code_key`(`code`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- AddForeignKey ALTER TABLE `KnowledgeSource` ADD CONSTRAINT `KnowledgeSource_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `KnowledgeSource` ADD CONSTRAINT `KnowledgeSource_knowledgeBaseId_fkey` FOREIGN KEY (`knowledgeBaseId`) REFERENCES `KnowledgeBase`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `KnowledgeSource` ADD CONSTRAINT `KnowledgeSource_fileId_fkey` FOREIGN KEY (`fileId`) REFERENCES `UploadedFile`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE `KnowledgeChunk` ADD CONSTRAINT `KnowledgeChunk_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `KnowledgeChunk` ADD CONSTRAINT `KnowledgeChunk_knowledgeBaseId_fkey` FOREIGN KEY (`knowledgeBaseId`) REFERENCES `KnowledgeBase`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `KnowledgeChunk` ADD CONSTRAINT `KnowledgeChunk_sourceId_fkey` FOREIGN KEY (`sourceId`) REFERENCES `KnowledgeSource`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `ImportCandidate` ADD CONSTRAINT `ImportCandidate_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `ImportCandidate` ADD CONSTRAINT `ImportCandidate_knowledgeBaseId_fkey` FOREIGN KEY (`knowledgeBaseId`) REFERENCES `KnowledgeBase`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `ImportCandidate` ADD CONSTRAINT `ImportCandidate_sourceId_fkey` FOREIGN KEY (`sourceId`) REFERENCES `KnowledgeSource`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `ImportCandidate` ADD CONSTRAINT `ImportCandidate_importId_fkey` FOREIGN KEY (`importId`) REFERENCES `DocumentImport`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `DocumentImport` ADD CONSTRAINT `DocumentImport_sourceId_fkey` FOREIGN KEY (`sourceId`) REFERENCES `KnowledgeSource`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;