Coverage for src/lexigram/notification/events.py: 100%

32 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-26 02:26 +0800

1"""Domain events for lexigram-notification — root namespace. 

2 

3Emitted when top-level notification operations complete. Consumed by 

4audit, analytics, and delivery monitoring systems. 

5""" 

6 

7from __future__ import annotations 

8 

9from dataclasses import dataclass 

10 

11from lexigram.contracts.domain.events import DomainEvent 

12 

13__all__ = [ 

14 "EmailBouncedEvent", 

15 "EmailSentEvent", 

16 "InboxMessageCreatedEvent", 

17 "InboxMessageReadEvent", 

18 "NotificationFailedEvent", 

19 "NotificationSentEvent", 

20] 

21 

22 

23# === Existing Notification Events === 

24 

25 

26@dataclass(frozen=True, init=False) 

27class NotificationSentEvent(DomainEvent): 

28 """Emitted when a notification is successfully dispatched. 

29 

30 Consumed by: audit, analytics, delivery tracking. 

31 """ 

32 

33 notification_id: str 

34 channel: str 

35 recipient_id: str 

36 

37 

38@dataclass(frozen=True, init=False) 

39class NotificationFailedEvent(DomainEvent): 

40 """Emitted when a notification dispatch fails permanently. 

41 

42 Consumed by: audit, alerting, retry management. 

43 """ 

44 

45 notification_id: str 

46 channel: str 

47 reason: str 

48 

49 

50# === Mail Events (merged from mail/events.py) === 

51 

52 

53@dataclass(frozen=True, init=False) 

54class EmailSentEvent(DomainEvent): 

55 """Emitted when an email is successfully dispatched to the provider. 

56 

57 Consumed by: audit, analytics, delivery tracking. 

58 """ 

59 

60 message_id: str 

61 recipient: str 

62 template: str | None 

63 

64 

65@dataclass(frozen=True, init=False) 

66class EmailBouncedEvent(DomainEvent): 

67 """Emitted when an email bounces (hard or soft). 

68 

69 Consumed by: bounce management, list hygiene, audit. 

70 """ 

71 

72 message_id: str 

73 recipient: str 

74 bounce_type: str 

75 

76 

77# === Inbox Events (merged from inbox/events.py) === 

78 

79 

80@dataclass(frozen=True, init=False) 

81class InboxMessageCreatedEvent(DomainEvent): 

82 """Emitted when a new message is added to a user's inbox. 

83 

84 Consumed by: audit, analytics, delivery tracking. 

85 """ 

86 

87 message_id: str 

88 user_id: str 

89 

90 

91@dataclass(frozen=True, init=False) 

92class InboxMessageReadEvent(DomainEvent): 

93 """Emitted when a user reads an inbox message. 

94 

95 Consumed by: audit, analytics, engagement tracking. 

96 """ 

97 

98 message_id: str 

99 user_id: str