| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | # (c) Nelen & Schuurmansfrom abc import abstractmethodfrom abc import abstractpropertyfrom typing import Genericfrom typing import Listfrom typing import Optionalfrom typing import TypeVarfrom clean_python.base.application.manage import Managefrom clean_python.base.domain import BadRequestfrom clean_python.base.domain import DoesNotExistfrom clean_python.base.domain import Filterfrom clean_python.base.domain import Jsonfrom clean_python.base.domain import PageOptionsfrom clean_python.base.domain import RootEntityfrom clean_python.base.domain import ValueObject__all__ = ["InternalGateway"]E = TypeVar("E", bound=RootEntity)  # ExternalT = TypeVar("T", bound=ValueObject)  # Internal# don't subclass Gateway; Gateway makes Json objectsclass InternalGateway(Generic[E, T]):    @abstractproperty    def manage(self) -> Manage[E]:        raise NotImplementedError()    @abstractmethod    def _map(self, obj: E) -> T:        raise NotImplementedError()    async def get(self, id: int) -> Optional[T]:        try:            result = await self.manage.retrieve(id)        except DoesNotExist:            return None        else:            return self._map(result)    async def filter(        self, filters: List[Filter], params: Optional[PageOptions] = None    ) -> List[T]:        page = await self.manage.filter(filters, params)        return [self._map(x) for x in page.items]    async def add(self, item: T) -> T:        try:            created = await self.manage.create(item.model_dump())        except BadRequest as e:            raise ValueError(e)        return self._map(created)    async def remove(self, id) -> bool:        return await self.manage.destroy(id)    async def count(self, filters: List[Filter]) -> int:        return await self.manage.count(filters)    async def exists(self, filters: List[Filter]) -> bool:        return await self.manage.exists(filters)    async def update(self, values: Json) -> T:        values = values.copy()        id_ = values.pop("id", None)        if id_ is None:            raise DoesNotExist("item", id_)        try:            updated = await self.manage.update(id_, values)        except BadRequest as e:            raise ValueError(e)        return self._map(updated)
 |