package notification import ( "context" "errors" "log/slog" ) type Service struct { logger *slog.Logger sinks []TaskEventSink } func NewService(logger *slog.Logger, sinks ...TaskEventSink) *Service { return &Service{ logger: logger, sinks: append([]TaskEventSink{}, sinks...), } } func (s *Service) NotifyTaskCompleted(ctx context.Context, input TaskNotification) error { return s.NotifyTaskEvent(ctx, TaskEvent{ Type: TaskEventCompleted, TaskID: input.TaskID, Title: input.Title, Status: input.Status, Message: input.Message, }) } func (s *Service) NotifyTaskEvent(ctx context.Context, input TaskEvent) error { if s.logger != nil { s.logger.Info("task event notification requested", "type", input.Type, "task_id", input.TaskID) } var errs []error for _, sink := range s.sinks { if err := sink.HandleTaskEvent(ctx, input); err != nil { errs = append(errs, err) } } return errors.Join(errs...) }