diff --git a/prisma/migrations/20250519000000_add_knowledge_source_chunk_candidate/migration.sql b/prisma/migrations/20250519000000_add_knowledge_source_chunk_candidate/migration.sql new file mode 100644 index 0000000..5037fcb --- /dev/null +++ b/prisma/migrations/20250519000000_add_knowledge_source_chunk_candidate/migration.sql @@ -0,0 +1,171 @@ +-- 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;