"""HTTP routes for break periods. 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 BreakPeriodServiceDep from app.models.break_period import ( BreakPeriodCreate, BreakPeriodResponse, BreakPeriodUpdate, ) from app.utils.errors import NotFoundError, ValidationError router = APIRouter(prefix="/api/break-periods", tags=["break-periods"]) @router.post("", response_model=BreakPeriodResponse, status_code=status.HTTP_201_CREATED) async def create_break_period( payload: BreakPeriodCreate, service: BreakPeriodServiceDep ) -> BreakPeriodResponse: try: entity = await service.create( workspace_id=payload.workspace_id, name=payload.name, start_date=payload.start_date, end_date=payload.end_date, target_weeks=payload.target_weeks, ) except ValidationError as exc: raise HTTPException(status.HTTP_422_UNPROCESSABLE_ENTITY, str(exc)) from exc return BreakPeriodResponse.from_entity(entity) @router.get("/{break_period_id}", response_model=BreakPeriodResponse) async def get_break_period( break_period_id: UUID, service: BreakPeriodServiceDep ) -> BreakPeriodResponse: try: entity = await service.get(break_period_id) except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc return BreakPeriodResponse.from_entity(entity) @router.get("/workspace/{workspace_id}", response_model=list[BreakPeriodResponse]) async def list_break_periods( workspace_id: UUID, service: BreakPeriodServiceDep ) -> list[BreakPeriodResponse]: entities = await service.list_for_workspace(workspace_id) return [BreakPeriodResponse.from_entity(e) for e in entities] @router.put("/{break_period_id}", response_model=BreakPeriodResponse) async def update_break_period( break_period_id: UUID, payload: BreakPeriodUpdate, service: BreakPeriodServiceDep, ) -> BreakPeriodResponse: try: entity = await service.update( break_period_id=break_period_id, name=payload.name, start_date=payload.start_date, end_date=payload.end_date, target_weeks=payload.target_weeks, ) except ValidationError as exc: raise HTTPException(status.HTTP_422_UNPROCESSABLE_ENTITY, str(exc)) from exc except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc return BreakPeriodResponse.from_entity(entity) @router.delete("/{break_period_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_break_period(break_period_id: UUID, service: BreakPeriodServiceDep) -> None: try: await service.delete(break_period_id) except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc