Commit Graph

16 Commits

Author SHA1 Message Date
Joseph Doherty
b31747a632 feat(notif): NotificationOutboxActor + CentralAuditWriter wired (#23 M4)
M4 Bundle B (B1) — add the central-only ICentralAuditWriter implementation
and inject it into NotificationOutboxActor so subsequent tasks (B2/B3) can
route attempt + terminal lifecycle events through the direct-write audit path.

- CentralAuditWriter: thin wrapper around IAuditLogRepository.InsertIfNotExistsAsync;
  scope-per-call (matches AuditLogIngestActor / NotificationOutboxActor pattern);
  stamps IngestedAtUtc; swallows all internal failures (alog.md §13).
- Registered as a singleton in AddAuditLog.
- NotificationOutboxActor ctor takes ICentralAuditWriter (validated non-null).
- Host wiring resolves the writer once from the root provider and passes it
  into the singleton's Props.Create call.
- Existing TestKit fixtures updated with a NoOpCentralAuditWriter helper so
  tests that don't exercise audit emission still compile and pass.
2026-05-20 16:04:01 -04:00
Joseph Doherty
1629a72093 feat(notification-outbox): actor handler for per-site KPI requests 2026-05-19 05:37:14 -04:00
Joseph Doherty
4b61e29e27 refactor(notification-outbox): extract EmailAddressValidator helper, drop orphaned using 2026-05-19 03:39:05 -04:00
Joseph Doherty
5e80f64cd8 refactor(notification-outbox): share SMTP helpers between NotificationService and the Email adapter
FU1 of the Notification Outbox follow-ups. EmailNotificationDeliveryAdapter
carried verbatim private copies of credential redaction, SMTP error
classification, and address validation because the NotificationService
helpers were internal. This eliminates the divergence risk by promoting the
helpers to public and deleting the adapter's copies.

- CredentialRedactor: internal -> public.
- Extract SmtpErrorClassifier + SmtpErrorClass enum into a new public static
  class; NotificationDeliveryService now routes classification through it
  (behavior unchanged). Adds focused SmtpErrorClassifierTests.
- NotificationDeliveryService.ValidateAddresses: internal -> public; the
  adapter calls it directly.
- EmailNotificationDeliveryAdapter: deleted ScrubCredentials, ClassifySmtpError,
  SmtpErrorClass, IsTransientSmtpError and ValidateAddresses copies.

No InternalsVisibleTo hack — specific helpers promoted to public. Both test
suites green; full solution builds clean.
2026-05-19 03:34:22 -04:00
Joseph Doherty
703cb2d392 feat(notification-outbox): add AddNotificationOutbox DI registration 2026-05-19 02:07:29 -04:00
Joseph Doherty
517437b0d9 refactor(notification-outbox): make purge fault-handling symmetric with dispatch 2026-05-19 02:01:48 -04:00
Joseph Doherty
41358c1cee feat(notification-outbox): add daily terminal-row purge 2026-05-19 01:58:19 -04:00
Joseph Doherty
77a05a8960 fix(notification-outbox): give KPI response a failure shape; log status-query faults 2026-05-19 01:55:46 -04:00
Joseph Doherty
82e3eb0e93 feat(notification-outbox): add query, retry, discard, and KPI handlers 2026-05-19 01:50:20 -04:00
Joseph Doherty
ab3721a2e8 fix(notification-outbox): clear dispatch in-flight flag on a faulted pass 2026-05-19 01:45:09 -04:00
Joseph Doherty
c41f43c87f feat(notification-outbox): add dispatcher loop to NotificationOutboxActor 2026-05-19 01:42:28 -04:00
Joseph Doherty
4dc9f9e159 feat(notification-outbox): add NotificationOutboxActor ingest 2026-05-19 01:36:13 -04:00
Joseph Doherty
04e00d56c6 test(notification-outbox): cover Email adapter permanent/cancellation arms, align error casing 2026-05-19 01:32:54 -04:00
Joseph Doherty
b8dece0e70 feat(notification-outbox): add Email notification delivery adapter 2026-05-19 01:26:33 -04:00
Joseph Doherty
8d52890245 feat(notification-outbox): add NotificationOutboxOptions and delivery adapter abstraction 2026-05-19 01:20:49 -04:00
Joseph Doherty
fb589bf1da feat(notification-outbox): scaffold ScadaLink.NotificationOutbox project 2026-05-19 01:16:58 -04:00