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

68 lines
2.2 KiB
Python

"""Business logic for break periods (family home-together windows)."""
from datetime import datetime
from uuid import UUID, uuid4
from app.entities.break_period import BreakPeriod
from app.repositories.break_period_repository import BreakPeriodRepository
from app.utils.errors import NotFoundError, ValidationError
class BreakPeriodService:
def __init__(self, repo: BreakPeriodRepository) -> None:
self._repo = repo
async def create(
self,
workspace_id: UUID,
name: str,
start_date: object,
end_date: object,
target_weeks: int,
) -> BreakPeriod:
if end_date < start_date:
raise ValidationError("end_date must be on or after start_date")
now = datetime.now()
entity = BreakPeriod(
id=uuid4(),
workspace_id=workspace_id,
name=name,
start_date=start_date,
end_date=end_date,
target_weeks=target_weeks,
created_at=now,
updated_at=now,
)
return await self._repo.create(entity)
async def get(self, break_period_id: UUID) -> BreakPeriod:
entity = await self._repo.get_by_id(break_period_id)
if entity is None:
raise NotFoundError(f"BreakPeriod {break_period_id} not found")
return entity
async def list_for_workspace(self, workspace_id: UUID) -> list[BreakPeriod]:
return await self._repo.get_by_workspace(workspace_id)
async def update(
self,
break_period_id: UUID,
name: str,
start_date: object,
end_date: object,
target_weeks: int,
) -> BreakPeriod:
entity = await self.get(break_period_id)
if end_date < start_date:
raise ValidationError("end_date must be on or after start_date")
entity.name = name
entity.start_date = start_date
entity.end_date = end_date
entity.target_weeks = target_weeks
entity.updated_at = datetime.now()
return await self._repo.update(break_period_id, entity)
async def delete(self, break_period_id: UUID) -> None:
await self.get(break_period_id) # raises NotFoundError if missing
await self._repo.delete(break_period_id)