package notify import ( "context" "log/slog" ) // DummyNotifier 仅用于本地与测试环境,将通知以结构化日志形式打印,不做任何 // 真实外发。生产环境如未配置真实 Notifier,可注册此实现作为兜底,避免投递 // 流程因缺少 channel 而中断。 type DummyNotifier struct { log *slog.Logger } // NewDummyNotifier 用调用方提供的 logger 构造 DummyNotifier。logger 为 nil 时 // 调用 Send 会 panic,这是显式契约——上层负责传入有效 logger。 func NewDummyNotifier(log *slog.Logger) *DummyNotifier { return &DummyNotifier{log: log} } // Name 返回 ChannelDummy,标识该 Notifier 的通道身份。 func (d *DummyNotifier) Name() Channel { return ChannelDummy } // Send 将消息以 Info 级别结构化日志输出。ctx 在 dummy 实现中不消费, // 真实通道(email/webhook/IM)应尊重 ctx 的取消与超时。 func (d *DummyNotifier) Send(_ context.Context, msg Message) error { d.log.Info("notify[dummy]", "topic", msg.Topic, "severity", string(msg.Severity), "user_id", msg.UserID.String(), "title", msg.Title, ) return nil }