From 524c6f6782d05fa86c37c9815256a3351dc80848 Mon Sep 17 00:00:00 2001 From: ttipo Date: Tue, 30 Jun 2026 19:15:02 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=93=9C=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20=EC=A0=84=ED=99=98=20=EC=9A=B4=EC=98=81=20?= =?UTF-8?q?=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit drive_files 에 extracted_text/extract_status 추가, project_attachments 폐기(완전 대체). dev 는 synchronize, 운영은 이 마이그레이션으로 반영 Co-Authored-By: Claude Opus 4.8 (1M context) --- ...dDriveFileExtractDropProjectAttachments.ts | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 backend/src/migrations/1783000000000-AddDriveFileExtractDropProjectAttachments.ts diff --git a/backend/src/migrations/1783000000000-AddDriveFileExtractDropProjectAttachments.ts b/backend/src/migrations/1783000000000-AddDriveFileExtractDropProjectAttachments.ts new file mode 100644 index 0000000..6853e7b --- /dev/null +++ b/backend/src/migrations/1783000000000-AddDriveFileExtractDropProjectAttachments.ts @@ -0,0 +1,53 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +// 프로젝트 AI 검토 문서를 "드라이브 폴더 연동"으로 전환. +// - drive_files 에 AI 추출 캐시 컬럼(extracted_text, extract_status) 추가 +// → 연동 폴더 문서를 NCP 에서 받아 텍스트 추출·캐싱(AI 업무 추천 주입) +// - 프로젝트 직접 업로드(project_attachments) 폐기 → 테이블 제거(완전 대체) +// 운영(migrationsRun)에서만 실행되며, dev 는 synchronize 로 자동 반영된다. +export class AddDriveFileExtractDropProjectAttachments1783000000000 implements MigrationInterface { + name = 'AddDriveFileExtractDropProjectAttachments1783000000000'; + + public async up(queryRunner: QueryRunner): Promise { + // 1) drive_files AI 추출 캐시 컬럼 + await queryRunner.query( + `ALTER TABLE "drive_files" ADD "extracted_text" text`, + ); + await queryRunner.query( + `ALTER TABLE "drive_files" ADD "extract_status" character varying NOT NULL DEFAULT 'pending'`, + ); + + // 2) project_attachments 폐기 (드라이브 연동으로 대체) + await queryRunner.query( + `ALTER TABLE "project_attachments" DROP CONSTRAINT "FK_project_attachments_uploader"`, + ); + await queryRunner.query( + `ALTER TABLE "project_attachments" DROP CONSTRAINT "FK_project_attachments_project"`, + ); + await queryRunner.query(`DROP TABLE "project_attachments"`); + } + + public async down(queryRunner: QueryRunner): Promise { + // 1) project_attachments 복원 (AddProjectAttachments + ExtractedText 와 동일 스키마) + await queryRunner.query( + `CREATE TABLE "project_attachments" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "name" character varying NOT NULL, "stored_name" character varying NOT NULL, "size" integer NOT NULL, "mime" character varying NOT NULL, "kind" character varying NOT NULL, "extracted_text" text, "created_at" TIMESTAMP NOT NULL DEFAULT now(), "project_id" uuid, "uploader_id" uuid, CONSTRAINT "PK_project_attachments" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE INDEX "IDX_project_attachments_project" ON "project_attachments" ("project_id")`, + ); + await queryRunner.query( + `ALTER TABLE "project_attachments" ADD CONSTRAINT "FK_project_attachments_project" FOREIGN KEY ("project_id") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "project_attachments" ADD CONSTRAINT "FK_project_attachments_uploader" FOREIGN KEY ("uploader_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE NO ACTION`, + ); + + // 2) drive_files 추출 캐시 컬럼 제거 + await queryRunner.query( + `ALTER TABLE "drive_files" DROP COLUMN "extract_status"`, + ); + await queryRunner.query( + `ALTER TABLE "drive_files" DROP COLUMN "extracted_text"`, + ); + } +}