41 lines
1.4 KiB
SQL
41 lines
1.4 KiB
SQL
-- Scrape results cache
|
|
CREATE TABLE IF NOT EXISTS scrape_results (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
url TEXT NOT NULL,
|
|
clinic_name TEXT,
|
|
data JSONB NOT NULL DEFAULT '{}',
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Marketing intelligence reports
|
|
CREATE TABLE IF NOT EXISTS marketing_reports (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
url TEXT NOT NULL,
|
|
clinic_name TEXT,
|
|
report JSONB NOT NULL DEFAULT '{}',
|
|
scrape_data JSONB DEFAULT '{}',
|
|
analysis_data JSONB DEFAULT '{}',
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Enable RLS
|
|
ALTER TABLE scrape_results ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE marketing_reports ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Service role can do everything (Edge Functions use service_role key)
|
|
CREATE POLICY "service_role_all_scrape" ON scrape_results
|
|
FOR ALL USING (auth.role() = 'service_role');
|
|
|
|
CREATE POLICY "service_role_all_reports" ON marketing_reports
|
|
FOR ALL USING (auth.role() = 'service_role');
|
|
|
|
-- Anon users can read their own reports (future: add user_id column)
|
|
CREATE POLICY "anon_read_reports" ON marketing_reports
|
|
FOR SELECT USING (true);
|
|
|
|
-- Index for faster lookups
|
|
CREATE INDEX idx_scrape_results_url ON scrape_results(url);
|
|
CREATE INDEX idx_marketing_reports_url ON marketing_reports(url);
|
|
CREATE INDEX idx_marketing_reports_created ON marketing_reports(created_at DESC);
|