-- -- PostgreSQL database dump (Upgraded & Production-Ready for LarShield) -- Dumped with full Policy Consent tracking, Vulnerability Lifecycle Management, -- Scan Metrics, Foreign Key Cascades, Indexes, and System Seed Data. -- SET statement_timeout = 0; SET lock_timeout = 0; SET idle_in_transaction_session_timeout = 0; SET transaction_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; SELECT pg_catalog.set_config('search_path', '', false); SET check_function_bodies = false; SET xmloption = content; SET client_min_messages = warning; SET row_security = off; SET default_tablespace = ''; SET default_table_access_method = heap; -- -------------------------------------------------------- -- Name: subscription_tiers; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.subscription_tiers ( id character varying(50) NOT NULL, name character varying(100) NOT NULL, monthly_price integer DEFAULT 0 NOT NULL, yearly_price integer DEFAULT 0 NOT NULL ); ALTER TABLE public.subscription_tiers OWNER TO postgres; -- -------------------------------------------------------- -- Name: organizations; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.organizations ( id character varying(36) NOT NULL, name character varying(150) NOT NULL, subscription_tier character varying(50) DEFAULT 'free'::character varying NOT NULL, status character varying(50) DEFAULT 'active'::character varying, api_key character varying(100), webhook_url character varying(500), report_logo_url character varying(500), created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.organizations OWNER TO postgres; -- -------------------------------------------------------- -- Name: roles; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.roles ( id character varying(36) NOT NULL, name character varying(50) NOT NULL ); ALTER TABLE public.roles OWNER TO postgres; -- -------------------------------------------------------- -- Name: users; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.users ( id character varying(36) NOT NULL, email character varying(120) NOT NULL, password_hash character varying(128) NOT NULL, first_name character varying(100), last_name character varying(100), role character varying(50) DEFAULT 'org_admin'::character varying NOT NULL, org_id character varying(36), failed_login_attempts integer DEFAULT 0, locked_until timestamp without time zone, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, -- Added Policy Consent & Agreement Fields terms_accepted_at timestamp without time zone, privacy_policy_agreed_at timestamp without time zone, policy_version_agreed character varying(20) DEFAULT 'v1.0'::character varying, -- Added Security & MFA Metadata mfa_enabled boolean DEFAULT false, mfa_secret character varying(100), reset_token character varying(255), reset_token_expires timestamp without time zone, email_verified boolean DEFAULT false ); ALTER TABLE public.users OWNER TO postgres; -- -------------------------------------------------------- -- Name: alert_settings; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.alert_settings ( id character varying(36) NOT NULL, user_id character varying(36) NOT NULL, email_notifications boolean DEFAULT true, webhook_url character varying(500), severity_threshold character varying(50) DEFAULT 'Medium'::character varying ); ALTER TABLE public.alert_settings OWNER TO postgres; -- -------------------------------------------------------- -- Name: organization_scan_quotas; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.organization_scan_quotas ( id character varying(36) NOT NULL, org_id character varying(36) NOT NULL, scan_type character varying(50) NOT NULL, allocated_count integer DEFAULT 0 NOT NULL, used_count integer DEFAULT 0 NOT NULL ); ALTER TABLE public.organization_scan_quotas OWNER TO postgres; -- -------------------------------------------------------- -- Name: scans; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.scans ( id character varying(36) NOT NULL, org_id character varying(36) NOT NULL, user_id character varying(36) NOT NULL, target_url character varying(500) NOT NULL, scan_type character varying(50) DEFAULT 'Full'::character varying NOT NULL, status character varying(50) DEFAULT 'queued'::character varying NOT NULL, security_score integer, started_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, completed_at timestamp without time zone, auth_headers json, scan_options json, ssl_info json, -- Added Diagnostics & Pre-aggregated Metrics duration_seconds integer, error_message text, critical_count integer DEFAULT 0, high_count integer DEFAULT 0, medium_count integer DEFAULT 0, low_count integer DEFAULT 0 ); ALTER TABLE public.scans OWNER TO postgres; -- -------------------------------------------------------- -- Name: vulnerabilities; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.vulnerabilities ( id character varying(36) NOT NULL, scan_id character varying(36) NOT NULL, title character varying(200) NOT NULL, severity character varying(50) NOT NULL, category character varying(100) NOT NULL, description text NOT NULL, remediation text NOT NULL, cvss_score double precision NOT NULL, detected_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, evidence text, payload text, request_details text, response_details text, is_false_positive boolean DEFAULT false, cwe_ids json, owasp_category character varying(100), exploit_poc json, remediation_code text, -- Added Lifecycle Status Tracking status character varying(50) DEFAULT 'open'::character varying NOT NULL, remediated_at timestamp without time zone, remediated_by character varying(36) ); ALTER TABLE public.vulnerabilities OWNER TO postgres; -- -------------------------------------------------------- -- Name: scheduled_scans; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.scheduled_scans ( id character varying(36) NOT NULL, org_id character varying(36) NOT NULL, user_id character varying(36) NOT NULL, target_url character varying(500) NOT NULL, scan_type character varying(50) DEFAULT 'Full'::character varying NOT NULL, frequency character varying(50) DEFAULT 'daily'::character varying NOT NULL, schedule_time character varying(5), day_of_week character varying(20), day_of_month integer, specific_date character varying(20), is_active boolean DEFAULT true, auth_headers json, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, last_run_at timestamp without time zone ); ALTER TABLE public.scheduled_scans OWNER TO postgres; -- -------------------------------------------------------- -- Name: payments; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.payments ( id character varying(36) NOT NULL, org_id character varying(36), user_id character varying(36) NOT NULL, razorpay_payment_id character varying(100), razorpay_order_id character varying(100), stripe_session_id character varying(100), stripe_payment_id character varying(100), tier_id character varying(50) NOT NULL, amount integer NOT NULL, currency character varying(10) DEFAULT 'USD'::character varying, status character varying(50) DEFAULT 'successful'::character varying, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.payments OWNER TO postgres; -- -------------------------------------------------------- -- Name: audit_logs; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.audit_logs ( id character varying(36) NOT NULL, admin_id character varying(36) NOT NULL, action character varying(255) NOT NULL, target_id character varying(100), created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.audit_logs OWNER TO postgres; -- -------------------------------------------------------- -- Name: demo_bookings; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.demo_bookings ( id character varying(36) NOT NULL, email character varying(255) NOT NULL, company_size character varying(100) NOT NULL, meeting_date character varying(100) NOT NULL, meeting_time character varying(50) NOT NULL, status character varying(50) DEFAULT 'pending'::character varying NOT NULL, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.demo_bookings OWNER TO postgres; -- -------------------------------------------------------- -- Name: email_logs; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.email_logs ( id character varying(36) NOT NULL, recipient character varying(255) NOT NULL, subject character varying(255) NOT NULL, status character varying(50) DEFAULT 'sent'::character varying NOT NULL, error_message text, sent_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.email_logs OWNER TO postgres; -- -------------------------------------------------------- -- Name: reports; Type: TABLE; Schema: public; Owner: postgres -- -------------------------------------------------------- CREATE TABLE public.reports ( id character varying(36) NOT NULL, scan_id character varying(36) NOT NULL, org_id character varying(36) NOT NULL, report_type character varying(50) NOT NULL, file_path character varying(500), generated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.reports OWNER TO postgres; -- -------------------------------------------------------- -- Primary Keys & Unique Constraints -- -------------------------------------------------------- ALTER TABLE ONLY public.subscription_tiers ADD CONSTRAINT subscription_tiers_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.organizations ADD CONSTRAINT organizations_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.organizations ADD CONSTRAINT organizations_api_key_key UNIQUE (api_key); ALTER TABLE ONLY public.roles ADD CONSTRAINT roles_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.roles ADD CONSTRAINT roles_name_key UNIQUE (name); ALTER TABLE ONLY public.users ADD CONSTRAINT users_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.users ADD CONSTRAINT users_email_key UNIQUE (email); ALTER TABLE ONLY public.alert_settings ADD CONSTRAINT alert_settings_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.organization_scan_quotas ADD CONSTRAINT organization_scan_quotas_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.organization_scan_quotas ADD CONSTRAINT uix_org_scan_type UNIQUE (org_id, scan_type); ALTER TABLE ONLY public.scans ADD CONSTRAINT scans_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.vulnerabilities ADD CONSTRAINT vulnerabilities_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.scheduled_scans ADD CONSTRAINT scheduled_scans_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.payments ADD CONSTRAINT payments_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.payments ADD CONSTRAINT payments_razorpay_payment_id_key UNIQUE (razorpay_payment_id); ALTER TABLE ONLY public.payments ADD CONSTRAINT payments_stripe_payment_id_key UNIQUE (stripe_payment_id); ALTER TABLE ONLY public.payments ADD CONSTRAINT payments_stripe_session_id_key UNIQUE (stripe_session_id); ALTER TABLE ONLY public.audit_logs ADD CONSTRAINT audit_logs_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.demo_bookings ADD CONSTRAINT demo_bookings_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.email_logs ADD CONSTRAINT email_logs_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.reports ADD CONSTRAINT reports_pkey PRIMARY KEY (id); -- -------------------------------------------------------- -- Foreign Key Constraints with ON DELETE CASCADE / SET NULL -- -------------------------------------------------------- ALTER TABLE ONLY public.organizations ADD CONSTRAINT organizations_subscription_tier_fkey FOREIGN KEY (subscription_tier) REFERENCES public.subscription_tiers(id); ALTER TABLE ONLY public.users ADD CONSTRAINT users_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.organizations(id) ON DELETE SET NULL; ALTER TABLE ONLY public.alert_settings ADD CONSTRAINT alert_settings_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; ALTER TABLE ONLY public.organization_scan_quotas ADD CONSTRAINT organization_scan_quotas_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.organizations(id) ON DELETE CASCADE; ALTER TABLE ONLY public.payments ADD CONSTRAINT payments_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.organizations(id) ON DELETE CASCADE, ADD CONSTRAINT payments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; ALTER TABLE ONLY public.scans ADD CONSTRAINT scans_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.organizations(id) ON DELETE CASCADE, ADD CONSTRAINT scans_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; ALTER TABLE ONLY public.scheduled_scans ADD CONSTRAINT scheduled_scans_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.organizations(id) ON DELETE CASCADE, ADD CONSTRAINT scheduled_scans_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; ALTER TABLE ONLY public.vulnerabilities ADD CONSTRAINT vulnerabilities_scan_id_fkey FOREIGN KEY (scan_id) REFERENCES public.scans(id) ON DELETE CASCADE; ALTER TABLE ONLY public.reports ADD CONSTRAINT reports_scan_id_fkey FOREIGN KEY (scan_id) REFERENCES public.scans(id) ON DELETE CASCADE, ADD CONSTRAINT reports_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.organizations(id) ON DELETE CASCADE; -- -------------------------------------------------------- -- Indexes for High-Performance Queries -- -------------------------------------------------------- CREATE INDEX idx_users_org_id ON public.users(org_id); CREATE INDEX idx_scans_org_id ON public.scans(org_id); CREATE INDEX idx_scans_user_id ON public.scans(user_id); CREATE INDEX idx_scans_status ON public.scans(status); CREATE INDEX idx_vulnerabilities_scan_id ON public.vulnerabilities(scan_id); CREATE INDEX idx_vulnerabilities_severity ON public.vulnerabilities(severity); CREATE INDEX idx_vulnerabilities_status ON public.vulnerabilities(status); CREATE INDEX idx_payments_org_id ON public.payments(org_id); CREATE INDEX idx_payments_user_id ON public.payments(user_id); CREATE INDEX idx_scheduled_scans_is_active ON public.scheduled_scans(is_active); CREATE INDEX idx_reports_scan_id ON public.reports(scan_id); CREATE INDEX idx_reports_org_id ON public.reports(org_id); -- -------------------------------------------------------- -- Seed Data: Subscription Tiers, System Roles, Default Org, Admin User -- -------------------------------------------------------- INSERT INTO public.subscription_tiers (id, name, monthly_price, yearly_price) VALUES ('free', 'Free Tier Plan', 0, 0), ('pro', 'Pro Security Plan', 49, 490), ('enterprise', 'Enterprise Shield Plan', 199, 1990) ON CONFLICT (id) DO NOTHING; INSERT INTO public.roles (id, name) VALUES ('role-001', 'super_admin'), ('role-002', 'org_admin'), ('role-003', 'soc_analyst'), ('role-004', 'support_engineer'), ('role-005', 'executive'), ('role-006', 'read_only') ON CONFLICT (id) DO NOTHING; INSERT INTO public.organizations (id, name, subscription_tier, status, api_key, created_at) VALUES ('org-default-001', 'LarShield Security Enterprise', 'enterprise', 'active', 'larshield_live_api_key_883920193847', CURRENT_TIMESTAMP) ON CONFLICT (id) DO NOTHING; INSERT INTO public.users ( id, email, password_hash, first_name, last_name, role, org_id, terms_accepted_at, privacy_policy_agreed_at, policy_version_agreed, email_verified ) VALUES ( 'user-admin-001', 'admin@larshield.com', '$2b$12$eImiTXuWVxfM37uY4JANjO5E/0w5/qO1F1kR04.3jF96Wd58e3.6u', 'System', 'Admin', 'org_admin', 'org-default-001', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'v1.0', true ) ON CONFLICT (id) DO NOTHING; INSERT INTO public.alert_settings (id, user_id, email_notifications, severity_threshold) VALUES ('alert-admin-001', 'user-admin-001', true, 'Medium') ON CONFLICT (id) DO NOTHING; INSERT INTO public.organization_scan_quotas (id, org_id, scan_type, allocated_count, used_count) VALUES ('quota-001', 'org-default-001', 'Full', 1000, 0), ('quota-002', 'org-default-001', 'Port', 5000, 0), ('quota-003', 'org-default-001', 'SSL', 5000, 0), ('quota-004', 'org-default-001', 'OWASP', 2000, 0) ON CONFLICT (id) DO NOTHING;