Files
F-r-ldraledigplannerare/backend/app/services/child_service.py
T
2026-06-01 16:48:21 +02:00

78 lines
2.4 KiB
Python

"""Business logic for child management."""
from datetime import datetime
from uuid import UUID, uuid4
from app.entities.child import Child
from app.repositories.child_repository import ChildRepository
from app.utils.errors import NotFoundError, ValidationError
class ChildService:
def __init__(self, repo: ChildRepository) -> None:
self._repo = repo
async def create(
self,
workspace_id: UUID,
name: str,
birth_date,
preschool_start_date=None,
) -> Child:
"""Create a new child."""
if preschool_start_date is not None and preschool_start_date <= birth_date:
raise ValidationError("preschool_start_date must be after birth_date")
now = datetime.now()
entity = Child(
id=uuid4(),
workspace_id=workspace_id,
name=name,
birth_date=birth_date,
preschool_start_date=preschool_start_date,
created_at=now,
)
return await self._repo.create(entity)
async def get(self, child_id: UUID) -> Child:
"""Get a child by ID."""
entity = await self._repo.get_by_id(child_id)
if entity is None:
raise NotFoundError(f"Child {child_id} not found")
return entity
async def list_by_workspace(self, workspace_id: UUID) -> list[Child]:
"""Get all children in a workspace."""
return await self._repo.list_by_workspace(workspace_id)
async def update(
self,
child_id: UUID,
name: str | None = None,
birth_date=None,
preschool_start_date=None,
) -> Child:
"""Update a child (partial update)."""
entity = await self.get(child_id)
if name is not None:
entity.name = name
if birth_date is not None:
entity.birth_date = birth_date
if preschool_start_date is not None:
entity.preschool_start_date = preschool_start_date
# Validate after all updates
if (
entity.preschool_start_date is not None
and entity.preschool_start_date <= entity.birth_date
):
raise ValidationError("preschool_start_date must be after birth_date")
return await self._repo.update(child_id, entity)
async def delete(self, child_id: UUID) -> None:
"""Delete a child."""
await self.get(child_id) # raises NotFoundError if missing
await self._repo.delete(child_id)