Spaces:
Running
Running
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)
|