Files
Nas-Notification/database/migrations/001_create_notification_tables.sql

222 lines
9.9 KiB
SQL

-- Notification Categories
CREATE TABLE notification_categories (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
name VARCHAR(100) NOT NULL,
value VARCHAR(50) UNIQUE NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Notification Templates
CREATE TABLE notification_templates (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
name VARCHAR(100) NOT NULL,
value VARCHAR(50) UNIQUE NOT NULL,
subject VARCHAR(255),
email_content TEXT,
push_title VARCHAR(100),
push_body VARCHAR(300),
variables JSON DEFAULT ('[]'),
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- User Segments
CREATE TABLE user_segments (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
name VARCHAR(100) NOT NULL,
value VARCHAR(50) UNIQUE NOT NULL,
description TEXT,
criteria JSON NOT NULL,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Main Notifications Table
CREATE TABLE notifications (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
title VARCHAR(255) NOT NULL,
type VARCHAR(20) NOT NULL CHECK (type IN ('single', 'bulk')),
priority VARCHAR(20) NOT NULL CHECK (priority IN ('low', 'medium', 'high', 'critical')),
category_id VARCHAR(36),
status VARCHAR(20) DEFAULT 'draft' CHECK (status IN ('draft', 'scheduled', 'sending', 'sent', 'failed', 'cancelled')),
-- Scheduling
delivery_type VARCHAR(20) NOT NULL CHECK (delivery_type IN ('immediate', 'scheduled')),
scheduled_at TIMESTAMP NULL,
timezone VARCHAR(50) DEFAULT 'UTC',
expires_at TIMESTAMP NULL,
-- A/B Testing
enable_ab_testing BOOLEAN DEFAULT false,
ab_test_split INTEGER DEFAULT 50 CHECK (ab_test_split BETWEEN 10 AND 90),
ab_test_name VARCHAR(100),
-- Tracking & Analytics
enable_tracking BOOLEAN DEFAULT true,
-- Audience Settings
audience_type VARCHAR(20) NOT NULL CHECK (audience_type IN ('all', 'specific', 'segmented')),
specific_users TEXT, -- Comma-separated user IDs or emails
user_status VARCHAR(20),
registration_period VARCHAR(50),
exclude_unsubscribed BOOLEAN DEFAULT true,
respect_do_not_disturb BOOLEAN DEFAULT true,
-- Content
content_type VARCHAR(20) NOT NULL CHECK (content_type IN ('new', 'template')),
template_id VARCHAR(36),
-- Email Content
email_subject VARCHAR(255),
email_content TEXT,
call_to_action_text VARCHAR(100),
call_to_action_url TEXT,
-- Push Content
push_title VARCHAR(100),
push_body VARCHAR(300),
push_image_url TEXT,
-- Metadata
estimated_reach INTEGER DEFAULT 0,
actual_sent INTEGER DEFAULT 0,
created_by VARCHAR(36) NOT NULL, -- User ID who created this
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
sent_at TIMESTAMP NULL,
FOREIGN KEY (category_id) REFERENCES notification_categories(id),
FOREIGN KEY (template_id) REFERENCES notification_templates(id)
);
-- Notification Channels (Many-to-Many)
CREATE TABLE notification_channels (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
notification_id VARCHAR(36) NOT NULL,
channel_type VARCHAR(20) NOT NULL CHECK (channel_type IN ('email', 'push', 'sms', 'in_app')),
is_enabled BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (notification_id) REFERENCES notifications(id) ON DELETE CASCADE
);
-- Notification User Segments (Many-to-Many)
CREATE TABLE notification_user_segments (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
notification_id VARCHAR(36) NOT NULL,
segment_id VARCHAR(36) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (notification_id) REFERENCES notifications(id) ON DELETE CASCADE,
FOREIGN KEY (segment_id) REFERENCES user_segments(id)
);
-- Notification Recipients (For tracking who received what)
CREATE TABLE notification_recipients (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
notification_id VARCHAR(36) NOT NULL,
user_id VARCHAR(36) NOT NULL,
email VARCHAR(255),
channel_type VARCHAR(20) NOT NULL,
status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'delivered', 'failed', 'bounced')),
sent_at TIMESTAMP NULL,
delivered_at TIMESTAMP NULL,
opened_at TIMESTAMP NULL,
clicked_at TIMESTAMP NULL,
error_message TEXT,
ab_test_variant VARCHAR(1) CHECK (ab_test_variant IN ('A', 'B')),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (notification_id) REFERENCES notifications(id) ON DELETE CASCADE
);
-- Notification Queue (For scheduled notifications)
CREATE TABLE notification_queue (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
notification_id VARCHAR(36) NOT NULL,
recipient_id VARCHAR(36) NOT NULL,
scheduled_for TIMESTAMP NOT NULL,
priority INTEGER DEFAULT 5,
attempts INTEGER DEFAULT 0,
max_attempts INTEGER DEFAULT 3,
status VARCHAR(20) DEFAULT 'queued' CHECK (status IN ('queued', 'processing', 'sent', 'failed', 'cancelled')),
last_attempt_at TIMESTAMP NULL,
error_message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (notification_id) REFERENCES notifications(id) ON DELETE CASCADE,
FOREIGN KEY (recipient_id) REFERENCES notification_recipients(id) ON DELETE CASCADE
);
-- Notification Analytics
CREATE TABLE notification_analytics (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
notification_id VARCHAR(36) NOT NULL,
channel_type VARCHAR(20) NOT NULL,
metric_type VARCHAR(30) NOT NULL CHECK (metric_type IN ('sent', 'delivered', 'opened', 'clicked', 'bounced', 'unsubscribed')),
metric_value INTEGER DEFAULT 0,
recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
metadata JSON DEFAULT ('{}'),
FOREIGN KEY (notification_id) REFERENCES notifications(id) ON DELETE CASCADE
);
-- User Notification Preferences
CREATE TABLE user_notification_preferences (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id VARCHAR(36) NOT NULL,
channel_type VARCHAR(20) NOT NULL,
category_value VARCHAR(50),
is_enabled BOOLEAN DEFAULT true,
do_not_disturb_start TIME,
do_not_disturb_end TIME,
timezone VARCHAR(50) DEFAULT 'UTC',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE(user_id, channel_type, category_value)
);
-- Indexes for better performance
CREATE INDEX idx_notifications_status ON notifications(status);
CREATE INDEX idx_notifications_scheduled_at ON notifications(scheduled_at);
CREATE INDEX idx_notifications_created_by ON notifications(created_by);
CREATE INDEX idx_notification_recipients_user_id ON notification_recipients(user_id);
CREATE INDEX idx_notification_recipients_status ON notification_recipients(status);
CREATE INDEX idx_notification_queue_scheduled_for ON notification_queue(scheduled_for);
CREATE INDEX idx_notification_queue_status ON notification_queue(status);
CREATE INDEX idx_notification_analytics_notification_id ON notification_analytics(notification_id);
CREATE INDEX idx_user_notification_preferences_user_id ON user_notification_preferences(user_id);
-- Insert default categories
INSERT INTO notification_categories (name, value, description) VALUES
('User Management', 'user_management', 'User registration, profile updates, account changes'),
('Orders & Transactions', 'orders', 'Order confirmations, payment notifications, transaction updates'),
('Security & Authentication', 'security', 'Login alerts, password changes, security notifications'),
('Marketing & Promotions', 'marketing', 'Promotional offers, newsletters, product announcements'),
('System Updates', 'system', 'System maintenance, feature updates, service announcements'),
('General Information', 'general', 'General notifications and information');
-- Insert default templates
INSERT INTO notification_templates (name, value, subject, email_content, push_title, push_body, variables) VALUES
('Welcome Message', 'welcome', 'Welcome to {{company_name}}!',
'<h1>Welcome {{first_name}}!</h1><p>Thank you for joining {{company_name}}. We''re excited to have you on board.</p>',
'Welcome to {{company_name}}!', 'Hi {{first_name}}, welcome to our platform!',
'["first_name", "last_name", "company_name"]'),
('Password Reset', 'password_reset', 'Reset your password',
'<h1>Password Reset Request</h1><p>Hi {{first_name}}, click the link below to reset your password.</p>',
'Password Reset', 'Tap to reset your password',
'["first_name"]'),
('Order Confirmation', 'order_confirmation', 'Order Confirmation #{{order_id}}',
'<h1>Order Confirmed!</h1><p>Thank you {{first_name}}, your order #{{order_id}} has been confirmed.</p>',
'Order Confirmed!', 'Your order #{{order_id}} is confirmed',
'["first_name", "order_id", "order_total"]');
-- Insert default user segments
INSERT INTO user_segments (name, value, description, criteria) VALUES
('New Users', 'new_users', 'Users registered within last 30 days', '{"registration_days": 30}'),
('Active Users', 'active_users', 'Users active in last 7 days', '{"last_activity_days": 7}'),
('Premium Subscribers', 'premium_users', 'Users with premium subscription', '{"subscription_type": "premium"}'),
('Inactive Users', 'inactive_users', 'Users not active in 30+ days', '{"inactive_days": 30}'),
('High-Value Customers', 'high_value', 'Customers with high lifetime value', '{"min_order_value": 1000}'),
('Mobile App Users', 'mobile_users', 'Users who use mobile app', '{"platform": "mobile"}');