venorly-api / supabase_schema.sql
tarikmenguc
Add users schema and Stripe/Clerk webhooks for B2B SaaS
48b0cc4
Raw History Blame Contribute Delete
7.18 kB
-- Users (B2B SaaS Abonelik ve Kredi Takibi)
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
clerk_id TEXT UNIQUE NOT NULL,
stripe_customer_id TEXT UNIQUE,
email TEXT NOT NULL,
plan_type TEXT DEFAULT 'free',
credits INT DEFAULT 5,
created_at TIMESTAMPTZ DEFAULT now()
);
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON users FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON users FOR INSERT WITH CHECK (true);
CREATE POLICY "Enable update access for all users" ON users FOR UPDATE USING (true);
-- Scans (Taramalar)
CREATE TABLE scans (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
category TEXT NOT NULL,
mode TEXT NOT NULL,
status TEXT DEFAULT 'completed',
report_preview TEXT,
leads_count INT DEFAULT 0,
angles_count INT DEFAULT 0,
full_report JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Leads (Müşteri Adayları)
CREATE TABLE leads (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
source TEXT NOT NULL,
title TEXT NOT NULL,
url TEXT,
description TEXT,
score INT DEFAULT 0,
status TEXT DEFAULT 'new',
dm_template TEXT,
scan_category TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Waitlists (Bekleme Listeleri)
CREATE TABLE waitlists (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
description TEXT,
target_audience TEXT,
emails TEXT[] DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT now()
);
-- Allow public access for now since we don't have auth yet
ALTER TABLE scans ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON scans FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON scans FOR INSERT WITH CHECK (true);
CREATE POLICY "Enable update access for all users" ON scans FOR UPDATE USING (true);
ALTER TABLE leads ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON leads FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON leads FOR INSERT WITH CHECK (true);
CREATE POLICY "Enable update access for all users" ON leads FOR UPDATE USING (true);
ALTER TABLE waitlists ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON waitlists FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON waitlists FOR INSERT WITH CHECK (true);
CREATE POLICY "Enable update access for all users" ON waitlists FOR UPDATE USING (true);
-- Chat Messages (AI Fikir Danışmanı Sohbet Geçmişi)
CREATE TABLE chat_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
scan_id TEXT NOT NULL,
role TEXT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT now()
);
ALTER TABLE chat_messages ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON chat_messages FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON chat_messages FOR INSERT WITH CHECK (true);
-- ============================================================
-- GALLERY (Discover Gallery — V8)
-- Mevcut scans tablosuna gallery kolonları eklenir.
-- Supabase SQL Editöründe çalıştır.
-- ============================================================
ALTER TABLE scans ADD COLUMN IF NOT EXISTS is_gallery BOOLEAN DEFAULT false;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS gallery_title TEXT;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS gallery_summary TEXT;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS gallery_tags TEXT[];
ALTER TABLE scans ADD COLUMN IF NOT EXISTS gallery_score INT DEFAULT 0;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS gallery_emoji TEXT DEFAULT '💡';
-- "2025-W15" formatı — aynı kategori + hafta için dedup
ALTER TABLE scans ADD COLUMN IF NOT EXISTS gallery_week TEXT;
-- Duplikasyon önleme: aynı kategori + aynı hafta sadece 1 galeri kaydı
CREATE UNIQUE INDEX IF NOT EXISTS idx_gallery_category_week
ON scans (category, gallery_week)
WHERE is_gallery = true;
-- Galeri listeleme sorguları için bileşik index
CREATE INDEX IF NOT EXISTS idx_gallery_listing
ON scans (is_gallery, gallery_score DESC, created_at DESC)
WHERE is_gallery = true;
-- ============================================================
-- ALERTS (Niş Alarm Sistemi — V8)
-- ============================================================
CREATE TABLE IF NOT EXISTS alerts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
keyword TEXT NOT NULL,
email TEXT NOT NULL,
channels TEXT[] DEFAULT '{"reddit","github","huggingface"}',
frequency TEXT DEFAULT 'daily', -- 'daily' | 'weekly'
is_active BOOLEAN DEFAULT true,
last_triggered_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT now()
);
ALTER TABLE alerts ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON alerts FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON alerts FOR INSERT WITH CHECK (true);
CREATE POLICY "Enable update access for all users" ON alerts FOR UPDATE USING (true);
CREATE POLICY "Enable delete access for all users" ON alerts FOR DELETE USING (true);
CREATE INDEX IF NOT EXISTS idx_alerts_active ON alerts (is_active, frequency) WHERE is_active = true;
-- ============================================================
-- API PRICING (Birim Maliyet Veritabanı — S1)
-- AI sağlayıcılarının güncel fiyat snapshot'ları.
-- ============================================================
CREATE TABLE IF NOT EXISTS api_pricing (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
provider TEXT NOT NULL,
model TEXT NOT NULL,
unit TEXT,
price_usd TEXT,
note TEXT,
scraped_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_api_pricing_provider ON api_pricing (provider, model, scraped_at DESC);
ALTER TABLE api_pricing ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON api_pricing FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON api_pricing FOR INSERT WITH CHECK (true);
-- ============================================================
-- AUDIT TRAIL (Güven Endeksi Denetim Kaydı — S1/S5)
-- Her rapordaki iddiaların kaynak eşleştirme sonuçları.
-- ============================================================
CREATE TABLE IF NOT EXISTS audit_trail (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
report_id TEXT NOT NULL,
claim_text TEXT NOT NULL,
claim_class TEXT, -- 'critical' | 'material' | 'descriptive'
source_url TEXT,
verified BOOLEAN DEFAULT false,
confidence FLOAT,
unknown_category TEXT, -- fallback durumunda kategori logu
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_audit_trail_report ON audit_trail (report_id);
ALTER TABLE audit_trail ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable read access for all users" ON audit_trail FOR SELECT USING (true);
CREATE POLICY "Enable insert access for all users" ON audit_trail FOR INSERT WITH CHECK (true);