File size: 2,841 Bytes
1061354
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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()
            }
        )