From 2507e3d0db9b6c05c6f9bfae94b3f787d9825338 Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Tue, 19 Mar 2024 23:37:32 +0100 Subject: [PATCH] bep: add user notification settings plan Signed-off-by: Heikki Hellgren --- beps/0001-notifications-system/README.md | 31 +++++++++++++++++- .../UserNotificationSettings.png | Bin 0 -> 29081 bytes 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 beps/0001-notifications-system/UserNotificationSettings.png diff --git a/beps/0001-notifications-system/README.md b/beps/0001-notifications-system/README.md index 66e23542dc..bd3a097dea 100644 --- a/beps/0001-notifications-system/README.md +++ b/beps/0001-notifications-system/README.md @@ -380,10 +380,39 @@ interface SignalApi { - Render dynamic values with various different React elements such as the `EntityRefLink` for entity references (for example `{{ user:default/john.doe }}`) in the notification payload - Handle `link` values that use route references. For example instead hard-coding link to `/catalog/default/component/artist-web` it should be possible to use `catalogPlugin.catalogEntity` route reference as a link of the notification. This should also allow using parameters to be passed to the route reference. Links to external systems are still supported. - Add support for `analyticsApi` to notification actions like marking notifications done, saved or opening links in the notifications -- Add support for user settings to control how notifications are shown to the user and which notifications user wants to receive. This should also include support for different `NotificationProcessor`s that can send notification to external systems - Add a sound to be played when notification is received - Add i18n internationalization support for the notification payload +### User specific notification settings + +To allow the users more fine-grained control of notifications, user must have an option to unsubscribe from specific origins, topics and channels. + +By default, all notifications are enabled for the user in all notification channels. Frontend plugin provides an user interface to change these settings for example as described in the following image: + +![user notification settings UI example](./UserNotificationSettings.png) + +Each notification processor with `send` functionality will be listed as a separate channel among the Backstage internal notification channel `Web`. For this, each notification processor must implement a function to get a human readable name to be rendered in the frontend. + +User must be able to save these settings to the notification database, and they are be checked each time a new notification is sent to the user. + +Disabling a notification from specific origin or topic in the `Web` channel will not remove the old notifications being visible in the frontend from that source but instead, it only prevents new notifications being sent. + +For performance reasons the notification settings will ignore all broadcast notifications and those will be sent to all users despite their origin or channel. + +```ts +export type NotificationSetting = { + origin: string; + topic?: string; + channels: Record; +}; + +export type UserNotificationSettings = { + settings: NotificationSetting[]; +}; +``` + +The backend plugin returns user notification settings for all known origins, topics and channels it knows of. As new origins, topics and channels will get added, also the notification settings list will get longer. This allows an easy way to add new notification origins, topics and channels without need to change the notification plugin. If the user is missing notification setting from specific origin/topic/channel, the backend considers it as enabled. + ## Release Plan The notification and signal plugins are released as two new plugins in the Backstage ecosystem. They will both start out in an experimental state. diff --git a/beps/0001-notifications-system/UserNotificationSettings.png b/beps/0001-notifications-system/UserNotificationSettings.png new file mode 100644 index 0000000000000000000000000000000000000000..de9a5881b43a47c0c28778eae6c609ec20d659c0 GIT binary patch literal 29081 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 p`T31&oQq26@WiBJWWGD@t=-~1<4^wx-nF