From cafe6a894e102c8cdd5e3acf8086b741a795c545 Mon Sep 17 00:00:00 2001 From: bluebamus Date: Tue, 23 Dec 2025 18:14:46 +0900 Subject: [PATCH] =?UTF-8?q?db=20=EC=A0=80=EC=9E=A5=20=EA=B0=80=EC=82=AC?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/models.py | 7 +++++ app/lyric/api/routers/v1/lyric.py | 50 +++++++++++++++++++++++++++++-- app/lyric/models.py | 7 +++++ app/lyric/schemas/lyric.py | 2 ++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/app/home/models.py b/app/home/models.py index 06b8e87..a13ceba 100644 --- a/app/home/models.py +++ b/app/home/models.py @@ -87,6 +87,13 @@ class Project(Base): comment="상세 지역 정보", ) + language: Mapped[str] = mapped_column( + String(50), + nullable=False, + default="Korean", + comment="출력 언어 (Korean, English, Chinese, Japanese, Thai, Vietnamese)", + ) + created_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, diff --git a/app/lyric/api/routers/v1/lyric.py b/app/lyric/api/routers/v1/lyric.py index 6eafb39..b94b096 100644 --- a/app/lyric/api/routers/v1/lyric.py +++ b/app/lyric/api/routers/v1/lyric.py @@ -28,8 +28,10 @@ from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession +from uuid_extensions import uuid7 from app.database.session import get_session +from app.home.models import Project from app.lyric.models import Lyric from app.lyric.schemas.lyric import ( GenerateLyricRequest, @@ -231,6 +233,7 @@ async def get_lyrics_paginated( ## 반환 정보 - **success**: 생성 성공 여부 +- **task_id**: 작업 고유 식별자 - **lyric**: 생성된 가사 - **language**: 가사 언어 - **prompt_used**: 사용된 프롬프트 @@ -255,39 +258,82 @@ POST /lyric/generate ) async def generate_lyric( request_body: GenerateLyricRequest, + session: AsyncSession = Depends(get_session), ) -> GenerateLyricResponse: """고객 정보를 기반으로 가사를 생성합니다.""" + task_id = str(uuid7()) + try: + # 1. ChatGPT 서비스 초기화 및 프롬프트 생성 service = ChatgptService( customer_name=request_body.customer_name, region=request_body.region, detail_region_info=request_body.detail_region_info or "", language=request_body.language, ) - prompt = service.build_lyrics_prompt() + + # 2. Project 테이블에 데이터 저장 + project = Project( + store_name=request_body.customer_name, + region=request_body.region, + task_id=task_id, + detail_region_info=request_body.detail_region_info, + language=request_body.language, + ) + session.add(project) + await session.commit() + await session.refresh(project) # commit 후 project.id 동기화 + + # 3. Lyric 테이블에 데이터 저장 (status: processing) + lyric = Lyric( + project_id=project.id, + task_id=task_id, + status="processing", + lyric_prompt=prompt, + lyric_result=None, + language=request_body.language, + ) + session.add(lyric) + await session.commit() # processing 상태를 확실히 저장 (다른 트랜잭션에서 조회 가능) + await session.refresh(lyric) # commit 후 객체 상태 동기화 + + # 4. ChatGPT를 통해 가사 생성 result = await service.generate(prompt=prompt) - # ERROR가 포함되어 있으면 실패 처리 + # 5. ERROR가 포함되어 있으면 실패 처리 if "ERROR:" in result: + lyric.status = "failed" + lyric.lyric_result = result + await session.commit() + return GenerateLyricResponse( success=False, + task_id=task_id, lyric=None, language=request_body.language, prompt_used=prompt, error_message=result, ) + # 6. 성공 시 Lyric 테이블 업데이트 (status: completed) + lyric.status = "completed" + lyric.lyric_result = result + await session.commit() + return GenerateLyricResponse( success=True, + task_id=task_id, lyric=result, language=request_body.language, prompt_used=prompt, error_message=None, ) except Exception as e: + await session.rollback() return GenerateLyricResponse( success=False, + task_id=task_id, lyric=None, language=request_body.language, prompt_used=None, diff --git a/app/lyric/models.py b/app/lyric/models.py index 5eb4517..56b6528 100644 --- a/app/lyric/models.py +++ b/app/lyric/models.py @@ -84,6 +84,13 @@ class Lyric(Base): comment="생성된 가사 결과", ) + language: Mapped[str] = mapped_column( + String(50), + nullable=False, + default="Korean", + comment="가사 출력 언어 (Korean, English, Chinese, Japanese, Thai, Vietnamese)", + ) + created_at: Mapped[datetime] = mapped_column( DateTime, nullable=True, diff --git a/app/lyric/schemas/lyric.py b/app/lyric/schemas/lyric.py index ac091d6..2a8c9c9 100644 --- a/app/lyric/schemas/lyric.py +++ b/app/lyric/schemas/lyric.py @@ -75,6 +75,7 @@ class GenerateLyricResponse(BaseModel): Example Response: { "success": true, + "task_id": "019123ab-cdef-7890-abcd-ef1234567890", "lyric": "생성된 가사...", "language": "Korean", "prompt_used": "..." @@ -82,6 +83,7 @@ class GenerateLyricResponse(BaseModel): """ success: bool = Field(..., description="생성 성공 여부") + task_id: Optional[str] = Field(None, description="작업 고유 식별자") lyric: Optional[str] = Field(None, description="생성된 가사") language: str = Field(..., description="가사 언어") prompt_used: Optional[str] = Field(None, description="사용된 프롬프트")