Coverage for arclith / application / use_cases / delete.py: 100%
26 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 15:02 +0100
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 15:02 +0100
1from datetime import datetime, timezone
2from typing import Generic, TypeVar
3from uuid6 import UUID
5from arclith.domain.models.entity import Entity
6from arclith.domain.ports.logger import Logger
7from arclith.domain.ports.repository import Repository
9T = TypeVar("T", bound=Entity)
12class DeleteUseCase(Generic[T]):
13 def __init__(self, repository: Repository[T], logger: Logger, retention_days: float | None = None) -> None:
14 self._repository = repository
15 self._logger = logger
16 self._retention_days = retention_days
18 async def execute(self, uuid: UUID, deleted_by: str | None = None) -> None:
19 if self._retention_days == 0:
20 self._logger.info("🗑️ Hard deleting entity", uuid=str(uuid))
21 await self._repository.delete(uuid)
22 self._logger.info("✅ Entity hard deleted", uuid=str(uuid))
23 return
25 entity = await self._repository.read(uuid)
26 if entity is None:
27 self._logger.warning("⚠️ Entity not found for deletion", uuid=str(uuid))
28 return
30 now = datetime.now(timezone.utc)
31 entity = entity.model_copy(update={"deleted_at": now, "deleted_by": deleted_by, "updated_at": now})
32 await self._repository.update(entity)
33 self._logger.info("🗑️ Entity soft deleted", uuid=str(uuid), retention_days=self._retention_days)