-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.sql
More file actions
208 lines (182 loc) · 9.05 KB
/
schema.sql
File metadata and controls
208 lines (182 loc) · 9.05 KB
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
-- LeadSniper Database Schema
-- Run this in your Supabase SQL Editor (Dashboard > SQL Editor > New Query)
-- This creates all required tables, enums, and policies.
-- ═══════════════════════════════════════════════════════════
-- 1. ENUMS
-- ═══════════════════════════════════════════════════════════
CREATE TYPE ms_lead_status AS ENUM (
'new', 'contacted', 'follow_up', 'replied', 'converted', 'bad_lead', 'no_response'
);
CREATE TYPE ms_search_status AS ENUM (
'pending', 'running', 'completed', 'failed'
);
-- ═══════════════════════════════════════════════════════════
-- 2. SEARCHES
-- ═══════════════════════════════════════════════════════════
CREATE TABLE ms_searches (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
niche TEXT NOT NULL,
city TEXT NOT NULL,
country TEXT,
total_results INTEGER DEFAULT 0,
status ms_search_status DEFAULT 'pending',
error_message TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
completed_at TIMESTAMPTZ
);
-- ═══════════════════════════════════════════════════════════
-- 3. LEADS
-- ═══════════════════════════════════════════════════════════
CREATE TABLE ms_leads (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
search_id UUID REFERENCES ms_searches(id) ON DELETE CASCADE,
business_name TEXT NOT NULL,
google_place_id TEXT UNIQUE,
google_maps_url TEXT,
rating NUMERIC(2,1),
review_count INTEGER DEFAULT 0,
address TEXT,
website_url TEXT,
phone TEXT,
whatsapp_link TEXT,
has_website BOOLEAN DEFAULT false,
emails TEXT[] DEFAULT '{}',
social_links JSONB DEFAULT '{}',
has_mobile_app BOOLEAN DEFAULT false,
app_store_url TEXT,
play_store_url TEXT,
tech_stack TEXT[] DEFAULT '{}',
page_speed_score INTEGER,
mobile_friendly BOOLEAN,
load_time_ms INTEGER,
pitch_angles TEXT[] DEFAULT '{}',
pitch_summary TEXT,
ai_email_draft TEXT,
status ms_lead_status DEFAULT 'new',
email_valid BOOLEAN,
phone_valid BOOLEAN,
website_valid BOOLEAN,
notes TEXT,
contacted_at TIMESTAMPTZ,
replied_at TIMESTAMPTZ,
converted_at TIMESTAMPTZ,
enriched_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now(),
-- Opportunity scoring
opportunity_score INTEGER,
score_breakdown JSONB,
service_opportunities TEXT[] DEFAULT '{}',
-- Detailed metrics (PageSpeed + crawl)
fcp_ms INTEGER,
lcp_ms INTEGER,
cls_score NUMERIC(6,3),
tti_ms INTEGER,
has_ssl BOOLEAN,
has_viewport_meta BOOLEAN,
has_meta_description BOOLEAN,
has_og_tags BOOLEAN,
has_structured_data BOOLEAN,
has_alt_tags BOOLEAN,
image_optimization_score INTEGER,
content_freshness_year INTEGER,
has_online_booking BOOLEAN,
has_pwa BOOLEAN,
-- Follow-up system
follow_up_at TIMESTAMPTZ,
follow_up_count INTEGER DEFAULT 0,
last_contacted_at TIMESTAMPTZ,
follow_up_interval_days INTEGER DEFAULT 7,
-- Contact tracking
contact_channel TEXT,
contact_outcome TEXT
);
-- ═══════════════════════════════════════════════════════════
-- 4. SETTINGS (API keys, user info)
-- ═══════════════════════════════════════════════════════════
CREATE TABLE ms_settings (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
key TEXT UNIQUE NOT NULL,
value TEXT NOT NULL,
description TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ═══════════════════════════════════════════════════════════
-- 5. ANALYTICS EVENTS
-- ═══════════════════════════════════════════════════════════
CREATE TABLE ms_analytics_events (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
lead_id UUID REFERENCES ms_leads(id) ON DELETE SET NULL,
search_id UUID REFERENCES ms_searches(id) ON DELETE SET NULL,
event_type TEXT NOT NULL,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT now()
);
-- ═══════════════════════════════════════════════════════════
-- 6. SEARCH REQUESTS (dashboard → scraper queue)
-- ═══════════════════════════════════════════════════════════
CREATE TABLE ms_search_requests (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
niche TEXT NOT NULL,
city TEXT NOT NULL,
country TEXT,
max_results INTEGER DEFAULT 100,
skip_crawl BOOLEAN DEFAULT false,
skip_analysis BOOLEAN DEFAULT false,
skip_ai BOOLEAN DEFAULT false,
status ms_search_status DEFAULT 'pending',
error_message TEXT,
search_id UUID REFERENCES ms_searches(id),
created_at TIMESTAMPTZ DEFAULT now(),
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ
);
-- ═══════════════════════════════════════════════════════════
-- 7. SEARCH PRESETS (saved search templates)
-- ═══════════════════════════════════════════════════════════
CREATE TABLE ms_search_presets (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name TEXT NOT NULL,
niche TEXT NOT NULL,
city TEXT NOT NULL,
country TEXT,
max_results INTEGER DEFAULT 100,
created_at TIMESTAMPTZ DEFAULT now()
);
-- ═══════════════════════════════════════════════════════════
-- 8. CONTACT LOG (per-lead contact history)
-- ═══════════════════════════════════════════════════════════
CREATE TABLE ms_contact_log (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
lead_id UUID REFERENCES ms_leads(id) ON DELETE CASCADE,
channel TEXT NOT NULL,
outcome TEXT,
notes TEXT,
contacted_at TIMESTAMPTZ DEFAULT now(),
created_at TIMESTAMPTZ DEFAULT now()
);
-- ═══════════════════════════════════════════════════════════
-- 9. ROW LEVEL SECURITY (allow all — this is a personal tool)
-- ═══════════════════════════════════════════════════════════
ALTER TABLE ms_searches ENABLE ROW LEVEL SECURITY;
ALTER TABLE ms_leads ENABLE ROW LEVEL SECURITY;
ALTER TABLE ms_settings ENABLE ROW LEVEL SECURITY;
ALTER TABLE ms_analytics_events ENABLE ROW LEVEL SECURITY;
ALTER TABLE ms_search_requests ENABLE ROW LEVEL SECURITY;
ALTER TABLE ms_search_presets ENABLE ROW LEVEL SECURITY;
ALTER TABLE ms_contact_log ENABLE ROW LEVEL SECURITY;
-- Allow-all policies (personal tool — add auth if you expose publicly)
CREATE POLICY "Allow all" ON ms_searches FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all" ON ms_leads FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all" ON ms_settings FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all" ON ms_analytics_events FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all" ON ms_search_requests FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all" ON ms_search_presets FOR ALL USING (true) WITH CHECK (true);
CREATE POLICY "Allow all" ON ms_contact_log FOR ALL USING (true) WITH CHECK (true);
-- ═══════════════════════════════════════════════════════════
-- 10. REALTIME (enable for live dashboard updates)
-- ═══════════════════════════════════════════════════════════
ALTER PUBLICATION supabase_realtime ADD TABLE ms_leads;
ALTER PUBLICATION supabase_realtime ADD TABLE ms_searches;
ALTER PUBLICATION supabase_realtime ADD TABLE ms_search_requests;