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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-26 02:26 +0800
1"""Domain events for lexigram-notification — root namespace.
3Emitted when top-level notification operations complete. Consumed by
4audit, analytics, and delivery monitoring systems.
5"""
7from __future__ import annotations
9from dataclasses import dataclass
11from lexigram.contracts.domain.events import DomainEvent
13__all__ = [
14 "EmailBouncedEvent",
15 "EmailSentEvent",
16 "InboxMessageCreatedEvent",
17 "InboxMessageReadEvent",
18 "NotificationFailedEvent",
19 "NotificationSentEvent",
20]
23# === Existing Notification Events ===
26@dataclass(frozen=True, init=False)
27class NotificationSentEvent(DomainEvent):
28 """Emitted when a notification is successfully dispatched.
30 Consumed by: audit, analytics, delivery tracking.
31 """
33 notification_id: str
34 channel: str
35 recipient_id: str
38@dataclass(frozen=True, init=False)
39class NotificationFailedEvent(DomainEvent):
40 """Emitted when a notification dispatch fails permanently.
42 Consumed by: audit, alerting, retry management.
43 """
45 notification_id: str
46 channel: str
47 reason: str
50# === Mail Events (merged from mail/events.py) ===
53@dataclass(frozen=True, init=False)
54class EmailSentEvent(DomainEvent):
55 """Emitted when an email is successfully dispatched to the provider.
57 Consumed by: audit, analytics, delivery tracking.
58 """
60 message_id: str
61 recipient: str
62 template: str | None
65@dataclass(frozen=True, init=False)
66class EmailBouncedEvent(DomainEvent):
67 """Emitted when an email bounces (hard or soft).
69 Consumed by: bounce management, list hygiene, audit.
70 """
72 message_id: str
73 recipient: str
74 bounce_type: str
77# === Inbox Events (merged from inbox/events.py) ===
80@dataclass(frozen=True, init=False)
81class InboxMessageCreatedEvent(DomainEvent):
82 """Emitted when a new message is added to a user's inbox.
84 Consumed by: audit, analytics, delivery tracking.
85 """
87 message_id: str
88 user_id: str
91@dataclass(frozen=True, init=False)
92class InboxMessageReadEvent(DomainEvent):
93 """Emitted when a user reads an inbox message.
95 Consumed by: audit, analytics, engagement tracking.
96 """
98 message_id: str
99 user_id: str