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';