api-ad-generator / src /api /v1 /ad_routers.py
fahmiaziz98
init
1061354
import json
from loguru import logger
from typing import Annotated
from fastapi import (
APIRouter,
HTTPException,
Depends
)
from fastapi.responses import StreamingResponse
from src.models import AdGenerationRequest, AdGenerationResponse
from src.service.ad_service import get_ad_service, AdService
from src.utils.helpers import generate_request_id
from src.config import settings
router = APIRouter(prefix=settings.API_V1_PREFIX, tags=["Advertisement Generation"])
@router.post(
"/generate",
response_model=AdGenerationResponse,
summary="Generate Advertisement",
description="Generate advertisement with optional image processing"
)
async def generate_ad(
request: AdGenerationRequest,
ad_service: Annotated[AdService, Depends(get_ad_service)],
):
"""
Generate advertisement content based on the provided request.
Parameters:
- request: AdGenerationRequest containing product details and ad settings.
Returns:
- AdGenerationResponse with generated ad content and metadata.
"""
try:
response = await ad_service.generate_ad(request)
return response
except HTTPException:
raise
except Exception as e:
raise HTTPException(
status_code=500,
detail={
"error": "generation_failed",
"message": str(e),
"request_id": generate_request_id()
}
)
@router.post(
"/generate-stream",
summary="Generate Advertisement (Streaming)",
description="Generate advertisement with streaming response"
)
async def generate_ad_streaming(
request: AdGenerationRequest,
ad_service: Annotated[AdService, Depends(get_ad_service)],
):
"""
Generate advertisement content with streaming response.
Parameters:
- request: AdGenerationRequest containing product details and ad settings.
Returns:
- StreamingResponse with chunks of generated ad content.
"""
async def stream_response():
try:
async for chunk in ad_service.generate_ad_streaming(request):
yield json.dumps(chunk, default=str) + "\n"
except Exception as e:
logger.info(e)
error_response = {
"status": "error",
"error_code": "generation_failed",
"message": str(e),
"request_id": generate_request_id()
}
yield json.dumps(error_response) + "\n"
return StreamingResponse(
stream_response(),
media_type="text/plain",
headers={
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"X-Accel-Buffering": "no" # Disable nginx buffering
}
)