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

1from collections.abc import Sequence 1ab

2from datetime import datetime 1ab

3from uuid import UUID 1ab

4 

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

13 

14 

15class WebhookEventRepository( 1ab

16 RepositorySoftDeletionIDMixin[WebhookEvent, UUID], 

17 RepositorySoftDeletionMixin[WebhookEvent], 

18 RepositoryBase[WebhookEvent], 

19): 

20 model = WebhookEvent 1ab

21 

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) 

41 

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. 

47 

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) 

58 

59 

60class WebhookDeliveryRepository( 1ab

61 RepositorySoftDeletionIDMixin[WebhookDelivery, UUID], 

62 RepositorySoftDeletionMixin[WebhookDelivery], 

63 RepositoryBase[WebhookDelivery], 

64): 

65 model = WebhookDelivery 1ab

66 

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) 

74 

75 

76class WebhookEndpointRepository( 1ab

77 RepositorySoftDeletionIDMixin[WebhookEndpoint, UUID], 

78 RepositorySoftDeletionMixin[WebhookEndpoint], 

79 RepositoryBase[WebhookEndpoint], 

80): 

81 model = WebhookEndpoint 1ab