-- Vish AI - Supabase Database Setup -- Run this in your Supabase SQL Editor -- https://supabase.com/dashboard/project/lyebtceryednzafhyunq/sql -- ============================================ -- 1. Create Logs Table -- ============================================ CREATE TABLE IF NOT EXISTS vish_ai_logs ( id BIGSERIAL PRIMARY KEY, user_email TEXT, prompt TEXT, response TEXT, model_type TEXT CHECK (model_type IN ('chat', 'summarization', 'sentiment')), timestamp TIMESTAMPTZ DEFAULT NOW(), created_at TIMESTAMPTZ DEFAULT NOW() ); -- ============================================ -- 2. Create Indexes for Performance -- ============================================ CREATE INDEX IF NOT EXISTS idx_vish_ai_logs_user ON vish_ai_logs(user_email); CREATE INDEX IF NOT EXISTS idx_vish_ai_logs_timestamp ON vish_ai_logs(timestamp DESC); CREATE INDEX IF NOT EXISTS idx_vish_ai_logs_model_type ON vish_ai_logs(model_type); -- ============================================ -- 3. Enable Row Level Security (RLS) -- ============================================ ALTER TABLE vish_ai_logs ENABLE ROW LEVEL SECURITY; -- ============================================ -- 4. Create RLS Policies -- ============================================ -- Policy: Users can view their own logs DROP POLICY IF EXISTS "Users can view own logs" ON vish_ai_logs; CREATE POLICY "Users can view own logs" ON vish_ai_logs FOR SELECT USING (auth.jwt() ->> 'email' = user_email); -- Policy: Service role can insert logs (for anonymous + authenticated) DROP POLICY IF EXISTS "Service role can insert logs" ON vish_ai_logs; CREATE POLICY "Service role can insert logs" ON vish_ai_logs FOR INSERT WITH CHECK (true); -- Policy: Users can view anonymous logs (optional - remove if you want privacy) DROP POLICY IF EXISTS "Anyone can view anonymous logs" ON vish_ai_logs; CREATE POLICY "Anyone can view anonymous logs" ON vish_ai_logs FOR SELECT USING (user_email = 'anonymous'); -- ============================================ -- 5. Create Analytics View (Optional) -- ============================================ CREATE OR REPLACE VIEW vish_ai_analytics AS SELECT DATE_TRUNC('day', timestamp) as date, model_type, COUNT(*) as interaction_count, COUNT(DISTINCT user_email) as unique_users, AVG(LENGTH(prompt)) as avg_prompt_length, AVG(LENGTH(response)) as avg_response_length FROM vish_ai_logs GROUP BY DATE_TRUNC('day', timestamp), model_type ORDER BY date DESC, model_type; -- ============================================ -- 6. Grant Permissions -- ============================================ -- Allow authenticated users to read analytics GRANT SELECT ON vish_ai_analytics TO authenticated; -- Allow service role full access GRANT ALL ON vish_ai_logs TO service_role; -- ============================================ -- 7. Create Function for User Statistics -- ============================================ CREATE OR REPLACE FUNCTION get_user_stats(user_email_param TEXT) RETURNS TABLE ( total_interactions BIGINT, chat_count BIGINT, summarization_count BIGINT, sentiment_count BIGINT, first_interaction TIMESTAMPTZ, last_interaction TIMESTAMPTZ ) AS $$ BEGIN RETURN QUERY SELECT COUNT(*) as total_interactions, COUNT(*) FILTER (WHERE model_type = 'chat') as chat_count, COUNT(*) FILTER (WHERE model_type = 'summarization') as summarization_count, COUNT(*) FILTER (WHERE model_type = 'sentiment') as sentiment_count, MIN(timestamp) as first_interaction, MAX(timestamp) as last_interaction FROM vish_ai_logs WHERE user_email = user_email_param; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- ============================================ -- 8. Create Trigger for Updated At (Optional) -- ============================================ CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Add updated_at column if you want to track modifications -- ALTER TABLE vish_ai_logs ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ DEFAULT NOW(); -- CREATE TRIGGER update_vish_ai_logs_updated_at -- BEFORE UPDATE ON vish_ai_logs -- FOR EACH ROW -- EXECUTE FUNCTION update_updated_at_column(); -- ============================================ -- 9. Sample Queries for Testing -- ============================================ -- View all logs (as service role or authenticated user viewing their own) -- SELECT * FROM vish_ai_logs ORDER BY timestamp DESC LIMIT 10; -- Get analytics for last 7 days -- SELECT * FROM vish_ai_analytics -- WHERE date > NOW() - INTERVAL '7 days' -- ORDER BY date DESC; -- Get user statistics -- SELECT * FROM get_user_stats('user@example.com'); -- Count interactions by model type -- SELECT model_type, COUNT(*) as count -- FROM vish_ai_logs -- GROUP BY model_type; -- ============================================ -- 10. Cleanup Old Logs (Optional - for data retention) -- ============================================ -- Create function to delete logs older than 90 days CREATE OR REPLACE FUNCTION cleanup_old_logs() RETURNS INTEGER AS $$ DECLARE deleted_count INTEGER; BEGIN DELETE FROM vish_ai_logs WHERE timestamp < NOW() - INTERVAL '90 days'; GET DIAGNOSTICS deleted_count = ROW_COUNT; RETURN deleted_count; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- To run cleanup manually: -- SELECT cleanup_old_logs(); -- To schedule automatic cleanup, you can use pg_cron extension: -- SELECT cron.schedule('cleanup-vish-ai-logs', '0 0 * * 0', 'SELECT cleanup_old_logs()'); -- ============================================ -- Setup Complete! ✅ -- ============================================ -- Verify the setup: SELECT 'Tables' as type, COUNT(*) as count FROM information_schema.tables WHERE table_name = 'vish_ai_logs' UNION ALL SELECT 'Policies' as type, COUNT(*) as count FROM pg_policies WHERE tablename = 'vish_ai_logs';