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

1from datetime import datetime, timezone 

2from typing import Generic, TypeVar 

3from uuid6 import UUID 

4 

5from arclith.domain.models.entity import Entity 

6from arclith.domain.ports.logger import Logger 

7from arclith.domain.ports.repository import Repository 

8 

9T = TypeVar("T", bound=Entity) 

10 

11 

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 

17 

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 

24 

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 

29 

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) 

34