repository.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. from typing import Protocol
  2. from app.domains.enrollment.models import (
  3. AsyncTask,
  4. EnrollmentDraft,
  5. EnrollmentOrder,
  6. OutboxEvent,
  7. PaymentTransaction,
  8. Policy,
  9. Quote,
  10. UserConfirmation,
  11. )
  12. class EnrollmentRepository(Protocol):
  13. def save_quote(self, quote: Quote) -> None: ...
  14. def get_quote(self, quote_id: str) -> Quote | None: ...
  15. def save_draft(self, draft: EnrollmentDraft) -> None: ...
  16. def get_draft(self, draft_id: str) -> EnrollmentDraft | None: ...
  17. def save_confirmation(self, confirmation: UserConfirmation) -> None: ...
  18. def get_confirmation_by_token_hash(self, token_hash: str) -> UserConfirmation | None: ...
  19. def save_order(self, order: EnrollmentOrder) -> None: ...
  20. def get_order(self, order_id: str) -> EnrollmentOrder | None: ...
  21. def find_order_by_idempotency(
  22. self, user_id: str, idempotency_key: str
  23. ) -> EnrollmentOrder | None: ...
  24. def list_orders(self, user_id: str | None = None) -> list[EnrollmentOrder]: ...
  25. def save_payment(self, payment: PaymentTransaction) -> None: ...
  26. def get_payment(self, payment_id: str) -> PaymentTransaction | None: ...
  27. def get_payment_by_no(self, payment_no: str) -> PaymentTransaction | None: ...
  28. def get_payment_by_order(self, order_id: str) -> PaymentTransaction | None: ...
  29. def find_payment_by_idempotency(
  30. self, order_id: str, idempotency_key: str
  31. ) -> PaymentTransaction | None: ...
  32. def save_policy(self, policy: Policy) -> None: ...
  33. def get_policy_by_order(self, order_id: str) -> Policy | None: ...
  34. def list_policies(self, user_id: str | None = None) -> list[Policy]: ...
  35. def save_outbox_event(self, event: OutboxEvent) -> None: ...
  36. def save_task(self, task: AsyncTask) -> None: ...
  37. def get_task_by_idempotency(self, idempotency_key: str) -> AsyncTask | None: ...
  38. class InMemoryEnrollmentRepository:
  39. def __init__(self) -> None:
  40. self._quotes: dict[str, Quote] = {}
  41. self._drafts: dict[str, EnrollmentDraft] = {}
  42. self._confirmations: dict[str, UserConfirmation] = {}
  43. self._orders: dict[str, EnrollmentOrder] = {}
  44. self._payments: dict[str, PaymentTransaction] = {}
  45. self._policies: dict[str, Policy] = {}
  46. self._outbox_events: dict[str, OutboxEvent] = {}
  47. self._tasks: dict[str, AsyncTask] = {}
  48. def save_quote(self, quote: Quote) -> None:
  49. self._quotes[quote.id] = quote
  50. def get_quote(self, quote_id: str) -> Quote | None:
  51. return self._quotes.get(quote_id)
  52. def save_draft(self, draft: EnrollmentDraft) -> None:
  53. self._drafts[draft.id] = draft
  54. def get_draft(self, draft_id: str) -> EnrollmentDraft | None:
  55. return self._drafts.get(draft_id)
  56. def save_confirmation(self, confirmation: UserConfirmation) -> None:
  57. self._confirmations[confirmation.id] = confirmation
  58. def get_confirmation_by_token_hash(self, token_hash: str) -> UserConfirmation | None:
  59. return next(
  60. (
  61. confirmation
  62. for confirmation in self._confirmations.values()
  63. if confirmation.token_hash == token_hash
  64. ),
  65. None,
  66. )
  67. def save_order(self, order: EnrollmentOrder) -> None:
  68. self._orders[order.id] = order
  69. def get_order(self, order_id: str) -> EnrollmentOrder | None:
  70. return self._orders.get(order_id)
  71. def find_order_by_idempotency(
  72. self, user_id: str, idempotency_key: str
  73. ) -> EnrollmentOrder | None:
  74. return next(
  75. (
  76. order
  77. for order in self._orders.values()
  78. if order.user_id == user_id and order.idempotency_key == idempotency_key
  79. ),
  80. None,
  81. )
  82. def list_orders(self, user_id: str | None = None) -> list[EnrollmentOrder]:
  83. return [
  84. order for order in self._orders.values() if user_id is None or order.user_id == user_id
  85. ]
  86. def save_payment(self, payment: PaymentTransaction) -> None:
  87. self._payments[payment.id] = payment
  88. def get_payment(self, payment_id: str) -> PaymentTransaction | None:
  89. return self._payments.get(payment_id)
  90. def get_payment_by_no(self, payment_no: str) -> PaymentTransaction | None:
  91. return next(
  92. (payment for payment in self._payments.values() if payment.payment_no == payment_no),
  93. None,
  94. )
  95. def get_payment_by_order(self, order_id: str) -> PaymentTransaction | None:
  96. return next(
  97. (payment for payment in self._payments.values() if payment.order_id == order_id),
  98. None,
  99. )
  100. def find_payment_by_idempotency(
  101. self, order_id: str, idempotency_key: str
  102. ) -> PaymentTransaction | None:
  103. return next(
  104. (
  105. payment
  106. for payment in self._payments.values()
  107. if payment.order_id == order_id and payment.idempotency_key == idempotency_key
  108. ),
  109. None,
  110. )
  111. def save_policy(self, policy: Policy) -> None:
  112. self._policies[policy.id] = policy
  113. def get_policy_by_order(self, order_id: str) -> Policy | None:
  114. return next(
  115. (policy for policy in self._policies.values() if policy.order_id == order_id),
  116. None,
  117. )
  118. def list_policies(self, user_id: str | None = None) -> list[Policy]:
  119. return [
  120. policy
  121. for policy in self._policies.values()
  122. if user_id is None or policy.user_id == user_id
  123. ]
  124. def save_outbox_event(self, event: OutboxEvent) -> None:
  125. self._outbox_events[event.id] = event
  126. def save_task(self, task: AsyncTask) -> None:
  127. self._tasks[task.id] = task
  128. def get_task_by_idempotency(self, idempotency_key: str) -> AsyncTask | None:
  129. return next(
  130. (task for task in self._tasks.values() if task.idempotency_key == idempotency_key),
  131. None,
  132. )