"""HTTP routes for day overrides. Routers stay thin: validate via Pydantic, call the service, map domain errors to HTTP. """ from uuid import UUID from fastapi import APIRouter, HTTPException, status from app.dependencies import DayOverrideServiceDep, WorkspaceIdDep, WorkspaceScopeDep from app.models.day_override import DayOverrideCreate, DayOverrideResponse from app.utils.errors import NotFoundError, ValidationError router = APIRouter(prefix="/api/day-overrides", tags=["day-overrides"]) @router.post("", response_model=DayOverrideResponse, status_code=status.HTTP_201_CREATED) async def upsert_day_override( payload: DayOverrideCreate, service: DayOverrideServiceDep, scope: WorkspaceScopeDep ) -> DayOverrideResponse: scope.check_workspace(payload.workspace_id) try: entity = await service.upsert( workspace_id=payload.workspace_id, day=payload.date, is_working_day=payload.is_working_day, note=payload.note, ) except ValidationError as exc: raise HTTPException(status.HTTP_422_UNPROCESSABLE_ENTITY, str(exc)) from exc return DayOverrideResponse.from_entity(entity) @router.get("/{day_override_id}", response_model=DayOverrideResponse) async def get_day_override( day_override_id: UUID, service: DayOverrideServiceDep, scope: WorkspaceScopeDep ) -> DayOverrideResponse: try: entity = await service.get(day_override_id, workspace_id=scope.workspace_id) except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc return DayOverrideResponse.from_entity(entity) @router.get("/workspace/{workspace_id}", response_model=list[DayOverrideResponse]) async def list_day_overrides( workspace_id: WorkspaceIdDep, service: DayOverrideServiceDep ) -> list[DayOverrideResponse]: entities = await service.list_for_workspace(workspace_id) return [DayOverrideResponse.from_entity(e) for e in entities] @router.delete("/{day_override_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_day_override( day_override_id: UUID, service: DayOverrideServiceDep, scope: WorkspaceScopeDep ) -> None: try: await service.delete(day_override_id, workspace_id=scope.workspace_id) except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc