gateway.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # (c) Nelen & Schuurmans
  2. from abc import ABC
  3. from datetime import datetime
  4. from typing import Callable
  5. from typing import List
  6. from typing import Optional
  7. from .exceptions import DoesNotExist
  8. from .filter import Filter
  9. from .json import Json
  10. from .pagination import PageOptions
  11. __all__ = ["Gateway"]
  12. class Gateway(ABC):
  13. async def filter(
  14. self, filters: List[Filter], params: Optional[PageOptions] = None
  15. ) -> List[Json]:
  16. raise NotImplementedError()
  17. async def count(self, filters: List[Filter]) -> int:
  18. return len(await self.filter(filters, params=None))
  19. async def exists(self, filters: List[Filter]) -> bool:
  20. return len(await self.filter(filters, params=PageOptions(limit=1))) > 0
  21. async def get(self, id: int) -> Optional[Json]:
  22. result = await self.filter([Filter(field="id", values=[id])], params=None)
  23. return result[0] if result else None
  24. async def add(self, item: Json) -> Json:
  25. raise NotImplementedError()
  26. async def update(
  27. self, item: Json, if_unmodified_since: Optional[datetime] = None
  28. ) -> Json:
  29. raise NotImplementedError()
  30. async def update_transactional(self, id: int, func: Callable[[Json], Json]) -> Json:
  31. existing = await self.get(id)
  32. if existing is None:
  33. raise DoesNotExist("record", id)
  34. return await self.update(
  35. func(existing), if_unmodified_since=existing["updated_at"]
  36. )
  37. async def upsert(self, item: Json) -> Json:
  38. try:
  39. return await self.update(item)
  40. except DoesNotExist:
  41. return await self.add(item)
  42. async def remove(self, id: int) -> bool:
  43. raise NotImplementedError()