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="상세 지역 정보",
)
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,

View File

@ -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,

View File

@ -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,

View File

@ -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="사용된 프롬프트")