feat(routing): apply quiet hours, user pause and digests (#27, part 1) #30

Merged
KofTwentyTwo merged 2 commits from feature/quiet-hours-digests into develop 2026-10-14 16:17:29 +00:00
2 Commits
Author SHA1 Message Date
james.maes ebfb71c910 Merge remote-tracking branch 'origin/develop' into feature/quiet-hours-digests
# Conflicts:
#	CHANGELOG.md
#	README.md
#	src/main/java/com/kingsrook/qbits/alerts/engine/AlertRouter.java
#	src/main/java/com/kingsrook/qbits/alerts/metadata/AlertsProcessesMetaDataProducer.java
#	src/main/java/com/kingsrook/qbits/alerts/processes/AlertsScheduledSteps.java
#	src/main/resources/db/liquibase/qbit-alerts/alerts.changelog.sql
#	src/test/java/com/kingsrook/qbits/alerts/AlertsQBitProducerTest.java
2026-10-14 11:12:39 -05:00
james.maesandClaude Opus 5.5 8c6e4dadfa feat(routing): apply quiet hours, user pause and digests
Quiet hours, digest hour and pause were editable in My Alert Settings
but never applied, and DIGEST_HOURLY / DIGEST_DAILY subscriptions sent
immediately.

- The router suppresses push deliveries (email, lists, webhooks) to a
  user during their quiet hours (time zone, windows across midnight,
  quiet days; severities at or above quietBypassSeverity, default
  CRITICAL, break through) as QUIET_HOURS, and while paused as
  USER_PAUSED. The in-app bell is never suppressed by either. A channel
  below its minimum severity is now logged as MIN_SEVERITY.
- Digest subscriptions queue DIGEST deliveries per user/channel and
  window. The hidden hourly alertsSendDigests job sends one grouped
  message per window (hourly, or daily at the user's digest hour in
  their time zone) through the existing email path or one in-app
  notification, rechecks visibility, skips empty digests and never
  sends a window twice. Failed or oversized windows stay visible.
- Changeset 27 adds the durable digest dispatch columns.

Refs #27

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:02:08 -05:00