Spaces:
Paused
Paused
| import postgres from 'postgres' | |
| const sql = postgres(process.env.DATABASE_URL!, { | |
| max: 10, | |
| idle_timeout: 20, | |
| connect_timeout: 10, | |
| transform: { | |
| undefined: null, | |
| }, | |
| }) | |
| export { sql } | |
| export async function initializeDatabase() { | |
| try { | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS users ( | |
| id VARCHAR(50) PRIMARY KEY, | |
| github_id INTEGER UNIQUE NOT NULL, | |
| username VARCHAR(100) NOT NULL, | |
| email VARCHAR(255) UNIQUE, | |
| avatar_url TEXT, | |
| plan VARCHAR(20) DEFAULT 'free', | |
| created_at TIMESTAMP DEFAULT NOW(), | |
| updated_at TIMESTAMP DEFAULT NOW() | |
| ) | |
| ` | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS user_events ( | |
| id SERIAL PRIMARY KEY, | |
| event_type VARCHAR(50) NOT NULL, | |
| user_id VARCHAR(100), | |
| session_id VARCHAR(100) NOT NULL, | |
| page_url TEXT, | |
| referrer TEXT, | |
| user_agent TEXT, | |
| ip_hash VARCHAR(64), | |
| metadata JSONB, | |
| created_at TIMESTAMP DEFAULT NOW() | |
| ) | |
| ` | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS revenue_events ( | |
| id SERIAL PRIMARY KEY, | |
| event_type VARCHAR(50) NOT NULL, | |
| amount DECIMAL(10, 2) NOT NULL, | |
| currency VARCHAR(3) DEFAULT 'USD', | |
| customer_id VARCHAR(100), | |
| github_id INTEGER, | |
| subscription_tier VARCHAR(20), | |
| metadata JSONB, | |
| created_at TIMESTAMP DEFAULT NOW() | |
| ) | |
| ` | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS affiliate_users ( | |
| id VARCHAR(100) PRIMARY KEY, | |
| github_id INTEGER UNIQUE NOT NULL, | |
| username VARCHAR(100) NOT NULL, | |
| affiliate_code VARCHAR(50) UNIQUE NOT NULL, | |
| referral_count INTEGER DEFAULT 0, | |
| paid_referral_count INTEGER DEFAULT 0, | |
| tier VARCHAR(20) DEFAULT 'free', | |
| created_at TIMESTAMP DEFAULT NOW() | |
| ) | |
| ` | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS referrals ( | |
| id VARCHAR(100) PRIMARY KEY, | |
| affiliate_id VARCHAR(100) NOT NULL REFERENCES affiliate_users(id), | |
| referred_github_id INTEGER UNIQUE NOT NULL, | |
| referred_username VARCHAR(100) NOT NULL, | |
| referred_ip_hash VARCHAR(64) NOT NULL, | |
| has_purchased BOOLEAN DEFAULT FALSE, | |
| created_at TIMESTAMP DEFAULT NOW() | |
| ) | |
| ` | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS affiliate_events ( | |
| id SERIAL PRIMARY KEY, | |
| event_type VARCHAR(50) NOT NULL, | |
| affiliate_id VARCHAR(100) NOT NULL, | |
| affiliate_code VARCHAR(50), | |
| referrer_id VARCHAR(100), | |
| commission_amount DECIMAL(10, 2) DEFAULT 0, | |
| conversion_status VARCHAR(20) DEFAULT 'pending', | |
| metadata JSONB, | |
| created_at TIMESTAMP DEFAULT NOW() | |
| ) | |
| ` | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS dashboard_metrics ( | |
| id SERIAL PRIMARY KEY, | |
| metric_type VARCHAR(50) NOT NULL, | |
| metric_name VARCHAR(100) NOT NULL, | |
| metric_value DECIMAL(15, 2) NOT NULL, | |
| metadata JSONB, | |
| recorded_at TIMESTAMP DEFAULT NOW(), | |
| UNIQUE(metric_type, metric_name, recorded_at) | |
| ) | |
| ` | |
| await sql` | |
| CREATE TABLE IF NOT EXISTS daily_aggregates ( | |
| id SERIAL PRIMARY KEY, | |
| date DATE NOT NULL, | |
| metric_category VARCHAR(50) NOT NULL, | |
| metric_name VARCHAR(100) NOT NULL, | |
| total_value DECIMAL(15, 2) NOT NULL, | |
| count INTEGER DEFAULT 1, | |
| metadata JSONB, | |
| created_at TIMESTAMP DEFAULT NOW(), | |
| UNIQUE(date, metric_category, metric_name) | |
| ) | |
| ` | |
| console.log('Backend database initialized successfully') | |
| } catch (error) { | |
| console.error('Failed to initialize backend database:', error) | |
| } | |
| } | |