111 lines
3.5 KiB
Python
111 lines
3.5 KiB
Python
from typing import Literal
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database.session import get_db
|
|
from app.domain.entities.lens import LensEntity
|
|
from app.domain.entities.responses.paginated_lens import PaginatedLensesResponseEntity
|
|
from app.infrastructure.dependencies import get_current_user
|
|
from app.infrastructure.lenses_service import LensesService
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get(
|
|
"/",
|
|
response_model=PaginatedLensesResponseEntity,
|
|
summary="Get all lenses with pagination and filtering",
|
|
description="Returns a paginated list of lenses with optional search, sorting, and advanced filtering",
|
|
)
|
|
async def get_all_lenses(
|
|
page: int = Query(1, ge=1, description="Page number"),
|
|
page_size: int = Query(10, ge=1, le=100, description="Number of lenses per page"),
|
|
search: str = Query(None, description="Search term for filtering lenses"),
|
|
sort_order: Literal["asc", "desc"] = Query("desc", description="Sort order by id (asc or desc)"),
|
|
tor: float = Query(None, description="Filter by tor"),
|
|
diameter: float = Query(None, description="Filter by diameter"),
|
|
preset_refraction: float = Query(None, description="Filter by preset refraction"),
|
|
periphery_toricity: float = Query(None, description="Filter by periphery toricity"),
|
|
side: Literal["левая", "правая", "all"] = Query("all", description="Filter by side"),
|
|
issued: bool = Query(None, description="Filter by issued status"),
|
|
trial: float = Query(None, description="Filter by trial"),
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user),
|
|
):
|
|
lenses_service = LensesService(db)
|
|
lenses, total_count = await lenses_service.get_all_lenses(
|
|
page=page,
|
|
page_size=page_size,
|
|
search=search,
|
|
sort_order=sort_order,
|
|
tor=tor,
|
|
diameter=diameter,
|
|
preset_refraction=preset_refraction,
|
|
periphery_toricity=periphery_toricity,
|
|
side=side,
|
|
issued=issued,
|
|
trial=trial,
|
|
)
|
|
return {"lenses": lenses, "total_count": total_count}
|
|
|
|
|
|
@router.get(
|
|
"/not_issued/",
|
|
response_model=list[LensEntity],
|
|
summary="Get all not issued lenses",
|
|
description="Returns a list of all not issued lenses",
|
|
)
|
|
async def get_all_not_issued_lenses(
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user),
|
|
):
|
|
lenses_service = LensesService(db)
|
|
return await lenses_service.get_all_not_issued_lenses()
|
|
|
|
|
|
@router.post(
|
|
"/",
|
|
response_model=LensEntity,
|
|
summary="Create lens",
|
|
description="Creates a new lens",
|
|
)
|
|
async def create_lens(
|
|
lens: LensEntity,
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user),
|
|
):
|
|
lenses_service = LensesService(db)
|
|
return await lenses_service.create_lens(lens)
|
|
|
|
|
|
@router.put(
|
|
"/{lens_id}/",
|
|
response_model=LensEntity,
|
|
summary="Update lens",
|
|
description="Updates an existing lens",
|
|
)
|
|
async def update_lens(
|
|
lens_id: int,
|
|
lens: LensEntity,
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user),
|
|
):
|
|
lenses_service = LensesService(db)
|
|
return await lenses_service.update_lens(lens_id, lens)
|
|
|
|
|
|
@router.delete(
|
|
"/{lens_id}/",
|
|
response_model=LensEntity,
|
|
summary="Delete lens",
|
|
description="Deletes an existing lens",
|
|
)
|
|
async def delete_lens(
|
|
lens_id: int,
|
|
db: AsyncSession = Depends(get_db),
|
|
user=Depends(get_current_user),
|
|
):
|
|
lenses_service = LensesService(db)
|
|
return await lenses_service.delete_lens(lens_id)
|