-- User Profiles Table -- Stores onboarding form data for each user CREATE TABLE IF NOT EXISTS user_profiles ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, name TEXT NOT NULL, email TEXT NOT NULL, primary_goal TEXT, target_outcome TEXT, data_types TEXT[], profession TEXT, experience TEXT, industry TEXT, onboarding_completed BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), UNIQUE(user_id) ); -- Index for faster lookups CREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id); -- RLS (Row Level Security) Policies ALTER TABLE user_profiles ENABLE ROW LEVEL SECURITY; -- Allow users to read their own profile CREATE POLICY "Users can read own profile" ON user_profiles FOR SELECT USING (auth.uid() = user_id); -- Allow users to insert their own profile CREATE POLICY "Users can insert own profile" ON user_profiles FOR INSERT WITH CHECK (auth.uid() = user_id); -- Allow users to update their own profile CREATE POLICY "Users can update own profile" ON user_profiles FOR UPDATE USING (auth.uid() = user_id); -- Usage Analytics Table (if not exists) CREATE TABLE IF NOT EXISTS usage_analytics ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, user_id TEXT NOT NULL, user_email TEXT, session_id TEXT NOT NULL, query TEXT NOT NULL, agent_used TEXT, tools_executed TEXT[], tokens_used INTEGER, duration_ms INTEGER, success BOOLEAN NOT NULL, error_message TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_usage_analytics_user_id ON usage_analytics(user_id); CREATE INDEX IF NOT EXISTS idx_usage_analytics_created_at ON usage_analytics(created_at); -- User Sessions Table (if not exists) CREATE TABLE IF NOT EXISTS user_sessions ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, user_id TEXT NOT NULL, user_email TEXT, started_at TIMESTAMP WITH TIME ZONE NOT NULL, ended_at TIMESTAMP WITH TIME ZONE, queries_count INTEGER DEFAULT 0, browser_info TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id); CREATE INDEX IF NOT EXISTS idx_user_sessions_started_at ON user_sessions(started_at); -- RPC function for incrementing queries count CREATE OR REPLACE FUNCTION increment_session_queries(session_id UUID) RETURNS VOID AS $$ BEGIN UPDATE user_sessions SET queries_count = queries_count + 1 WHERE id = session_id; END; $$ LANGUAGE plpgsql;