Coverage for arclith / application / services / base_service.py: 100%

30 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-25 15:02 +0100

1from typing import Generic, Optional, TypeVar 

2from uuid6 import UUID 

3 

4from arclith.domain.models.entity import Entity 

5from arclith.domain.ports.logger import Logger 

6from arclith.domain.ports.repository import Repository 

7from arclith.application.use_cases import ( 

8 CreateUseCase, 

9 ReadUseCase, 

10 UpdateUseCase, 

11 DeleteUseCase, 

12 FindAllUseCase, 

13 DuplicateUseCase, 

14 PurgeUseCase, 

15) 

16 

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

18 

19 

20class BaseService(Generic[T]): 

21 def __init__(self, repository: Repository[T], logger: Logger, retention_days: float | None = None) -> None: 

22 self._create = CreateUseCase(repository, logger) 

23 self._read = ReadUseCase(repository, logger) 

24 self._update = UpdateUseCase(repository, logger) 

25 self._delete = DeleteUseCase(repository, logger, retention_days) 

26 self._find_all = FindAllUseCase(repository, logger) 

27 self._duplicate = DuplicateUseCase(repository, logger) 

28 self._purge = PurgeUseCase(repository, logger, retention_days) 

29 

30 async def create(self, entity: T) -> T: 

31 return await self._create.execute(entity) 

32 

33 async def read(self, uuid: UUID) -> Optional[T]: 

34 return await self._read.execute(uuid) 

35 

36 async def update(self, entity: T) -> T: 

37 return await self._update.execute(entity) 

38 

39 async def delete(self, uuid: UUID, deleted_by: str | None = None) -> None: 

40 await self._delete.execute(uuid, deleted_by) 

41 

42 async def find_all(self) -> list[T]: 

43 return await self._find_all.execute() 

44 

45 async def duplicate(self, uuid: UUID) -> T: 

46 return await self._duplicate.execute(uuid) 

47 

48 async def purge(self) -> int: 

49 return await self._purge.execute()