| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | # (c) Nelen & Schuurmansfrom abc import abstractmethodfrom abc import abstractpropertyfrom datetime import datetimefrom 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 Gatewayfrom clean_python.base.domain import Idfrom clean_python.base.domain import Jsonfrom clean_python.base.domain import PageOptionsfrom clean_python.base.domain import RootEntity__all__ = ["InternalGateway"]T = TypeVar("T", bound=RootEntity)  # Externalclass InternalGateway(Gateway, Generic[T]):    @abstractproperty    def manage(self) -> Manage[T]:        raise NotImplementedError()    @abstractmethod    def to_internal(self, obj: T) -> Json:        raise NotImplementedError()    def to_external(self, values: Json) -> Json:        return values    async def filter(        self, filters: List[Filter], params: Optional[PageOptions] = None    ) -> List[Json]:        page = await self.manage.filter(filters, params)        return [self.to_internal(x) for x in page.items]    async def add(self, item: Json) -> Json:        try:            created = await self.manage.create(self.to_external(item))        except BadRequest as e:            raise ValueError(e)        return self.to_internal(created)    async def remove(self, id: 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, item: Json, if_unmodified_since: Optional[datetime] = None    ) -> Json:        assert if_unmodified_since is None  # unsupported        values = self.to_external(item)        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.to_internal(updated)
 |