fake-news-api / scripts /phase2_migration.sql
aviseth
feat: Phase 1 enhancements - ensemble endpoint, history API, rate limiting, storage monitoring
1a5863d
-- Phase 2: User Analysis History Database Migration
-- This script creates the user_analysis_history table and related indexes
-- Execute this in your Supabase SQL Editor
-- Step 1: Create the user_analysis_history table
CREATE TABLE IF NOT EXISTS user_analysis_history (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
session_id VARCHAR(36) NOT NULL,
article_id VARCHAR(36) NOT NULL UNIQUE,
text_preview VARCHAR(200) NOT NULL,
predicted_label VARCHAR(50) NOT NULL CHECK (predicted_label IN ('True', 'Fake', 'Satire', 'Bias')),
confidence FLOAT NOT NULL CHECK (confidence >= 0.0 AND confidence <= 1.0),
model_name VARCHAR(100) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
CONSTRAINT fk_article FOREIGN KEY (article_id) REFERENCES predictions(article_id) ON DELETE CASCADE
);
-- Step 2: Create indexes for efficient queries
CREATE INDEX IF NOT EXISTS idx_history_session_created ON user_analysis_history(session_id, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_history_article ON user_analysis_history(article_id);
-- Step 3: Enable row-level security
ALTER TABLE user_analysis_history ENABLE ROW LEVEL SECURITY;
-- Step 4: Create policy to allow all operations (for development)
-- Note: In production, you should restrict this based on your security requirements
DROP POLICY IF EXISTS "allow_all_history" ON user_analysis_history;
CREATE POLICY "allow_all_history" ON user_analysis_history FOR ALL USING (true) WITH CHECK (true);
-- Step 5: Verify the table was created
SELECT
table_name,
column_name,
data_type,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_name = 'user_analysis_history'
ORDER BY ordinal_position;
-- Step 6: Verify indexes were created
SELECT
indexname,
indexdef
FROM pg_indexes
WHERE tablename = 'user_analysis_history';
-- Step 7: Verify RLS policy was created
SELECT
policyname,
permissive,
roles,
cmd
FROM pg_policies
WHERE tablename = 'user_analysis_history';
-- Optional: Insert a test record to verify everything works
-- Uncomment the following lines to test (replace with actual article_id from predictions table)
/*
DO $$
DECLARE
test_article_id VARCHAR(36);
test_session_id VARCHAR(36);
BEGIN
-- First, insert a test prediction
test_article_id := gen_random_uuid()::text;
test_session_id := gen_random_uuid()::text;
INSERT INTO predictions (article_id, text, predicted_label, confidence, model_name)
VALUES (test_article_id, 'Test article for migration verification', 'True', 0.95, 'ensemble');
-- Then, insert a test history record
INSERT INTO user_analysis_history (session_id, article_id, text_preview, predicted_label, confidence, model_name)
VALUES (test_session_id, test_article_id, 'Test article for migration verification', 'True', 0.95, 'ensemble');
-- Verify the record was inserted
IF EXISTS (SELECT 1 FROM user_analysis_history WHERE article_id = test_article_id) THEN
RAISE NOTICE 'Test record inserted successfully!';
ELSE
RAISE EXCEPTION 'Test record insertion failed!';
END IF;
-- Clean up test data
DELETE FROM user_analysis_history WHERE article_id = test_article_id;
DELETE FROM predictions WHERE article_id = test_article_id;
RAISE NOTICE 'Test data cleaned up. Migration verification complete!';
END $$;
*/