Coverage for polar/webhook/repository.py: 62%
24 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-12-05 16:17 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-12-05 16:17 +0000
1from collections.abc import Sequence 1ab
2from datetime import datetime 1ab
3from uuid import UUID 1ab
5from polar.kit.repository import ( 1ab
6 RepositoryBase,
7 RepositorySoftDeletionIDMixin,
8 RepositorySoftDeletionMixin,
9)
10from polar.models.webhook_delivery import WebhookDelivery 1ab
11from polar.models.webhook_endpoint import WebhookEndpoint 1ab
12from polar.models.webhook_event import WebhookEvent 1ab
15class WebhookEventRepository( 1ab
16 RepositorySoftDeletionIDMixin[WebhookEvent, UUID],
17 RepositorySoftDeletionMixin[WebhookEvent],
18 RepositoryBase[WebhookEvent],
19):
20 model = WebhookEvent 1ab
22 async def get_all_undelivered( 1ab
23 self, older_than: datetime | None = None
24 ) -> Sequence[WebhookEvent]:
25 statement = (
26 self.get_base_statement()
27 .join(
28 WebhookDelivery,
29 WebhookDelivery.webhook_event_id == WebhookEvent.id,
30 isouter=True,
31 )
32 .where(
33 WebhookDelivery.id.is_(None),
34 WebhookEvent.payload.is_not(None),
35 WebhookEvent.skipped.is_(False),
36 )
37 )
38 if older_than is not None:
39 statement = statement.where(WebhookEvent.created_at < older_than)
40 return await self.get_all(statement)
42 async def get_recent_by_endpoint( 1ab
43 self, endpoint_id: UUID, *, limit: int
44 ) -> Sequence[WebhookEvent]:
45 """
46 Get recent events for an endpoint.
48 Returns a list of WebhookEvent objects ordered by
49 created_at descending (most recent first).
50 """
51 statement = (
52 self.get_base_statement()
53 .where(WebhookEvent.webhook_endpoint_id == endpoint_id)
54 .order_by(WebhookEvent.created_at.desc())
55 .limit(limit)
56 )
57 return await self.get_all(statement)
60class WebhookDeliveryRepository( 1ab
61 RepositorySoftDeletionIDMixin[WebhookDelivery, UUID],
62 RepositorySoftDeletionMixin[WebhookDelivery],
63 RepositoryBase[WebhookDelivery],
64):
65 model = WebhookDelivery 1ab
67 async def get_all_by_event(self, event: UUID) -> Sequence[WebhookDelivery]: 1ab
68 statement = (
69 self.get_base_statement()
70 .where(WebhookDelivery.webhook_event_id == event)
71 .order_by(WebhookDelivery.created_at.asc())
72 )
73 return await self.get_all(statement)
76class WebhookEndpointRepository( 1ab
77 RepositorySoftDeletionIDMixin[WebhookEndpoint, UUID],
78 RepositorySoftDeletionMixin[WebhookEndpoint],
79 RepositoryBase[WebhookEndpoint],
80):
81 model = WebhookEndpoint 1ab