AeThex-Connect/supabase/migrations/20260110160000_premium_monetization.sql
2026-01-10 08:00:59 +00:00

160 lines
7.1 KiB
SQL

-- Migration 006: Premium .AETHEX Monetization
-- Adds subscription tiers, blockchain domains, marketplace, and analytics
-- Add premium_tier to users table
ALTER TABLE users
ADD COLUMN IF NOT EXISTS premium_tier VARCHAR(20) DEFAULT 'free'; -- free, premium, enterprise
-- Premium subscriptions table
CREATE TABLE IF NOT EXISTS premium_subscriptions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
tier VARCHAR(20) NOT NULL, -- free, premium, enterprise
status VARCHAR(20) DEFAULT 'active', -- active, cancelled, expired, suspended
stripe_subscription_id VARCHAR(100),
stripe_customer_id VARCHAR(100),
current_period_start TIMESTAMP DEFAULT NOW(),
current_period_end TIMESTAMP,
cancel_at_period_end BOOLEAN DEFAULT false,
cancelled_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_premium_subscriptions_user ON premium_subscriptions(user_id);
CREATE INDEX IF NOT EXISTS idx_premium_subscriptions_stripe ON premium_subscriptions(stripe_subscription_id);
CREATE INDEX IF NOT EXISTS idx_premium_subscriptions_status ON premium_subscriptions(user_id, status);
-- Blockchain domains table
CREATE TABLE IF NOT EXISTS blockchain_domains (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
domain VARCHAR(100) NOT NULL UNIQUE, -- e.g., "anderson.aethex"
owner_user_id UUID NOT NULL REFERENCES users(id),
nft_token_id VARCHAR(100), -- Token ID from Freename contract
wallet_address VARCHAR(100), -- Owner's wallet address
verified BOOLEAN DEFAULT false,
verification_signature TEXT,
expires_at TIMESTAMP,
auto_renew BOOLEAN DEFAULT true,
renewal_price_usd DECIMAL(10, 2) DEFAULT 100.00,
marketplace_listed BOOLEAN DEFAULT false,
marketplace_price_usd DECIMAL(10, 2),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_blockchain_domains_owner ON blockchain_domains(owner_user_id);
CREATE INDEX IF NOT EXISTS idx_blockchain_domains_marketplace ON blockchain_domains(marketplace_listed, marketplace_price_usd);
CREATE INDEX IF NOT EXISTS idx_blockchain_domains_domain ON blockchain_domains(domain);
-- Domain transfers table
CREATE TABLE IF NOT EXISTS domain_transfers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
domain_id UUID NOT NULL REFERENCES blockchain_domains(id),
from_user_id UUID REFERENCES users(id),
to_user_id UUID REFERENCES users(id),
transfer_type VARCHAR(20), -- sale, gift, transfer
price_usd DECIMAL(10, 2),
transaction_hash VARCHAR(100), -- Blockchain tx hash
status VARCHAR(20) DEFAULT 'pending', -- pending, completed, failed
created_at TIMESTAMP DEFAULT NOW(),
completed_at TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_domain_transfers_domain ON domain_transfers(domain_id);
CREATE INDEX IF NOT EXISTS idx_domain_transfers_status ON domain_transfers(status, created_at);
-- Enterprise accounts table
CREATE TABLE IF NOT EXISTS enterprise_accounts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_name VARCHAR(200) NOT NULL,
owner_user_id UUID NOT NULL REFERENCES users(id),
custom_domain VARCHAR(200), -- e.g., chat.yourgame.com
custom_domain_verified BOOLEAN DEFAULT false,
dns_txt_record VARCHAR(100), -- For domain verification
white_label_enabled BOOLEAN DEFAULT true,
custom_branding JSONB, -- {logo, primaryColor, secondaryColor, etc.}
max_users INTEGER DEFAULT 100,
current_users INTEGER DEFAULT 0,
sla_tier VARCHAR(20) DEFAULT 'standard', -- standard, premium, enterprise
dedicated_infrastructure BOOLEAN DEFAULT false,
subscription_id UUID REFERENCES premium_subscriptions(id),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_enterprise_accounts_owner ON enterprise_accounts(owner_user_id);
CREATE INDEX IF NOT EXISTS idx_enterprise_accounts_subscription ON enterprise_accounts(subscription_id);
-- Enterprise team members table
CREATE TABLE IF NOT EXISTS enterprise_team_members (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
enterprise_id UUID NOT NULL REFERENCES enterprise_accounts(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
role VARCHAR(20) DEFAULT 'member', -- admin, member
joined_at TIMESTAMP DEFAULT NOW(),
UNIQUE(enterprise_id, user_id)
);
CREATE INDEX IF NOT EXISTS idx_enterprise_team_members_enterprise ON enterprise_team_members(enterprise_id);
CREATE INDEX IF NOT EXISTS idx_enterprise_team_members_user ON enterprise_team_members(user_id);
-- Usage analytics table
CREATE TABLE IF NOT EXISTS usage_analytics (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
date DATE NOT NULL,
messages_sent INTEGER DEFAULT 0,
messages_received INTEGER DEFAULT 0,
voice_minutes INTEGER DEFAULT 0,
video_minutes INTEGER DEFAULT 0,
storage_used_mb INTEGER DEFAULT 0,
active_friends INTEGER DEFAULT 0,
games_played INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(user_id, date)
);
CREATE INDEX IF NOT EXISTS idx_usage_analytics_user_date ON usage_analytics(user_id, date DESC);
-- Feature limits table (for tier-based restrictions)
CREATE TABLE IF NOT EXISTS feature_limits (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tier VARCHAR(20) NOT NULL UNIQUE, -- free, premium, enterprise
max_friends INTEGER DEFAULT -1, -- -1 = unlimited
max_storage_gb INTEGER DEFAULT 1,
voice_calls_enabled BOOLEAN DEFAULT true,
video_calls_enabled BOOLEAN DEFAULT false,
max_video_quality VARCHAR(20) DEFAULT '480p', -- 480p, 720p, 1080p, 4k
custom_branding BOOLEAN DEFAULT false,
analytics_enabled BOOLEAN DEFAULT false,
priority_support BOOLEAN DEFAULT false,
white_label BOOLEAN DEFAULT false,
dedicated_infrastructure BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW()
);
-- Insert default feature limits
INSERT INTO feature_limits (tier, max_friends, max_storage_gb, voice_calls_enabled, video_calls_enabled, max_video_quality, custom_branding, analytics_enabled, priority_support, white_label, dedicated_infrastructure)
VALUES
('free', 5, 0, false, false, null, false, false, false, false, false),
('premium', -1, 10, true, true, '1080p', true, true, true, false, false),
('enterprise', -1, -1, true, true, '4k', true, true, true, true, true)
ON CONFLICT (tier) DO NOTHING;
-- Payment transactions table (for audit trail)
CREATE TABLE IF NOT EXISTS payment_transactions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
transaction_type VARCHAR(50), -- subscription, domain_purchase, domain_sale, etc.
amount_usd DECIMAL(10, 2) NOT NULL,
currency VARCHAR(3) DEFAULT 'usd',
stripe_payment_intent_id VARCHAR(100),
stripe_invoice_id VARCHAR(100),
status VARCHAR(20) DEFAULT 'pending', -- pending, succeeded, failed, refunded
metadata JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_payment_transactions_user ON payment_transactions(user_id, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_payment_transactions_stripe ON payment_transactions(stripe_payment_intent_id);