feat(notify): convert email lists to NotifyEmailEntry struct with toggle support
- Change balance_notify_extra_emails and account_quota_notify_emails
from []string to []NotifyEmailEntry{email, disabled, verified}
- Add per-email enable/disable toggle for both user and admin notifications
- Add PUT /user/notify-email/toggle API endpoint
- Fix critical bug: API key auth cache snapshot missing balance notify
fields (Email, Username, BalanceNotifyEnabled, etc.), causing
notifications to never fire on cached request paths
- Bump cache snapshot version 3→4 to invalidate stale entries
- Add SQL migration 104 to convert old format data
- Backward compatible: parseNotifyEmails auto-detects old/new format
- User balance notify: max 3 emails (primary + 2 extra)
- Admin quota notify: unlimited emails, each with toggle
This commit is contained in:
35
backend/migrations/104_migrate_notify_emails_to_struct.sql
Normal file
35
backend/migrations/104_migrate_notify_emails_to_struct.sql
Normal file
@@ -0,0 +1,35 @@
|
||||
-- Migrate notification email lists from old []string format to new []NotifyEmailEntry format
|
||||
-- Old: ["a@x.com", "b@x.com"]
|
||||
-- New: [{"email":"a@x.com","disabled":false,"verified":true}, ...]
|
||||
-- Existing emails are marked as verified=false (unverified), disabled=false (enabled)
|
||||
|
||||
-- 1. User balance notification emails
|
||||
UPDATE users
|
||||
SET balance_notify_extra_emails = (
|
||||
SELECT COALESCE(
|
||||
jsonb_agg(jsonb_build_object('email', elem::text, 'disabled', false, 'verified', false)),
|
||||
'[]'::jsonb
|
||||
)::text
|
||||
FROM jsonb_array_elements_text(balance_notify_extra_emails::jsonb) AS elem
|
||||
)
|
||||
WHERE balance_notify_extra_emails IS NOT NULL
|
||||
AND balance_notify_extra_emails <> '[]'
|
||||
AND balance_notify_extra_emails <> ''
|
||||
AND (balance_notify_extra_emails::jsonb -> 0) IS NOT NULL
|
||||
AND jsonb_typeof(balance_notify_extra_emails::jsonb -> 0) = 'string';
|
||||
|
||||
-- 2. Admin account quota notification emails
|
||||
UPDATE settings
|
||||
SET value = (
|
||||
SELECT COALESCE(
|
||||
jsonb_agg(jsonb_build_object('email', elem::text, 'disabled', false, 'verified', false)),
|
||||
'[]'::jsonb
|
||||
)::text
|
||||
FROM jsonb_array_elements_text(value::jsonb) AS elem
|
||||
)
|
||||
WHERE key = 'account_quota_notify_emails'
|
||||
AND value IS NOT NULL
|
||||
AND value <> '[]'
|
||||
AND value <> ''
|
||||
AND (value::jsonb -> 0) IS NOT NULL
|
||||
AND jsonb_typeof(value::jsonb -> 0) = 'string';
|
||||
Reference in New Issue
Block a user