3.8 KiB
Migration Guide: Multi-Provider Email Support
Step 1: Check Current Schema
First, check what indexes exist on your table:
SHOW INDEX FROM notification_delivery_config;
Look for a unique index on channel_type. It might be named:
channel_typenotification_delivery_config_channel_type_key- Or something similar
If you see a unique index on channel_type, note the exact name.
Step 2: Drop Old Unique Constraint (if exists)
Replace INDEX_NAME_HERE with the actual name from Step 1:
-- If the index name is 'channel_type':
ALTER TABLE notification_delivery_config DROP INDEX channel_type;
-- OR if it has a different name:
ALTER TABLE notification_delivery_config DROP INDEX notification_delivery_config_channel_type_key;
If you got error "Can't DROP", it means there's no unique constraint. This is fine! Skip to Step 3.
Step 3: Add New Unique Constraint
ALTER TABLE notification_delivery_config
ADD UNIQUE KEY unique_channel_provider (channel_type, provider);
This allows multiple providers per channel.
Step 4: Add is_active Column
ALTER TABLE notification_delivery_config
ADD COLUMN is_active BOOLEAN DEFAULT false AFTER is_enabled;
Step 5: Mark Current Config as Active
UPDATE notification_delivery_config
SET is_active = true
WHERE channel_type = 'email'
AND is_enabled = true
LIMIT 1;
Step 6: Insert Mailtrap Config
INSERT IGNORE INTO notification_delivery_config
(channel_type, is_enabled, is_active, provider, provider_config, status, success_rate, created_by, updated_by, created_at, updated_at)
VALUES (
'email',
false,
false,
'Mailtrap',
JSON_OBJECT(
'host', 'live.smtp.mailtrap.io',
'port', 587,
'secure', false,
'user', 'apismtp@mailtrap.io',
'pass', '',
'senderEmail', '',
'senderName', ''
),
'Not Configured',
0.0,
1,
1,
NOW(),
NOW()
);
Step 7: Insert AWS SES Config
INSERT IGNORE INTO notification_delivery_config
(channel_type, is_enabled, is_active, provider, provider_config, status, success_rate, created_by, updated_by, created_at, updated_at)
VALUES (
'email',
false,
false,
'AWS SES',
JSON_OBJECT(
'host', '',
'port', 587,
'secure', false,
'user', '',
'pass', '',
'senderEmail', '',
'senderName', '',
'region', 'us-east-1',
'configurationSet', ''
),
'Not Configured',
0.0,
1,
1,
NOW(),
NOW()
);
Step 8: Verify Migration
SELECT
id,
channel_type,
provider,
is_enabled,
is_active,
status,
JSON_EXTRACT(provider_config, '$.host') as smtp_host
FROM notification_delivery_config
WHERE channel_type = 'email'
ORDER BY provider;
You should see:
- At least 2 rows for email (Mailtrap and AWS SES)
- One might be
is_enabled = true(your current config) - Only one should have
is_active = true
Step 9: Regenerate Prisma Client
After database migration, update your Prisma client:
npx prisma generate
Troubleshooting
Error: "Can't DROP 'channel_type'"
Solution: Your table doesn't have a unique constraint on channel_type. This is fine! Skip Step 2 and continue with Step 3.
Error: "Duplicate entry for key 'unique_channel_provider'"
Solution: The unique constraint already exists. Skip Step 3.
Error: "Duplicate column name 'is_active'"
Solution: The column already exists. Skip Step 4.
Error: "Duplicate entry" on INSERT
Solution: The config already exists. This is normal with INSERT IGNORE.
Alternative: Use Safe Migration Script
If you prefer, run the safe migration script that handles all checks automatically:
mysql -h 18.138.137.105 -u admin -p corrad-notification < database/migrations/005_support_multiple_email_providers_safe.sql
This script checks for existing indexes/columns before making changes.