Files
cloudlense/frontend/supabase-fixes.sql
T
Dennis 50e25e3ee8 refactor: flatten monorepo structure to backend/ frontend/ devops/
Rename subdirectories for a cleaner single-repo layout:
- website-monitoring-backend/  → backend/
- website-monitoring-frontend/ → frontend/
- website-monitoring-devops/   → devops/

Update all references in package.json scripts, CI workflows,
docker-compose, pre-commit hooks, and documentation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-07 00:25:29 +01:00

228 lines
8.8 KiB
SQL

-- Supabase Database Fixes for Website Monitoring Frontend
-- Run this in your Supabase SQL editor
-- 0. Create missing enum types if they don't exist
DO $$ BEGIN
CREATE TYPE scan_status AS ENUM (
'pending',
'queued',
'running',
'completed',
'failed',
'cancelled'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE severity_level AS ENUM (
'critical',
'high',
'medium',
'low',
'info'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE comparison_operator AS ENUM (
'less_than',
'less_than_equal',
'greater_than',
'greater_than_equal',
'equal_to',
'not_equal_to'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE metric_category AS ENUM (
'performance',
'seo',
'accessibility',
'best_practices',
'security',
'pwa'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE resource_type AS ENUM (
'script',
'stylesheet',
'image',
'font',
'document',
'media',
'other'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE notification_channel AS ENUM (
'email',
'slack',
'webhook',
'in_app'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE subscription_tier AS ENUM (
'free',
'starter',
'professional',
'enterprise'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE user_role AS ENUM (
'owner',
'admin',
'editor',
'viewer'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- 1. Add missing columns to scans table
ALTER TABLE scans ADD COLUMN IF NOT EXISTS scheduled_at TIMESTAMPTZ;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS trigger_type VARCHAR DEFAULT 'manual';
ALTER TABLE scans ADD COLUMN IF NOT EXISTS website_id UUID REFERENCES websites(id);
ALTER TABLE scans ADD COLUMN IF NOT EXISTS triggered_by UUID REFERENCES users(id);
ALTER TABLE scans ADD COLUMN IF NOT EXISTS scan_type VARCHAR DEFAULT 'full';
ALTER TABLE scans ADD COLUMN IF NOT EXISTS priority INTEGER DEFAULT 1;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS categories TEXT[] DEFAULT ARRAY['performance', 'seo', 'accessibility', 'best_practices'];
ALTER TABLE scans ADD COLUMN IF NOT EXISTS device_type VARCHAR DEFAULT 'desktop';
ALTER TABLE scans ADD COLUMN IF NOT EXISTS user_agent VARCHAR;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS lighthouse_version VARCHAR;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS chrome_version VARCHAR;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS environment JSONB DEFAULT '{}'::jsonb;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS started_at TIMESTAMPTZ DEFAULT NOW();
ALTER TABLE scans ADD COLUMN IF NOT EXISTS completed_at TIMESTAMPTZ;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS duration_ms INTEGER;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS error_message TEXT;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS retry_count INTEGER DEFAULT 0;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS metadata JSONB DEFAULT '{}'::jsonb;
ALTER TABLE scans ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ DEFAULT NOW();
-- 2. Add missing columns to scan_results table if they don't exist
ALTER TABLE scan_results ADD COLUMN IF NOT EXISTS raw_data JSONB DEFAULT '{}'::jsonb;
-- 3. Add missing columns to metric_values table if they don't exist
ALTER TABLE metric_values ADD COLUMN IF NOT EXISTS raw_value VARCHAR;
ALTER TABLE metric_values ADD COLUMN IF NOT EXISTS unit VARCHAR;
ALTER TABLE metric_values ADD COLUMN IF NOT EXISTS is_passing BOOLEAN;
-- 4. Add missing columns to resource_analysis table if they don't exist
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS transfer_size_bytes INTEGER;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS duration_ms INTEGER;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS is_third_party BOOLEAN DEFAULT false;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS is_cached BOOLEAN;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS compression_ratio NUMERIC;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS mime_type VARCHAR;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS protocol VARCHAR;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS priority VARCHAR;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS status_code INTEGER;
ALTER TABLE resource_analysis ADD COLUMN IF NOT EXISTS metadata JSONB DEFAULT '{}'::jsonb;
-- 5. Add missing columns to alert_configurations table if they don't exist
ALTER TABLE alert_configurations ADD COLUMN IF NOT EXISTS consecutive_count INTEGER DEFAULT 1;
ALTER TABLE alert_configurations ADD COLUMN IF NOT EXISTS cooldown_minutes INTEGER DEFAULT 60;
ALTER TABLE alert_configurations ADD COLUMN IF NOT EXISTS notification_template TEXT;
ALTER TABLE alert_configurations ADD COLUMN IF NOT EXISTS last_triggered_at TIMESTAMPTZ;
-- 6. Add missing columns to alerts table if they don't exist
ALTER TABLE alerts ADD COLUMN IF NOT EXISTS details JSONB DEFAULT '{}'::jsonb;
ALTER TABLE alerts ADD COLUMN IF NOT EXISTS acknowledged_by UUID REFERENCES users(id);
ALTER TABLE alerts ADD COLUMN IF NOT EXISTS acknowledged_at TIMESTAMPTZ;
ALTER TABLE alerts ADD COLUMN IF NOT EXISTS resolved_at TIMESTAMPTZ;
-- 7. Add missing columns to crawl_queue table if they don't exist
ALTER TABLE crawl_queue ADD COLUMN IF NOT EXISTS discovery_depth INTEGER DEFAULT 0;
ALTER TABLE crawl_queue ADD COLUMN IF NOT EXISTS attempts INTEGER DEFAULT 0;
ALTER TABLE crawl_queue ADD COLUMN IF NOT EXISTS parent_url VARCHAR;
ALTER TABLE crawl_queue ADD COLUMN IF NOT EXISTS priority INTEGER DEFAULT 1;
ALTER TABLE crawl_queue ADD COLUMN IF NOT EXISTS error_message TEXT;
ALTER TABLE crawl_queue ADD COLUMN IF NOT EXISTS metadata JSONB DEFAULT '{}'::jsonb;
-- 8. Add missing columns to crawl_sessions table if they don't exist
ALTER TABLE crawl_sessions ADD COLUMN IF NOT EXISTS pages_discovered INTEGER DEFAULT 0;
ALTER TABLE crawl_sessions ADD COLUMN IF NOT EXISTS pages_processed INTEGER DEFAULT 0;
ALTER TABLE crawl_sessions ADD COLUMN IF NOT EXISTS current_url VARCHAR;
ALTER TABLE crawl_sessions ADD COLUMN IF NOT EXISTS error_message TEXT;
ALTER TABLE crawl_sessions ADD COLUMN IF NOT EXISTS metadata JSONB DEFAULT '{}'::jsonb;
-- 9. Create indexes if they don't exist
CREATE INDEX IF NOT EXISTS idx_scans_scheduled_at ON scans(scheduled_at);
CREATE INDEX IF NOT EXISTS idx_scan_results_category ON scan_results(category);
CREATE INDEX IF NOT EXISTS idx_metric_values_created_at ON metric_values(created_at);
CREATE INDEX IF NOT EXISTS idx_resource_analysis_type ON resource_analysis(resource_type);
CREATE INDEX IF NOT EXISTS idx_alerts_status ON alerts(status);
CREATE INDEX IF NOT EXISTS idx_crawl_queue_status_priority ON crawl_queue(status, priority);
CREATE INDEX IF NOT EXISTS idx_crawl_sessions_status ON crawl_sessions(status);
-- 10. Add RLS policies if they don't exist (basic ones)
-- Note: You may need to customize these based on your security requirements
-- Enable RLS on all tables
ALTER TABLE scans ENABLE ROW LEVEL SECURITY;
ALTER TABLE scan_results ENABLE ROW LEVEL SECURITY;
ALTER TABLE metric_values ENABLE ROW LEVEL SECURITY;
ALTER TABLE resource_analysis ENABLE ROW LEVEL SECURITY;
ALTER TABLE alert_configurations ENABLE ROW LEVEL SECURITY;
ALTER TABLE alerts ENABLE ROW LEVEL SECURITY;
ALTER TABLE crawl_queue ENABLE ROW LEVEL SECURITY;
ALTER TABLE crawl_sessions ENABLE ROW LEVEL SECURITY;
-- Basic RLS policies (you may want to customize these)
CREATE POLICY IF NOT EXISTS "Users can view scans for their organization" ON scans
FOR SELECT USING (
website_id IN (
SELECT id FROM websites WHERE organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
)
)
);
CREATE POLICY IF NOT EXISTS "Users can insert scans for their organization" ON scans
FOR INSERT WITH CHECK (
website_id IN (
SELECT id FROM websites WHERE organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
)
)
);
CREATE POLICY IF NOT EXISTS "Users can update scans for their organization" ON scans
FOR UPDATE USING (
website_id IN (
SELECT id FROM websites WHERE organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
)
)
);
-- Similar policies for other tables...
-- (You may want to add more comprehensive RLS policies based on your needs)
-- 11. Refresh Supabase schema cache to pick up new columns
-- This is important to resolve "Could not find column in schema cache" errors
NOTIFY pgrst, 'reload schema';
COMMIT;