o2o-castad-backend/docs/database-schema/migration_2026-08-25_p2v.sql
2026-08-26 13:52:18 +09:00

89 lines
6.6 KiB
SQL

-- ============================================================
-- Migration: P2V(무빙 포스터 F1 / 포스터 스타일링 F2) 잡 테이블 추가
-- Date: 2026-08-25
-- Description: P2V 서버에는 사용자 개념이 없어 castad 가 소유권을 들고,
-- 크레딧 선차감·환불과 Azure Blob 아카이브 URL 을 함께 보관한다.
-- 파이프라인마다 과정·산출물이 달라 테이블을 나눴다.
-- 테이블명은 산출물 종류를 따른다 — F1(포스터→영상)은 p2v_video,
-- F2(포스터 스타일링)는 p2v_poster. "F1/F2"는 P2V 서버 자체 API
-- 경로(/api/f1/*, /api/f2/*)를 가리킬 때만 코드·주석에 남는다.
-- 선행 조건: migration_2026-04-29_add_credit_tables.sql 먼저 실행
-- 비고: credit_transaction 은 스키마 변경 없이 재사용한다
-- (job_type='p2v_f1'|'p2v_f2', job_ref=이 테이블의 id).
-- ============================================================
CREATE TABLE IF NOT EXISTS p2v_video (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '고유 식별자 (크레딧 원장 job_ref 앵커)',
user_uuid VARCHAR(36) NOT NULL COMMENT '생성 요청한 사용자 UUID',
p2v_job_id VARCHAR(64) NULL COMMENT 'P2V 서버가 발급한 잡 id(F1). 서버 호출 성공 후 채워진다',
name VARCHAR(100) NULL COMMENT '사용자가 입력한 행사명 (비우면 서버가 포스터에서 추출)',
status VARCHAR(20) NOT NULL DEFAULT 'queued' COMMENT '상태 (queued/running/awaiting_review/archiving/done/failed)',
credit_amount INT NOT NULL DEFAULT 0 COMMENT '차감한 크레딧 수량 (환불 금액 결정)',
-- 산출물 (Blob 업로드 후 채워짐). 명명은 ssul_content 관례를 따른다:
-- poster_url = 커버/썸네일(SNS 공유 og:image 역할), 원본은 source_*, 결과물은 파이프라인 접두.
p2v_video_url VARCHAR(500) NULL COMMENT '완성 영상 Blob URL',
poster_url VARCHAR(500) NULL COMMENT '썸네일 Blob URL (SNS 공유 og:image 역할, ssul_content.poster_url 관례)',
source_image_url VARCHAR(500) NULL COMMENT '원본 업로드 포스터 Blob URL',
-- 확정 메타데이터 (검수에서 사용자가 수정한 최종본만 보관)
event_name VARCHAR(200) NULL COMMENT '행사명',
date_text VARCHAR(100) NULL COMMENT '일시 표기',
place VARCHAR(200) NULL COMMENT '장소',
keywords JSON NULL COMMENT '키워드 목록',
narration JSON NULL COMMENT '나레이션 3문장',
duration DECIMAL(6,2) NULL COMMENT '완성 영상 길이(초)',
error VARCHAR(1000) NULL COMMENT '실패 사유 (스테이지 + detail)',
archived_at DATETIME NULL COMMENT 'Blob 업로드 완료 일시. NULL 이면 아직 P2V 에만 있음',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (id),
CONSTRAINT fk_p2v_video_user FOREIGN KEY (user_uuid) REFERENCES `user`(user_uuid) ON DELETE CASCADE,
UNIQUE KEY uq_p2v_video_ref (p2v_job_id),
INDEX idx_p2v_video_user_created (user_uuid, created_at),
INDEX idx_p2v_video_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='P2V F1 — 무빙 포스터(포스터→영상) 잡';
CREATE TABLE IF NOT EXISTS p2v_poster (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '고유 식별자 (크레딧 원장 job_ref 앵커)',
user_uuid VARCHAR(36) NOT NULL COMMENT '생성 요청한 사용자 UUID',
p2v_job_id VARCHAR(64) NULL COMMENT 'P2V 서버가 발급한 잡 id(F2)',
name VARCHAR(100) NULL COMMENT '포스터 이름 (업로드 파일명에서 추출). 내 콘텐츠 카드 제목',
source_video_id BIGINT NULL COMMENT '원본 p2v_video 잡 (P2V source_slug 대응). 독립 잡이면 NULL',
status VARCHAR(20) NOT NULL DEFAULT 'queued' COMMENT '상태 (queued/running/archiving/done/failed)',
credit_amount INT NOT NULL DEFAULT 0 COMMENT '차감한 크레딧 수량',
-- 입력 스냅샷 (템플릿이 삭제돼도 이력이 남아야 한다)
template_id VARCHAR(64) NOT NULL COMMENT '사용한 스타일 템플릿 id',
template_name VARCHAR(100) NULL COMMENT '템플릿 이름 스냅샷',
license VARCHAR(20) NULL COMMENT '템플릿 배포 등급 (public-domain/internal-only/user-uploaded). 외부 공개 가부 판단',
format VARCHAR(16) NOT NULL DEFAULT 'poster' COMMENT '출력 포맷 (poster/story/feed/square)',
-- 산출물 (명명은 p2v_video와 동일 관례)
p2v_poster_url VARCHAR(500) NULL COMMENT '스타일 변환 결과 Blob URL',
source_image_url VARCHAR(500) NULL COMMENT '원본 업로드 포스터 Blob URL',
error VARCHAR(1000) NULL COMMENT '실패 사유',
archived_at DATETIME NULL COMMENT 'Blob 업로드 완료 일시',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (id),
CONSTRAINT fk_p2v_poster_user FOREIGN KEY (user_uuid) REFERENCES `user`(user_uuid) ON DELETE CASCADE,
CONSTRAINT fk_p2v_poster_source FOREIGN KEY (source_video_id) REFERENCES p2v_video(id) ON DELETE SET NULL,
UNIQUE KEY uq_p2v_poster_ref (p2v_job_id),
INDEX idx_p2v_poster_user_created (user_uuid, created_at),
INDEX idx_p2v_poster_status (status),
INDEX idx_p2v_poster_source (source_video_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='P2V F2 — 포스터 스타일링 잡';
-- ============================================================
-- 롤백
-- ============================================================
-- DROP TABLE IF EXISTS p2v_poster; -- FK 때문에 poster 를 먼저 지운다
-- DROP TABLE IF EXISTS p2v_video;