hv0905/NekoImageGallery

View on GitHub
app/Controllers/images.py

Summary

Maintainability
A
0 mins
Test Coverage
from typing import Annotated
from uuid import UUID

from fastapi import APIRouter, Depends, Path, HTTPException, Query

from app.Models.api_response.images_api_response import QueryByIdApiResponse, ImageStatus, QueryImagesApiResponse
from app.Models.query_params import FilterParams
from app.Services.authentication import force_access_token_verify
from app.Services.provider import ServiceProvider
from app.Services.vector_db_context import PointNotFoundError
from app.config import config

images_router = APIRouter(dependencies=([Depends(force_access_token_verify)] if config.access_protected else None),
                          tags=["Images"])

services: ServiceProvider | None = None  # The service provider will be injected in the webapp initialize


@images_router.get("/id/{image_id}", description="Query the image info with the given image ID. \n"
                                                 "This can also be used to check the status"
                                                 " of an image in the index queue.")
async def query_image_by_id(image_id: Annotated[UUID, Path(description="The id of the image you want to query.")]):
    try:
        return QueryByIdApiResponse(img=await services.db_context.retrieve_by_id(str(image_id)),
                                    img_status=ImageStatus.MAPPED,
                                    message="Success query the image with the given ID.")
    except PointNotFoundError as ex:
        if services.upload_service and image_id in services.upload_service.uploading_ids:
            return QueryByIdApiResponse(img=None,
                                        img_status=ImageStatus.IN_QUEUE,
                                        message="The image is in the indexing queue.")
        raise HTTPException(404, "Cannot find the image with the given ID.") from ex


@images_router.get("/", description="Query images in order of ID.")
async def scroll_images(filter_param: Annotated[FilterParams, Depends()],
                        prev_offset_id: Annotated[UUID, Query(description="The previous offset image ID.")] = None,
                        count: Annotated[int, Query(ge=1, le=100, description="The number of images to query.")] = 15):
    # validate the offset ID
    if prev_offset_id is not None and len(await services.db_context.validate_ids([str(prev_offset_id)])) == 0:
        raise HTTPException(404, "The previous offset ID is invalid.")
    images, offset = await services.db_context.scroll_points(str(prev_offset_id), count, filter_param=filter_param)
    return QueryImagesApiResponse(images=images, next_page_offset=offset, message="Success query images.")