fake-news-api / scripts /setup_supabase.sql
aviseth
feat: Phase 1 enhancements - ensemble endpoint, history API, rate limiting, storage monitoring
1a5863d
DROP TABLE IF EXISTS user_analysis_history CASCADE;
DROP TABLE IF EXISTS feedback CASCADE;
DROP TABLE IF EXISTS predictions CASCADE;
DROP TABLE IF EXISTS news_articles CASCADE;
DROP TABLE IF EXISTS model_performance CASCADE;
DROP TABLE IF EXISTS user_sessions CASCADE;
DROP VIEW IF EXISTS prediction_stats CASCADE;
DROP VIEW IF EXISTS daily_predictions CASCADE;
DROP VIEW IF EXISTS feedback_accuracy CASCADE;
DROP VIEW IF EXISTS model_comparison CASCADE;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE predictions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
article_id VARCHAR NOT NULL UNIQUE,
text TEXT,
predicted_label VARCHAR(50) NOT NULL,
confidence FLOAT NOT NULL,
model_name VARCHAR(100) NOT NULL,
explanation JSONB,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_pred_created ON predictions(created_at DESC);
CREATE INDEX idx_pred_label ON predictions(predicted_label);
CREATE INDEX idx_pred_model ON predictions(model_name);
CREATE TABLE feedback (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
article_id VARCHAR NOT NULL,
predicted_label VARCHAR(50) NOT NULL,
actual_label VARCHAR(50) NOT NULL,
user_comment TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_fb_created ON feedback(created_at DESC);
CREATE INDEX idx_fb_article ON feedback(article_id);
CREATE TABLE news_articles (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
title TEXT NOT NULL,
description TEXT,
content TEXT,
url TEXT NOT NULL UNIQUE,
image_url TEXT,
published_at TIMESTAMPTZ,
source_name VARCHAR(255),
source_url TEXT,
fetched_at TIMESTAMPTZ DEFAULT NOW(),
analyzed BOOLEAN DEFAULT FALSE,
prediction_id UUID
);
CREATE INDEX idx_news_published ON news_articles(published_at DESC);
CREATE INDEX idx_news_analyzed ON news_articles(analyzed);
CREATE TABLE model_performance (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
model_name VARCHAR(100) NOT NULL,
accuracy FLOAT,
precision FLOAT,
recall FLOAT,
f1_score FLOAT,
total_predictions INTEGER DEFAULT 0,
correct_predictions INTEGER DEFAULT 0,
evaluated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE user_sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
session_id VARCHAR NOT NULL UNIQUE,
user_agent TEXT,
ip_address INET,
created_at TIMESTAMPTZ DEFAULT NOW(),
last_activity TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE 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
);
CREATE INDEX idx_history_session_created ON user_analysis_history(session_id, created_at DESC);
CREATE INDEX idx_history_article ON user_analysis_history(article_id);
ALTER TABLE predictions DISABLE ROW LEVEL SECURITY;
ALTER TABLE feedback DISABLE ROW LEVEL SECURITY;
ALTER TABLE news_articles DISABLE ROW LEVEL SECURITY;
ALTER TABLE model_performance DISABLE ROW LEVEL SECURITY;
ALTER TABLE user_sessions DISABLE ROW LEVEL SECURITY;
ALTER TABLE user_analysis_history ENABLE ROW LEVEL SECURITY;
CREATE POLICY "allow_all_history" ON user_analysis_history FOR ALL USING (true) WITH CHECK (true);
CREATE VIEW prediction_stats AS
SELECT predicted_label, COUNT(*) AS total_count, AVG(confidence) AS avg_confidence
FROM predictions
GROUP BY predicted_label;
CREATE VIEW feedback_accuracy AS
SELECT predicted_label, actual_label, COUNT(*) AS count
FROM feedback
GROUP BY predicted_label, actual_label
ORDER BY count DESC;