SaaS/database/schema.sql
Aimpress Team bda23a773f 🚀 Initial commit: Aimpress AutomationHub
 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>
2025-09-28 21:58:33 +01:00

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');