"""HTTP routes for vacation days. Routers stay thin: validate via Pydantic, call the service, map domain errors to HTTP. This is the REFERENCE router — copy this shape for other entities. """ from uuid import UUID from fastapi import APIRouter, HTTPException, status from app.dependencies import VacationDaysServiceDep from app.models.vacation_days import VacationDaysCreate, VacationDaysResponse from app.utils.errors import NotFoundError, ValidationError router = APIRouter(prefix="/api/vacation-days", tags=["vacation-days"]) @router.post("", response_model=VacationDaysResponse, status_code=status.HTTP_201_CREATED) async def upsert_vacation_days( payload: VacationDaysCreate, service: VacationDaysServiceDep ) -> VacationDaysResponse: try: entity = await service.upsert( personal_data_uuid=payload.personal_data_uuid, workspace_id=payload.workspace_id, year=payload.year, total_days=payload.total_days, saved_days_in=payload.saved_days_in, ) except ValidationError as exc: raise HTTPException(status.HTTP_422_UNPROCESSABLE_ENTITY, str(exc)) from exc return VacationDaysResponse.from_entity(entity) @router.get("/{vacation_days_id}", response_model=VacationDaysResponse) async def get_vacation_days( vacation_days_id: UUID, service: VacationDaysServiceDep ) -> VacationDaysResponse: try: entity = await service.get(vacation_days_id) except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc return VacationDaysResponse.from_entity(entity) @router.get("/workspace/{workspace_id}", response_model=list[VacationDaysResponse]) async def list_vacation_days( workspace_id: UUID, service: VacationDaysServiceDep ) -> list[VacationDaysResponse]: entities = await service.list_for_workspace(workspace_id) return [VacationDaysResponse.from_entity(e) for e in entities]