142 lines
5.2 KiB
Python
142 lines
5.2 KiB
Python
"""Diaper change log management router."""
|
|
|
|
from typing import Annotated
|
|
from fastapi import APIRouter, HTTPException, Depends
|
|
|
|
from baby_monitor.models.diaper_change import (
|
|
CreateDiaperChangeRequest,
|
|
UpdateDiaperChangeRequest,
|
|
DiaperChangeResponse,
|
|
)
|
|
from baby_monitor.routers.auth import verify_token
|
|
from baby_monitor.repositories.interfaces import (
|
|
DiaperChangeRepositoryInterface,
|
|
ChildRepositoryInterface,
|
|
)
|
|
from baby_monitor.repositories.dependencies import (
|
|
get_diaper_change_repository,
|
|
get_child_repository,
|
|
)
|
|
from baby_monitor.utils.verify_child_access import verify_child_access
|
|
|
|
router = APIRouter(prefix="/api/diaper-changes", tags=["diaper-changes"])
|
|
|
|
|
|
@router.post("", response_model=DiaperChangeResponse, status_code=201)
|
|
def create_diaper_change(
|
|
request: CreateDiaperChangeRequest,
|
|
user_id: Annotated[int, Depends(verify_token)],
|
|
diaper_repo: Annotated[
|
|
DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository)
|
|
],
|
|
child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)],
|
|
) -> DiaperChangeResponse:
|
|
"""Create a new diaper change log entry."""
|
|
# Verify the child belongs to the authenticated user
|
|
verify_child_access(child_repo, request.child_id, user_id)
|
|
|
|
diaper_change = diaper_repo.create(
|
|
child_id=request.child_id,
|
|
change_time=request.change_time,
|
|
poop_amount=request.poop_amount.value if request.poop_amount else None,
|
|
poop_color=request.poop_color.value if request.poop_color else None,
|
|
pee_amount=request.pee_amount.value if request.pee_amount else None,
|
|
pee_color=request.pee_color.value if request.pee_color else None,
|
|
)
|
|
|
|
return DiaperChangeResponse(**diaper_change)
|
|
|
|
|
|
@router.get("", response_model=list[DiaperChangeResponse])
|
|
def get_user_diaper_changes(
|
|
user_id: Annotated[int, Depends(verify_token)],
|
|
diaper_repo: Annotated[
|
|
DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository)
|
|
],
|
|
) -> list[DiaperChangeResponse]:
|
|
"""Get all diaper change logs for the authenticated user's children."""
|
|
diaper_changes = diaper_repo.get_by_user_id(user_id)
|
|
return [DiaperChangeResponse(**dc) for dc in diaper_changes]
|
|
|
|
|
|
@router.get("/{diaper_change_id}", response_model=DiaperChangeResponse)
|
|
def get_diaper_change(
|
|
diaper_change_id: int,
|
|
user_id: Annotated[int, Depends(verify_token)],
|
|
diaper_repo: Annotated[
|
|
DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository)
|
|
],
|
|
child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)],
|
|
) -> DiaperChangeResponse:
|
|
"""Get a specific diaper change log by ID."""
|
|
diaper_change = diaper_repo.get_by_id(diaper_change_id)
|
|
|
|
if not diaper_change:
|
|
raise HTTPException(status_code=404, detail="Diaper change log not found")
|
|
|
|
# Verify the diaper change belongs to user's child
|
|
verify_child_access(child_repo, diaper_change["child_id"], user_id)
|
|
|
|
return DiaperChangeResponse(**diaper_change)
|
|
|
|
|
|
@router.put("/{diaper_change_id}", response_model=DiaperChangeResponse)
|
|
def update_diaper_change(
|
|
diaper_change_id: int,
|
|
request: UpdateDiaperChangeRequest,
|
|
user_id: Annotated[int, Depends(verify_token)],
|
|
diaper_repo: Annotated[
|
|
DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository)
|
|
],
|
|
child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)],
|
|
) -> DiaperChangeResponse:
|
|
"""Update an existing diaper change log."""
|
|
diaper_change = diaper_repo.get_by_id(diaper_change_id)
|
|
|
|
if not diaper_change:
|
|
raise HTTPException(status_code=404, detail="Diaper change log not found")
|
|
|
|
# Verify the diaper change belongs to user's child
|
|
verify_child_access(child_repo, diaper_change["child_id"], user_id)
|
|
|
|
updated = diaper_repo.update(
|
|
diaper_change_id=diaper_change_id,
|
|
change_time=request.change_time,
|
|
poop_amount=request.poop_amount.value if request.poop_amount else None,
|
|
poop_color=request.poop_color.value if request.poop_color else None,
|
|
pee_amount=request.pee_amount.value if request.pee_amount else None,
|
|
pee_color=request.pee_color.value if request.pee_color else None,
|
|
)
|
|
|
|
if not updated:
|
|
raise HTTPException(
|
|
status_code=500, detail="Failed to update diaper change log"
|
|
)
|
|
|
|
return DiaperChangeResponse(**updated)
|
|
|
|
|
|
@router.delete("/{diaper_change_id}", status_code=204)
|
|
def delete_diaper_change(
|
|
diaper_change_id: int,
|
|
user_id: Annotated[int, Depends(verify_token)],
|
|
diaper_repo: Annotated[
|
|
DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository)
|
|
],
|
|
child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)],
|
|
) -> None:
|
|
"""Delete a diaper change log."""
|
|
diaper_change = diaper_repo.get_by_id(diaper_change_id)
|
|
|
|
if not diaper_change:
|
|
raise HTTPException(status_code=404, detail="Diaper change log not found")
|
|
|
|
# Verify the diaper change belongs to user's child
|
|
verify_child_access(child_repo, diaper_change["child_id"], user_id)
|
|
|
|
success = diaper_repo.delete(diaper_change_id)
|
|
if not success:
|
|
raise HTTPException(
|
|
status_code=500, detail="Failed to delete diaper change log"
|
|
)
|