File size: 7,181 Bytes
48b0cc4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db43121
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c02daee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc4815d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
-- 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);