db 저장 가사까지 구현

insta
bluebamus 2025-12-23 18:14:46 +09:00
parent 83a72aaa46
commit cafe6a894e
4 changed files with 64 additions and 2 deletions

View File

@ -87,6 +87,13 @@ class Project(Base):
comment="상세 지역 정보", 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( created_at: Mapped[datetime] = mapped_column(
DateTime, DateTime,
nullable=False, nullable=False,

View File

@ -28,8 +28,10 @@ from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Query, status from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy import func, select from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from uuid_extensions import uuid7
from app.database.session import get_session from app.database.session import get_session
from app.home.models import Project
from app.lyric.models import Lyric from app.lyric.models import Lyric
from app.lyric.schemas.lyric import ( from app.lyric.schemas.lyric import (
GenerateLyricRequest, GenerateLyricRequest,
@ -231,6 +233,7 @@ async def get_lyrics_paginated(
## 반환 정보 ## 반환 정보
- **success**: 생성 성공 여부 - **success**: 생성 성공 여부
- **task_id**: 작업 고유 식별자
- **lyric**: 생성된 가사 - **lyric**: 생성된 가사
- **language**: 가사 언어 - **language**: 가사 언어
- **prompt_used**: 사용된 프롬프트 - **prompt_used**: 사용된 프롬프트
@ -255,39 +258,82 @@ POST /lyric/generate
) )
async def generate_lyric( async def generate_lyric(
request_body: GenerateLyricRequest, request_body: GenerateLyricRequest,
session: AsyncSession = Depends(get_session),
) -> GenerateLyricResponse: ) -> GenerateLyricResponse:
"""고객 정보를 기반으로 가사를 생성합니다.""" """고객 정보를 기반으로 가사를 생성합니다."""
task_id = str(uuid7())
try: try:
# 1. ChatGPT 서비스 초기화 및 프롬프트 생성
service = ChatgptService( service = ChatgptService(
customer_name=request_body.customer_name, customer_name=request_body.customer_name,
region=request_body.region, region=request_body.region,
detail_region_info=request_body.detail_region_info or "", detail_region_info=request_body.detail_region_info or "",
language=request_body.language, language=request_body.language,
) )
prompt = service.build_lyrics_prompt() 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) result = await service.generate(prompt=prompt)
# ERROR가 포함되어 있으면 실패 처리 # 5. ERROR가 포함되어 있으면 실패 처리
if "ERROR:" in result: if "ERROR:" in result:
lyric.status = "failed"
lyric.lyric_result = result
await session.commit()
return GenerateLyricResponse( return GenerateLyricResponse(
success=False, success=False,
task_id=task_id,
lyric=None, lyric=None,
language=request_body.language, language=request_body.language,
prompt_used=prompt, prompt_used=prompt,
error_message=result, error_message=result,
) )
# 6. 성공 시 Lyric 테이블 업데이트 (status: completed)
lyric.status = "completed"
lyric.lyric_result = result
await session.commit()
return GenerateLyricResponse( return GenerateLyricResponse(
success=True, success=True,
task_id=task_id,
lyric=result, lyric=result,
language=request_body.language, language=request_body.language,
prompt_used=prompt, prompt_used=prompt,
error_message=None, error_message=None,
) )
except Exception as e: except Exception as e:
await session.rollback()
return GenerateLyricResponse( return GenerateLyricResponse(
success=False, success=False,
task_id=task_id,
lyric=None, lyric=None,
language=request_body.language, language=request_body.language,
prompt_used=None, prompt_used=None,

View File

@ -84,6 +84,13 @@ class Lyric(Base):
comment="생성된 가사 결과", 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( created_at: Mapped[datetime] = mapped_column(
DateTime, DateTime,
nullable=True, nullable=True,

View File

@ -75,6 +75,7 @@ class GenerateLyricResponse(BaseModel):
Example Response: Example Response:
{ {
"success": true, "success": true,
"task_id": "019123ab-cdef-7890-abcd-ef1234567890",
"lyric": "생성된 가사...", "lyric": "생성된 가사...",
"language": "Korean", "language": "Korean",
"prompt_used": "..." "prompt_used": "..."
@ -82,6 +83,7 @@ class GenerateLyricResponse(BaseModel):
""" """
success: bool = Field(..., description="생성 성공 여부") success: bool = Field(..., description="생성 성공 여부")
task_id: Optional[str] = Field(None, description="작업 고유 식별자")
lyric: Optional[str] = Field(None, description="생성된 가사") lyric: Optional[str] = Field(None, description="생성된 가사")
language: str = Field(..., description="가사 언어") language: str = Field(..., description="가사 언어")
prompt_used: Optional[str] = Field(None, description="사용된 프롬프트") prompt_used: Optional[str] = Field(None, description="사용된 프롬프트")