added functionality to log diaper changes
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
"""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.diaper_change.sqlite_diaper_change import (
|
||||
SQLiteDiaperChangeRepository,
|
||||
)
|
||||
from baby_monitor.repositories.dependencies.get_diaper_change_repository import ( # noqa: E501
|
||||
get_diaper_change_repository,
|
||||
)
|
||||
from baby_monitor.repositories.child.sqlite_child import SQLiteChildRepository
|
||||
from baby_monitor.repositories.dependencies.get_child_repository import (
|
||||
get_child_repository,
|
||||
)
|
||||
|
||||
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[
|
||||
SQLiteDiaperChangeRepository, Depends(get_diaper_change_repository)
|
||||
],
|
||||
child_repo: Annotated[SQLiteChildRepository, Depends(get_child_repository)],
|
||||
) -> DiaperChangeResponse:
|
||||
"""Create a new diaper change log entry."""
|
||||
# Verify the child belongs to the authenticated user
|
||||
child = child_repo.get_by_id(request.child_id)
|
||||
if not child:
|
||||
raise HTTPException(status_code=404, detail="Child not found")
|
||||
|
||||
if child["user_id"] != user_id:
|
||||
raise HTTPException(status_code=403, detail="Access denied to this child")
|
||||
|
||||
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[
|
||||
SQLiteDiaperChangeRepository, 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[
|
||||
SQLiteDiaperChangeRepository, Depends(get_diaper_change_repository)
|
||||
],
|
||||
child_repo: Annotated[SQLiteChildRepository, 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
|
||||
child = child_repo.get_by_id(diaper_change["child_id"])
|
||||
if not child or child["user_id"] != user_id:
|
||||
raise HTTPException(status_code=403, detail="Access denied")
|
||||
|
||||
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[
|
||||
SQLiteDiaperChangeRepository, Depends(get_diaper_change_repository)
|
||||
],
|
||||
child_repo: Annotated[SQLiteChildRepository, 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
|
||||
child = child_repo.get_by_id(diaper_change["child_id"])
|
||||
if not child or child["user_id"] != user_id:
|
||||
raise HTTPException(status_code=403, detail="Access denied")
|
||||
|
||||
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[
|
||||
SQLiteDiaperChangeRepository, Depends(get_diaper_change_repository)
|
||||
],
|
||||
child_repo: Annotated[SQLiteChildRepository, 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
|
||||
child = child_repo.get_by_id(diaper_change["child_id"])
|
||||
if not child or child["user_id"] != user_id:
|
||||
raise HTTPException(status_code=403, detail="Access denied")
|
||||
|
||||
success = diaper_repo.delete(diaper_change_id)
|
||||
if not success:
|
||||
raise HTTPException(
|
||||
status_code=500, detail="Failed to delete diaper change log"
|
||||
)
|
||||
Reference in New Issue
Block a user