Spaces:
Sleeping
Sleeping
File size: 6,081 Bytes
467cc9d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | -- 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';
|