You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#287 (styled email approve/cancel buttons + summary block) called for a List-Unsubscribe header on outgoing approval emails so a recipient added to a notification list they didn't ask for can self-serve out. The header requires a per-recipient mute endpoint backend, which doesn't exist today — so #287 deferred this and shipped without the header.
This issue tracks adding the endpoint + the header.
What needs to happen
Per-recipient mute endpoint: GET /api/notifications/unsubscribe?token=<signed-recipient-token> (token-only, AuthPublic like the approve/cancel routes). Idempotent. Returns a small confirmation page. The token signs the (recipient_email, scope) tuple so a stray subscriber can opt out of "purchase approvals" without losing other notifications.
muted_recipients table (or column on a per-recipient settings table — confirm the existing notifications schema):
Activity
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…
feat(notifications): per-recipient mute + List-Unsubscribe (closes #297)
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…
feat(notifications): per-recipient mute + List-Unsubscribe (closes #297)
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…
8 remaining items
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…
feat(notifications): per-recipient mute + List-Unsubscribe (closes #297)
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…
feat(notifications): per-recipient mute + List-Unsubscribe (closes #297)
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…
feat(notifications): per-recipient mute + List-Unsubscribe (closes #297)
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…
feat(notifications): per-recipient mute + List-Unsubscribe (closes #297)
fix(ci): add IsNotificationMuted to all config.StoreInterface mocks (#…
fix(notifications): wire per-recipient mute + List-Unsubscribe into p…