72 lines
2.4 KiB
Python
72 lines
2.4 KiB
Python
"""
|
|
Dashboard Background Tasks
|
|
|
|
업로드 완료 시 Dashboard 테이블에 레코드를 삽입하는 백그라운드 태스크입니다.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.dialects.mysql import insert
|
|
|
|
from app.dashboard.models import Dashboard
|
|
from app.database.session import BackgroundSessionLocal
|
|
from app.social.models import SocialUpload
|
|
from app.user.models import SocialAccount
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def insert_dashboard(upload_id: int) -> None:
|
|
"""
|
|
Dashboard 레코드 삽입
|
|
|
|
SocialUpload(id=upload_id) 완료 데이터를 DB에서 조회하여 Dashboard에 삽입합니다.
|
|
UniqueConstraint(platform_video_id, platform_user_id) 충돌 시 스킵(INSERT IGNORE).
|
|
"""
|
|
try:
|
|
async with BackgroundSessionLocal() as session:
|
|
result = await session.execute(
|
|
select(
|
|
SocialUpload.user_uuid,
|
|
SocialUpload.platform,
|
|
SocialUpload.platform_video_id,
|
|
SocialUpload.platform_url,
|
|
SocialUpload.title,
|
|
SocialUpload.uploaded_at,
|
|
SocialAccount.platform_user_id,
|
|
)
|
|
.join(SocialAccount, SocialUpload.social_account_id == SocialAccount.id)
|
|
.where(SocialUpload.id == upload_id)
|
|
)
|
|
row = result.one_or_none()
|
|
|
|
if not row:
|
|
logger.warning(f"[dashboard] upload_id={upload_id} 데이터 없음")
|
|
return
|
|
|
|
stmt = (
|
|
insert(Dashboard)
|
|
.values(
|
|
user_uuid=row.user_uuid,
|
|
platform=row.platform,
|
|
platform_user_id=row.platform_user_id,
|
|
platform_video_id=row.platform_video_id,
|
|
platform_url=row.platform_url,
|
|
title=row.title,
|
|
uploaded_at=row.uploaded_at,
|
|
)
|
|
.prefix_with("IGNORE")
|
|
)
|
|
await session.execute(stmt)
|
|
await session.commit()
|
|
|
|
logger.info(
|
|
f"[dashboard] 삽입 완료 - "
|
|
f"upload_id={upload_id}, platform_video_id={row.platform_video_id}"
|
|
)
|
|
except Exception as e:
|
|
logger.error(
|
|
f"[dashboard] 삽입 실패 - upload_id={upload_id}, error={e}"
|
|
)
|