✨ Features: - Modern SaaS automation platform - Next.js 15 + TypeScript frontend - Node.js + Express backend - PostgreSQL database with full schema - Docker Compose setup - Admin panel with analytics - Template marketplace (6 templates) - Integrations hub (10+ services) - Authentication & role-based access - Responsive n8n-style design 🎯 Ready for demo and deployment 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
290 lines
No EOL
11 KiB
SQL
290 lines
No EOL
11 KiB
SQL
-- SaaS Automation Platform Database Schema
|
|
|
|
-- Create n8n database
|
|
CREATE DATABASE n8n;
|
|
|
|
-- Users table
|
|
CREATE TABLE users (
|
|
id SERIAL PRIMARY KEY,
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
first_name VARCHAR(100),
|
|
last_name VARCHAR(100),
|
|
is_verified BOOLEAN DEFAULT false,
|
|
verification_token VARCHAR(255),
|
|
reset_password_token VARCHAR(255),
|
|
reset_password_expires TIMESTAMP,
|
|
role VARCHAR(50) DEFAULT 'free',
|
|
subscription_plan VARCHAR(50) DEFAULT 'free',
|
|
subscription_status VARCHAR(50) DEFAULT 'active',
|
|
subscription_starts_at TIMESTAMP,
|
|
subscription_ends_at TIMESTAMP,
|
|
workflow_limit INTEGER DEFAULT 3,
|
|
user_limit INTEGER DEFAULT 1,
|
|
features JSONB DEFAULT '{"telegram_notifications": false, "email_notifications": true, "api_access": false, "premium_templates": false}',
|
|
telegram_chat_id VARCHAR(255),
|
|
notification_preferences JSONB DEFAULT '{"email": true, "telegram": false, "workflow_status": true, "system_updates": false}',
|
|
onboarding_completed BOOLEAN DEFAULT false,
|
|
last_login_at TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Workflows table
|
|
CREATE TABLE workflows (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
n8n_workflow_id VARCHAR(255),
|
|
status VARCHAR(50) DEFAULT 'inactive',
|
|
trigger_type VARCHAR(100),
|
|
trigger_config JSONB,
|
|
actions_config JSONB,
|
|
is_active BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Index for n8n_workflow_id
|
|
CREATE INDEX idx_workflows_n8n_workflow_id ON workflows(n8n_workflow_id);
|
|
|
|
-- Templates table (automation templates)
|
|
CREATE TABLE templates (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
category VARCHAR(100),
|
|
trigger_type VARCHAR(100),
|
|
trigger_config JSONB,
|
|
actions_config JSONB,
|
|
n8n_template JSONB,
|
|
tags TEXT[],
|
|
is_featured BOOLEAN DEFAULT false,
|
|
install_count INTEGER DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- User installed templates
|
|
CREATE TABLE user_templates (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
template_id INTEGER REFERENCES templates(id) ON DELETE CASCADE,
|
|
workflow_id INTEGER REFERENCES workflows(id) ON DELETE CASCADE,
|
|
installed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(user_id, template_id)
|
|
);
|
|
|
|
-- Integrations table (OAuth connections)
|
|
CREATE TABLE integrations (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
provider VARCHAR(100) NOT NULL,
|
|
provider_user_id VARCHAR(255),
|
|
access_token TEXT,
|
|
refresh_token TEXT,
|
|
token_expires_at TIMESTAMP,
|
|
scopes TEXT[],
|
|
account_name VARCHAR(255),
|
|
account_email VARCHAR(255),
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Webhooks table
|
|
CREATE TABLE webhooks (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
name VARCHAR(255) NOT NULL,
|
|
slug VARCHAR(255) NOT NULL,
|
|
trigger_type VARCHAR(100),
|
|
secret_key VARCHAR(255),
|
|
url_path VARCHAR(255) UNIQUE,
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Webhook logs
|
|
CREATE TABLE webhook_logs (
|
|
id SERIAL PRIMARY KEY,
|
|
webhook_id INTEGER REFERENCES webhooks(id) ON DELETE CASCADE,
|
|
request_method VARCHAR(10),
|
|
request_headers JSONB,
|
|
request_payload JSONB,
|
|
response_status INTEGER,
|
|
response_payload JSONB,
|
|
processing_time_ms INTEGER,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Workflow executions/logs
|
|
CREATE TABLE workflow_executions (
|
|
id SERIAL PRIMARY KEY,
|
|
workflow_id INTEGER REFERENCES workflows(id) ON DELETE CASCADE,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
n8n_execution_id VARCHAR(255),
|
|
status VARCHAR(50),
|
|
trigger_data JSONB,
|
|
execution_data JSONB,
|
|
error_message TEXT,
|
|
started_at TIMESTAMP,
|
|
finished_at TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Chat history (AI chatbot)
|
|
CREATE TABLE chat_history (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
session_id VARCHAR(255),
|
|
message_type VARCHAR(20) CHECK (message_type IN ('user', 'assistant')),
|
|
content TEXT NOT NULL,
|
|
metadata JSONB,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Indexes for performance
|
|
CREATE INDEX idx_users_email ON users(email);
|
|
CREATE INDEX idx_workflows_user_id ON workflows(user_id);
|
|
CREATE INDEX idx_workflows_status ON workflows(status);
|
|
CREATE INDEX idx_templates_category ON templates(category);
|
|
CREATE INDEX idx_integrations_user_id ON integrations(user_id);
|
|
CREATE INDEX idx_integrations_provider ON integrations(provider);
|
|
CREATE INDEX idx_webhooks_user_id ON webhooks(user_id);
|
|
CREATE INDEX idx_webhooks_url_path ON webhooks(url_path);
|
|
CREATE INDEX idx_webhook_logs_webhook_id ON webhook_logs(webhook_id);
|
|
CREATE INDEX idx_workflow_executions_workflow_id ON workflow_executions(workflow_id);
|
|
CREATE INDEX idx_workflow_executions_user_id ON workflow_executions(user_id);
|
|
CREATE INDEX idx_chat_history_user_id ON chat_history(user_id);
|
|
CREATE INDEX idx_chat_history_session_id ON chat_history(session_id);
|
|
|
|
-- Subscription plans table
|
|
CREATE TABLE subscription_plans (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
price_monthly DECIMAL(10,2) NOT NULL,
|
|
price_yearly DECIMAL(10,2),
|
|
workflow_limit INTEGER NOT NULL,
|
|
user_limit INTEGER NOT NULL,
|
|
features JSONB NOT NULL,
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- User subscriptions history
|
|
CREATE TABLE subscription_history (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
plan_name VARCHAR(100) NOT NULL,
|
|
amount DECIMAL(10,2) NOT NULL,
|
|
currency VARCHAR(10) DEFAULT 'GBP',
|
|
payment_method VARCHAR(50),
|
|
payment_status VARCHAR(50) DEFAULT 'pending',
|
|
payment_provider_id VARCHAR(255),
|
|
billing_period_start TIMESTAMP NOT NULL,
|
|
billing_period_end TIMESTAMP NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- User teams table (for multi-user accounts)
|
|
CREATE TABLE user_teams (
|
|
id SERIAL PRIMARY KEY,
|
|
owner_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
member_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
role VARCHAR(50) DEFAULT 'member',
|
|
invited_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
joined_at TIMESTAMP,
|
|
status VARCHAR(50) DEFAULT 'pending',
|
|
UNIQUE(owner_id, member_id)
|
|
);
|
|
|
|
-- Notifications table
|
|
CREATE TABLE notifications (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
title VARCHAR(255) NOT NULL,
|
|
message TEXT NOT NULL,
|
|
type VARCHAR(50) NOT NULL,
|
|
data JSONB,
|
|
is_read BOOLEAN DEFAULT false,
|
|
sent_via VARCHAR(50),
|
|
sent_at TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- API tokens table
|
|
CREATE TABLE api_tokens (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
name VARCHAR(255) NOT NULL,
|
|
token_hash VARCHAR(255) NOT NULL,
|
|
permissions JSONB DEFAULT '["workflows:read"]',
|
|
last_used_at TIMESTAMP,
|
|
expires_at TIMESTAMP,
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Audit logs table
|
|
CREATE TABLE audit_logs (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
|
|
action VARCHAR(100) NOT NULL,
|
|
resource_type VARCHAR(50) NOT NULL,
|
|
resource_id VARCHAR(100),
|
|
details JSONB,
|
|
ip_address INET,
|
|
user_agent TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- System settings table
|
|
CREATE TABLE system_settings (
|
|
id SERIAL PRIMARY KEY,
|
|
key VARCHAR(100) UNIQUE NOT NULL,
|
|
value JSONB NOT NULL,
|
|
description TEXT,
|
|
is_public BOOLEAN DEFAULT false,
|
|
updated_by INTEGER REFERENCES users(id),
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Sample data
|
|
INSERT INTO subscription_plans (name, price_monthly, price_yearly, workflow_limit, user_limit, features) VALUES
|
|
('Free', 0.00, 0.00, 3, 1, '{"telegram_notifications": false, "email_notifications": true, "api_access": false, "premium_templates": false, "support": "community", "execution_limit": 100}'),
|
|
('Pro', 150.00, 1500.00, 10, 2, '{"telegram_notifications": true, "email_notifications": true, "api_access": true, "premium_templates": true, "support": "email", "execution_limit": 10000}'),
|
|
('Enterprise', 0.00, 0.00, -1, -1, '{"telegram_notifications": true, "email_notifications": true, "api_access": true, "premium_templates": true, "support": "priority", "execution_limit": -1, "custom_integrations": true}');
|
|
|
|
INSERT INTO system_settings (key, value, description, is_public) VALUES
|
|
('trial_duration_days', '7', 'Trial period duration in days', false),
|
|
('max_workflows_free', '3', 'Maximum workflows for free users', false),
|
|
('maintenance_mode', 'false', 'System maintenance mode', true),
|
|
('welcome_message', '"Welcome to AutomationHub! Start automating your workflows today."', 'Welcome message for new users', true);
|
|
|
|
INSERT INTO templates (name, description, category, trigger_type, trigger_config, actions_config, tags, is_featured) VALUES
|
|
('Instagram to CRM', 'Automatically sync new Instagram followers to your CRM', 'Social Media', 'instagram_follower',
|
|
'{"event": "new_follower"}',
|
|
'{"actions": [{"type": "crm_create_contact", "fields": ["username", "profile_url"]}]}',
|
|
ARRAY['instagram', 'crm', 'automation'], true),
|
|
|
|
('Email to Task Manager', 'Create tasks from important emails', 'Productivity', 'email_received',
|
|
'{"filters": {"importance": "high"}}',
|
|
'{"actions": [{"type": "task_create", "fields": ["subject", "sender", "body"]}]}',
|
|
ARRAY['email', 'productivity', 'tasks'], true),
|
|
|
|
('Form Submission to Slack', 'Post form submissions to Slack channel', 'Communication', 'webhook',
|
|
'{"event": "form_submit"}',
|
|
'{"actions": [{"type": "slack_message", "channel": "#leads"}]}',
|
|
ARRAY['webhook', 'slack', 'forms'], false);
|
|
|
|
-- Insert global admin (password is 'admin123')
|
|
INSERT INTO users (email, password_hash, first_name, last_name, is_verified, role, subscription_plan, workflow_limit, user_limit, features) VALUES
|
|
('info@ai-impress.com', '$2b$10$8K1p/a0dclxKqnvzBL5TM.N7EH1Cx0m1K2oOKy2Tc2z1H5U2N3V6K', 'Global', 'Admin', true, 'admin', 'enterprise', -1, -1, '{"telegram_notifications": true, "email_notifications": true, "api_access": true, "premium_templates": true, "support": "priority", "execution_limit": -1, "admin_panel": true, "system_settings": true}');
|
|
|
|
-- Insert sample user (password is 'password123')
|
|
INSERT INTO users (email, password_hash, first_name, last_name, is_verified, subscription_starts_at, subscription_ends_at) VALUES
|
|
('demo@example.com', '$2b$10$8K1p/a0dclxKqnvzBL5TM.N7EH1Cx0m1K2oOKy2Tc2z1H5U2N3V6K', 'Demo', 'User', true, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '7 days'); |