File size: 3,789 Bytes
238c51b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
"""
Image Listing Router
Handles listing, pagination, and filtering of images
"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from typing import List, Optional
import logging

from .. import crud, schemas, database
from ..utils.image_utils import convert_image_to_dict

logger = logging.getLogger(__name__)
router = APIRouter()

def get_db():
    db = database.SessionLocal()
    try:
        yield db
    finally:
        db.close()

@router.get("/", response_model=List[schemas.ImageOut])
def list_images(db: Session = Depends(get_db)):
    """Get all images with their caption data"""
    logger.debug("Listing all images")
    images = crud.get_images(db)
    result = []
    for img in images:
        img_dict = convert_image_to_dict(img, f"/api/images/{img.image_id}/file")
        result.append(schemas.ImageOut(**img_dict))
    
    logger.info(f"Returned {len(result)} images")
    return result

@router.get("/grouped", response_model=List[schemas.ImageOut])
def list_images_grouped(
    page: int = Query(1, ge=1),
    limit: int = Query(10, ge=1, le=100),
    search: str = Query(None),
    source: str = Query(None),
    event_type: str = Query(None),
    region: str = Query(None),
    country: str = Query(None),
    image_type: str = Query(None),
    db: Session = Depends(get_db)
):
    """Get paginated and filtered images"""
    logger.debug(f"Listing grouped images - page: {page}, limit: {limit}")
    
    # Build filter parameters
    filters = {}
    if search:
        filters['search'] = search
    if source:
        filters['source'] = source
    if event_type:
        filters['event_type'] = event_type
    if region:
        filters['region'] = region
    if country:
        filters['country'] = country
    if image_type:
        filters['image_type'] = image_type
    
    logger.debug(f"Applied filters: {filters}")
    
    # Get paginated results
    images = crud.get_images_paginated(
        db, 
        page=page, 
        limit=limit, 
        **filters
    )
    
    result = []
    for img in images:
        img_dict = convert_image_to_dict(img, f"/api/images/{img.image_id}/file")
        result.append(schemas.ImageOut(**img_dict))
    
    logger.info(f"Returned {len(result)} images for page {page}")
    return result

@router.get("/grouped/count")
def get_images_grouped_count(
    search: str = Query(None),
    source: str = Query(None),
    event_type: str = Query(None),
    region: str = Query(None),
    country: str = Query(None),
    image_type: str = Query(None),
    db: Session = Depends(get_db)
):
    """Get total count of images matching filters"""
    logger.debug("Getting images count")
    
    # Build filter parameters
    filters = {}
    if search:
        filters['search'] = search
    if source:
        filters['source'] = source
    if event_type:
        filters['event_type'] = event_type
    if region:
        filters['region'] = region
    if country:
        filters['country'] = country
    if image_type:
        filters['image_type'] = image_type
    
    count = crud.get_images_count(db, **filters)
    logger.info(f"Total images count: {count}")
    return {"count": count}

@router.get("/{image_id}", response_model=schemas.ImageOut)
def get_image(image_id: str, db: Session = Depends(get_db)):
    """Get a specific image by ID"""
    logger.debug(f"Getting image: {image_id}")
    
    img = crud.get_image(db, image_id)
    if not img:
        logger.warning(f"Image not found: {image_id}")
        from fastapi import HTTPException
        raise HTTPException(404, "Image not found")
    
    img_dict = convert_image_to_dict(img, f"/api/images/{img.image_id}/file")
    logger.info(f"Returned image: {image_id}")
    return schemas.ImageOut(**img_dict)