api-ad-generator / src /api /v1 /imagen_router.py
fahmiaziz98
init
1061354
from loguru import logger
from pathlib import Path
from typing import Annotated
from fastapi import (
APIRouter,
HTTPException,
Depends
)
from fastapi.responses import FileResponse
from src.models.requests import ImageGenerationRequest
from src.models.response import ImageResult
from src.service.imagen_service import get_imagen_service, ImageService
from src.config import settings
from src.utils.helpers import generate_request_id
router = APIRouter(prefix=settings.API_V1_PREFIX, tags=["Image Generation"])
@router.post(
"/generate-image",
response_model=ImageResult,
summary="Generate Image",
description="Generate an image based on product details"
)
async def generate_image(
request: ImageGenerationRequest,
imagen_service: Annotated[ImageService, Depends(get_imagen_service)],
):
"""
Generate an image based on the provided product details.
Parameters:
- request: ImageGenerationRequest containing product details.
Returns:
- ImageResult with generated image URL and metadata.
"""
try:
result = imagen_service.generate_image(request)
if result is None:
raise HTTPException(status_code=500, detail="Image generation failed")
return result
except HTTPException:
raise
except Exception as e:
raise HTTPException(
status_code=500,
detail={
"error": "image_generation_failed",
"message": str(e),
"request_id": generate_request_id()
}
)
from pathlib import Path
@router.get(
"/images/{file_name}",
summary="Get Image",
description="Retrieve an image by its file name"
)
async def get_image(file_name: str):
"""
Retrieve an image by its file name.
Parameters:
- file_name: Name of the image file to retrieve.
Returns:
- Image file if found, otherwise raises HTTP 404 error.
"""
logger.info(f"Retrieving image: {file_name}")
try:
upload_dir = Path(settings.UPLOAD_DIR)
file_path = upload_dir / file_name
if not file_path.exists():
logger.warning(f"Image not found: {file_name}")
raise HTTPException(status_code=404, detail="Image not found")
logger.info(f"Image retrieved successfully: {file_name}")
return FileResponse(
path=file_path,
media_type="image/png",
filename=file_name
)
except Exception as e:
logger.critical(f"Critical error during image retrieval: {e}")
raise HTTPException(
status_code=500,
detail={
"error": "image_retrieval_failed",
"message": str(e),
"request_id": generate_request_id()
}
)