feat(notifications-slack): add scope-based message update support

When a Backstage notification is re-sent with the same scope, the
notifications backend updates the existing DB record and sets
notification.updated. Previously, the SlackNotificationProcessor always
called chat.postMessage(), creating duplicate Slack messages.

This adds database-backed scope-based update support:

- New slack_message_timestamps table to persist Slack message ts values
  keyed by (scope, channel)
- After each chat.postMessage(), store the response ts in the database
- When postProcess receives a notification with updated set and a
  matching stored ts, use chat.update() instead of chat.postMessage()
- Scope context is passed as parameters through the call chain to avoid
  race conditions with concurrent postProcess calls
- Scheduled daily cleanup of old timestamp records (24h retention)
- New messagesUpdated metrics counter for observability
- Graceful degradation when no database is provided
- Explicitly picks only supported fields for chat.update calls

Signed-off-by: Erik Miller <erik.miller@gusto.com>
This commit is contained in:
Erik Miller
2026-03-27 16:53:12 -07:00
parent e32a4cabb4
commit f399a7acab
8 changed files with 650 additions and 22 deletions
+1
View File
@@ -6195,6 +6195,7 @@ __metadata:
"@slack/types": "npm:^2.14.0"
"@slack/web-api": "npm:^7.5.0"
dataloader: "npm:^2.0.0"
knex: "npm:^3.0.0"
msw: "npm:^2.0.0"
p-throttle: "npm:^4.1.1"
languageName: unknown