Files
cannaiq/backend/archive/schema-dump.sql
Kelly d91c55a344 feat: Add stale process monitor, users route, landing page, archive old scripts
- Add backend stale process monitoring API (/api/stale-processes)
- Add users management route
- Add frontend landing page and stale process monitor UI on /scraper-tools
- Move old development scripts to backend/archive/
- Update frontend build with new features

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 04:07:31 -07:00

4043 lines
114 KiB
PL/PgSQL

--
-- PostgreSQL database dump
--
\restrict u76b1lsSuckyRNpZbORH9drBRaNwzQbqR7X3xYnHxUdiczMnjtBCdx8KbLlDBsP
-- Dumped from database version 15.15
-- Dumped by pg_dump version 15.15
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_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;
--
-- Name: set_requires_recrawl(); Type: FUNCTION; Schema: public; Owner: dutchie
--
CREATE FUNCTION public.set_requires_recrawl() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW.field_name IN ('website', 'menu_url') THEN
NEW.requires_recrawl := TRUE;
END IF;
RETURN NEW;
END;
$$;
ALTER FUNCTION public.set_requires_recrawl() OWNER TO dutchie;
--
-- Name: update_api_token_updated_at(); Type: FUNCTION; Schema: public; Owner: dutchie
--
CREATE FUNCTION public.update_api_token_updated_at() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$;
ALTER FUNCTION public.update_api_token_updated_at() OWNER TO dutchie;
--
-- Name: update_brand_scrape_jobs_updated_at(); Type: FUNCTION; Schema: public; Owner: dutchie
--
CREATE FUNCTION public.update_brand_scrape_jobs_updated_at() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$;
ALTER FUNCTION public.update_brand_scrape_jobs_updated_at() OWNER TO dutchie;
--
-- Name: update_sandbox_timestamp(); Type: FUNCTION; Schema: public; Owner: dutchie
--
CREATE FUNCTION public.update_sandbox_timestamp() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$;
ALTER FUNCTION public.update_sandbox_timestamp() OWNER TO dutchie;
--
-- Name: update_schedule_updated_at(); Type: FUNCTION; Schema: public; Owner: dutchie
--
CREATE FUNCTION public.update_schedule_updated_at() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$;
ALTER FUNCTION public.update_schedule_updated_at() OWNER TO dutchie;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: api_token_usage; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.api_token_usage (
id integer NOT NULL,
token_id integer,
endpoint character varying(255) NOT NULL,
method character varying(10) NOT NULL,
status_code integer,
response_time_ms integer,
request_size integer,
response_size integer,
ip_address inet,
user_agent text,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.api_token_usage OWNER TO dutchie;
--
-- Name: api_token_usage_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.api_token_usage_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_token_usage_id_seq OWNER TO dutchie;
--
-- Name: api_token_usage_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.api_token_usage_id_seq OWNED BY public.api_token_usage.id;
--
-- Name: api_tokens; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.api_tokens (
id integer NOT NULL,
name character varying(255) NOT NULL,
token character varying(255) NOT NULL,
description text,
user_id integer,
active boolean DEFAULT true,
rate_limit integer DEFAULT 100,
allowed_endpoints text[],
expires_at timestamp without time zone,
last_used_at timestamp without time zone,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.api_tokens OWNER TO dutchie;
--
-- Name: api_tokens_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.api_tokens_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_tokens_id_seq OWNER TO dutchie;
--
-- Name: api_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.api_tokens_id_seq OWNED BY public.api_tokens.id;
--
-- Name: azdhs_list; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.azdhs_list (
id integer NOT NULL,
name character varying(255) NOT NULL,
company_name character varying(255),
slug character varying(255),
address character varying(500),
city character varying(100),
state character varying(2) DEFAULT 'AZ'::character varying,
zip character varying(10),
phone character varying(20),
email character varying(255),
status_line text,
azdhs_url text,
latitude numeric(10,8),
longitude numeric(11,8),
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
website text,
dba_name character varying(255),
google_rating numeric(2,1),
google_review_count integer
);
ALTER TABLE public.azdhs_list OWNER TO dutchie;
--
-- Name: azdhs_list_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.azdhs_list_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.azdhs_list_id_seq OWNER TO dutchie;
--
-- Name: azdhs_list_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.azdhs_list_id_seq OWNED BY public.azdhs_list.id;
--
-- Name: batch_history; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.batch_history (
id integer NOT NULL,
product_id integer,
thc_percentage numeric(5,2),
cbd_percentage numeric(5,2),
terpenes text[],
strain_type character varying(100),
recorded_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.batch_history OWNER TO dutchie;
--
-- Name: batch_history_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.batch_history_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.batch_history_id_seq OWNER TO dutchie;
--
-- Name: batch_history_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.batch_history_id_seq OWNED BY public.batch_history.id;
--
-- Name: brand_history; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.brand_history (
id integer NOT NULL,
dispensary_id integer NOT NULL,
brand_name character varying(255) NOT NULL,
event_type character varying(20) NOT NULL,
event_at timestamp with time zone DEFAULT now(),
product_count integer,
metadata jsonb
);
ALTER TABLE public.brand_history OWNER TO dutchie;
--
-- Name: brand_history_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.brand_history_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.brand_history_id_seq OWNER TO dutchie;
--
-- Name: brand_history_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.brand_history_id_seq OWNED BY public.brand_history.id;
--
-- Name: brand_scrape_jobs; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.brand_scrape_jobs (
id integer NOT NULL,
dispensary_id integer NOT NULL,
brand_slug text NOT NULL,
brand_name text NOT NULL,
status text DEFAULT 'pending'::text NOT NULL,
worker_id text,
started_at timestamp without time zone,
completed_at timestamp without time zone,
products_found integer DEFAULT 0,
products_saved integer DEFAULT 0,
error_message text,
retry_count integer DEFAULT 0,
created_at timestamp without time zone DEFAULT now(),
updated_at timestamp without time zone DEFAULT now()
);
ALTER TABLE public.brand_scrape_jobs OWNER TO dutchie;
--
-- Name: brand_scrape_jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.brand_scrape_jobs_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.brand_scrape_jobs_id_seq OWNER TO dutchie;
--
-- Name: brand_scrape_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.brand_scrape_jobs_id_seq OWNED BY public.brand_scrape_jobs.id;
--
-- Name: brands; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.brands (
id integer NOT NULL,
store_id integer NOT NULL,
name character varying(255) NOT NULL,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
first_seen_at timestamp with time zone DEFAULT now(),
last_seen_at timestamp with time zone DEFAULT now(),
dispensary_id integer
);
ALTER TABLE public.brands OWNER TO dutchie;
--
-- Name: brands_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.brands_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.brands_id_seq OWNER TO dutchie;
--
-- Name: brands_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.brands_id_seq OWNED BY public.brands.id;
--
-- Name: campaign_products; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.campaign_products (
id integer NOT NULL,
campaign_id integer,
product_id integer,
display_order integer DEFAULT 0,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.campaign_products OWNER TO dutchie;
--
-- Name: campaign_products_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.campaign_products_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.campaign_products_id_seq OWNER TO dutchie;
--
-- Name: campaign_products_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.campaign_products_id_seq OWNED BY public.campaign_products.id;
--
-- Name: campaigns; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.campaigns (
id integer NOT NULL,
name character varying(255) NOT NULL,
slug character varying(255) NOT NULL,
description text,
display_style character varying(50) DEFAULT 'grid'::character varying,
active boolean DEFAULT true,
start_date timestamp without time zone,
end_date timestamp without time zone,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.campaigns OWNER TO dutchie;
--
-- Name: campaigns_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.campaigns_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.campaigns_id_seq OWNER TO dutchie;
--
-- Name: campaigns_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.campaigns_id_seq OWNED BY public.campaigns.id;
--
-- Name: categories; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.categories (
id integer NOT NULL,
store_id integer,
name character varying(255) NOT NULL,
slug character varying(255) NOT NULL,
dutchie_url text NOT NULL,
scrape_enabled boolean DEFAULT true,
last_scraped_at timestamp without time zone,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
parent_id integer,
display_order integer DEFAULT 0,
description text,
path character varying(500),
dispensary_id integer
);
ALTER TABLE public.categories OWNER TO dutchie;
--
-- Name: categories_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.categories_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.categories_id_seq OWNER TO dutchie;
--
-- Name: categories_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.categories_id_seq OWNED BY public.categories.id;
--
-- Name: clicks; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.clicks (
id integer NOT NULL,
product_id integer,
campaign_id integer,
ip_address character varying(45),
user_agent text,
referrer text,
clicked_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.clicks OWNER TO dutchie;
--
-- Name: clicks_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.clicks_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.clicks_id_seq OWNER TO dutchie;
--
-- Name: clicks_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.clicks_id_seq OWNED BY public.clicks.id;
--
-- Name: crawl_jobs; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.crawl_jobs (
id integer NOT NULL,
store_id integer NOT NULL,
job_type character varying(50) DEFAULT 'full_crawl'::character varying NOT NULL,
trigger_type character varying(50) DEFAULT 'scheduled'::character varying NOT NULL,
status character varying(20) DEFAULT 'pending'::character varying NOT NULL,
priority integer DEFAULT 0,
scheduled_at timestamp with time zone DEFAULT now() NOT NULL,
started_at timestamp with time zone,
completed_at timestamp with time zone,
products_found integer,
products_new integer,
products_updated integer,
error_message text,
worker_id character varying(100),
metadata jsonb DEFAULT '{}'::jsonb,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
orchestrator_run_id uuid,
detection_result jsonb,
in_stock_count integer,
out_of_stock_count integer,
limited_count integer,
unknown_count integer,
availability_changed_count integer,
CONSTRAINT chk_crawl_job_status CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'running'::character varying, 'completed'::character varying, 'failed'::character varying, 'cancelled'::character varying])::text[])))
);
ALTER TABLE public.crawl_jobs OWNER TO dutchie;
--
-- Name: COLUMN crawl_jobs.orchestrator_run_id; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.crawl_jobs.orchestrator_run_id IS 'Groups related jobs from same orchestrator run';
--
-- Name: crawl_jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.crawl_jobs_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.crawl_jobs_id_seq OWNER TO dutchie;
--
-- Name: crawl_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.crawl_jobs_id_seq OWNED BY public.crawl_jobs.id;
--
-- Name: crawler_schedule; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.crawler_schedule (
id integer NOT NULL,
schedule_type character varying(50) NOT NULL,
enabled boolean DEFAULT true NOT NULL,
interval_hours integer,
run_time time without time zone,
description text,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.crawler_schedule OWNER TO dutchie;
--
-- Name: dispensaries; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.dispensaries (
id integer NOT NULL,
azdhs_id integer,
name character varying(255) NOT NULL,
company_name character varying(255),
address character varying(500) NOT NULL,
city character varying(100) NOT NULL,
state character varying(2) NOT NULL,
zip character varying(10),
status_line character varying(100),
azdhs_url text,
latitude numeric(10,8),
longitude numeric(11,8),
dba_name character varying(255),
phone character varying(20),
email character varying(255),
website text,
google_rating numeric(2,1),
google_review_count integer,
menu_url text,
scraper_template character varying(100),
scraper_config jsonb,
last_menu_scrape timestamp without time zone,
menu_scrape_status character varying(50) DEFAULT 'pending'::character varying,
slug character varying(255) NOT NULL,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
menu_provider character varying(50),
menu_provider_confidence smallint DEFAULT 0,
crawler_mode character varying(20) DEFAULT 'production'::character varying,
crawler_status character varying(30) DEFAULT 'idle'::character varying,
last_menu_error_at timestamp with time zone,
last_error_message text,
provider_detection_data jsonb DEFAULT '{}'::jsonb,
product_provider character varying(50),
product_confidence smallint DEFAULT 0,
product_crawler_mode character varying(20) DEFAULT 'sandbox'::character varying,
last_product_scan_at timestamp with time zone,
product_detection_data jsonb DEFAULT '{}'::jsonb,
specials_provider character varying(50),
specials_confidence smallint DEFAULT 0,
specials_crawler_mode character varying(20) DEFAULT 'sandbox'::character varying,
last_specials_scan_at timestamp with time zone,
specials_detection_data jsonb DEFAULT '{}'::jsonb,
brand_provider character varying(50),
brand_confidence smallint DEFAULT 0,
brand_crawler_mode character varying(20) DEFAULT 'sandbox'::character varying,
last_brand_scan_at timestamp with time zone,
brand_detection_data jsonb DEFAULT '{}'::jsonb,
metadata_provider character varying(50),
metadata_confidence smallint DEFAULT 0,
metadata_crawler_mode character varying(20) DEFAULT 'sandbox'::character varying,
last_metadata_scan_at timestamp with time zone,
metadata_detection_data jsonb DEFAULT '{}'::jsonb,
provider_type character varying(50) DEFAULT 'unknown'::character varying,
scrape_enabled boolean DEFAULT false,
last_crawl_at timestamp with time zone,
next_crawl_at timestamp with time zone,
crawl_status character varying(50) DEFAULT 'pending'::character varying,
crawl_error text,
consecutive_failures integer DEFAULT 0,
total_crawls integer DEFAULT 0,
successful_crawls integer DEFAULT 0,
CONSTRAINT chk_crawler_mode CHECK (((crawler_mode)::text = ANY ((ARRAY['production'::character varying, 'sandbox'::character varying])::text[]))),
CONSTRAINT chk_crawler_status CHECK (((crawler_status)::text = ANY ((ARRAY['idle'::character varying, 'queued_detection'::character varying, 'queued_crawl'::character varying, 'running'::character varying, 'ok'::character varying, 'error_needs_review'::character varying])::text[]))),
CONSTRAINT chk_provider_confidence CHECK (((menu_provider_confidence >= 0) AND (menu_provider_confidence <= 100)))
);
ALTER TABLE public.dispensaries OWNER TO dutchie;
--
-- Name: COLUMN dispensaries.menu_provider; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.menu_provider IS 'Detected menu platform: dutchie, treez, jane, weedmaps, etc.';
--
-- Name: COLUMN dispensaries.menu_provider_confidence; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.menu_provider_confidence IS 'Confidence score 0-100 for provider detection';
--
-- Name: COLUMN dispensaries.crawler_mode; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.crawler_mode IS 'production = stable templates, sandbox = learning mode';
--
-- Name: COLUMN dispensaries.crawler_status; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.crawler_status IS 'Current state in crawl pipeline';
--
-- Name: COLUMN dispensaries.provider_detection_data; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.provider_detection_data IS 'JSON blob with detection signals and history';
--
-- Name: COLUMN dispensaries.product_provider; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.product_provider IS 'Provider for product intelligence (dutchie, treez, jane, etc.)';
--
-- Name: COLUMN dispensaries.product_crawler_mode; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.product_crawler_mode IS 'production or sandbox mode for product crawling';
--
-- Name: COLUMN dispensaries.specials_provider; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.specials_provider IS 'Provider for specials/deals intelligence';
--
-- Name: COLUMN dispensaries.brand_provider; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.brand_provider IS 'Provider for brand intelligence';
--
-- Name: COLUMN dispensaries.metadata_provider; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.dispensaries.metadata_provider IS 'Provider for metadata/taxonomy intelligence';
--
-- Name: store_crawl_schedule; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.store_crawl_schedule (
id integer NOT NULL,
store_id integer NOT NULL,
enabled boolean DEFAULT true NOT NULL,
interval_hours integer,
daily_special_enabled boolean DEFAULT true,
daily_special_time time without time zone,
priority integer DEFAULT 0,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
last_status character varying(50),
last_summary text,
last_run_at timestamp with time zone,
last_error text
);
ALTER TABLE public.store_crawl_schedule OWNER TO dutchie;
--
-- Name: COLUMN store_crawl_schedule.last_status; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.store_crawl_schedule.last_status IS 'Orchestrator result status: success, error, sandbox_only, detection_only';
--
-- Name: COLUMN store_crawl_schedule.last_summary; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.store_crawl_schedule.last_summary IS 'Human-readable summary of last orchestrator run';
--
-- Name: COLUMN store_crawl_schedule.last_run_at; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.store_crawl_schedule.last_run_at IS 'When orchestrator last ran for this store';
--
-- Name: stores; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.stores (
id integer NOT NULL,
name character varying(255) NOT NULL,
slug character varying(255) NOT NULL,
dutchie_url text NOT NULL,
active boolean DEFAULT true,
scrape_enabled boolean DEFAULT true,
last_scraped_at timestamp without time zone,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
logo_url text,
timezone character varying(50) DEFAULT 'America/Phoenix'::character varying,
dispensary_id integer
);
ALTER TABLE public.stores OWNER TO dutchie;
--
-- Name: COLUMN stores.dispensary_id; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.stores.dispensary_id IS 'FK to dispensaries table (master AZDHS directory)';
--
-- Name: crawl_schedule_status; Type: VIEW; Schema: public; Owner: dutchie
--
CREATE VIEW public.crawl_schedule_status AS
SELECT s.id AS store_id,
s.name AS store_name,
s.slug AS store_slug,
s.timezone,
s.active,
s.scrape_enabled,
s.last_scraped_at,
s.dispensary_id,
d.name AS dispensary_name,
d.company_name AS dispensary_company,
d.city AS dispensary_city,
d.state AS dispensary_state,
d.slug AS dispensary_slug,
d.address AS dispensary_address,
d.menu_url AS dispensary_menu_url,
d.product_provider,
d.product_confidence,
d.product_crawler_mode,
COALESCE(scs.enabled, true) AS schedule_enabled,
COALESCE(scs.interval_hours, cs_global.interval_hours, 4) AS interval_hours,
COALESCE(scs.daily_special_enabled, true) AS daily_special_enabled,
COALESCE(scs.daily_special_time, '00:01:00'::time without time zone) AS daily_special_time,
COALESCE(scs.priority, 0) AS priority,
scs.last_status,
scs.last_summary,
scs.last_run_at AS schedule_last_run,
scs.last_error,
CASE
WHEN (s.last_scraped_at IS NULL) THEN now()
ELSE ((s.last_scraped_at + ((COALESCE(scs.interval_hours, cs_global.interval_hours, 4) || ' hours'::text))::interval))::timestamp with time zone
END AS next_scheduled_run,
cj.id AS latest_job_id,
cj.status AS latest_job_status,
cj.job_type AS latest_job_type,
cj.trigger_type AS latest_job_trigger,
cj.started_at AS latest_job_started,
cj.completed_at AS latest_job_completed,
cj.products_found AS latest_products_found,
cj.products_new AS latest_products_new,
cj.products_updated AS latest_products_updated,
cj.error_message AS latest_job_error
FROM ((((public.stores s
LEFT JOIN public.dispensaries d ON ((d.id = s.dispensary_id)))
LEFT JOIN public.store_crawl_schedule scs ON ((scs.store_id = s.id)))
LEFT JOIN public.crawler_schedule cs_global ON (((cs_global.schedule_type)::text = 'global_interval'::text)))
LEFT JOIN LATERAL ( SELECT cj2.id,
cj2.store_id,
cj2.job_type,
cj2.trigger_type,
cj2.status,
cj2.priority,
cj2.scheduled_at,
cj2.started_at,
cj2.completed_at,
cj2.products_found,
cj2.products_new,
cj2.products_updated,
cj2.error_message,
cj2.worker_id,
cj2.metadata,
cj2.created_at,
cj2.updated_at,
cj2.orchestrator_run_id,
cj2.detection_result
FROM public.crawl_jobs cj2
WHERE (cj2.store_id = s.id)
ORDER BY cj2.created_at DESC
LIMIT 1) cj ON (true))
WHERE (s.active = true);
ALTER TABLE public.crawl_schedule_status OWNER TO dutchie;
--
-- Name: crawler_sandboxes; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.crawler_sandboxes (
id integer NOT NULL,
dispensary_id integer NOT NULL,
suspected_menu_provider character varying(50),
mode character varying(30) DEFAULT 'detection'::character varying NOT NULL,
raw_html_location text,
screenshot_location text,
analysis_json jsonb DEFAULT '{}'::jsonb,
urls_tested jsonb DEFAULT '[]'::jsonb,
menu_entry_points jsonb DEFAULT '[]'::jsonb,
detection_signals jsonb DEFAULT '{}'::jsonb,
status character varying(30) DEFAULT 'pending'::character varying NOT NULL,
confidence_score smallint DEFAULT 0,
failure_reason text,
human_review_notes text,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
analyzed_at timestamp with time zone,
reviewed_at timestamp with time zone,
category character varying(30) DEFAULT 'product'::character varying,
template_name character varying(100),
quality_score smallint DEFAULT 0,
products_extracted integer DEFAULT 0,
fields_missing integer DEFAULT 0,
error_count integer DEFAULT 0,
CONSTRAINT chk_sandbox_mode CHECK (((mode)::text = ANY ((ARRAY['detection'::character varying, 'template_learning'::character varying, 'validation'::character varying])::text[]))),
CONSTRAINT chk_sandbox_status CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'analyzing'::character varying, 'template_ready'::character varying, 'needs_human_review'::character varying, 'moved_to_production'::character varying, 'failed'::character varying])::text[])))
);
ALTER TABLE public.crawler_sandboxes OWNER TO dutchie;
--
-- Name: TABLE crawler_sandboxes; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON TABLE public.crawler_sandboxes IS 'Learning/testing environment for unknown menu providers';
--
-- Name: COLUMN crawler_sandboxes.category; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.crawler_sandboxes.category IS 'Intelligence category: product, specials, brand, metadata';
--
-- Name: COLUMN crawler_sandboxes.quality_score; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.crawler_sandboxes.quality_score IS 'Quality score 0-100 for sandbox run results';
--
-- Name: crawler_sandboxes_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.crawler_sandboxes_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.crawler_sandboxes_id_seq OWNER TO dutchie;
--
-- Name: crawler_sandboxes_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.crawler_sandboxes_id_seq OWNED BY public.crawler_sandboxes.id;
--
-- Name: crawler_schedule_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.crawler_schedule_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.crawler_schedule_id_seq OWNER TO dutchie;
--
-- Name: crawler_schedule_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.crawler_schedule_id_seq OWNED BY public.crawler_schedule.id;
--
-- Name: crawler_templates; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.crawler_templates (
id integer NOT NULL,
provider character varying(50) NOT NULL,
name character varying(100) NOT NULL,
version integer DEFAULT 1,
is_active boolean DEFAULT true NOT NULL,
is_default_for_provider boolean DEFAULT false,
selector_config jsonb DEFAULT '{}'::jsonb NOT NULL,
navigation_config jsonb DEFAULT '{}'::jsonb,
transform_config jsonb DEFAULT '{}'::jsonb,
validation_rules jsonb DEFAULT '{}'::jsonb,
test_urls jsonb DEFAULT '[]'::jsonb,
expected_structure jsonb DEFAULT '{}'::jsonb,
dispensaries_using integer DEFAULT 0,
success_rate numeric(5,2) DEFAULT 0,
last_successful_crawl timestamp with time zone,
last_failed_crawl timestamp with time zone,
notes text,
created_by character varying(100),
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
environment character varying(20) DEFAULT 'production'::character varying
);
ALTER TABLE public.crawler_templates OWNER TO dutchie;
--
-- Name: TABLE crawler_templates; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON TABLE public.crawler_templates IS 'Reusable scraping configurations per menu provider';
--
-- Name: COLUMN crawler_templates.environment; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.crawler_templates.environment IS 'Template environment: production or sandbox';
--
-- Name: crawler_templates_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.crawler_templates_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.crawler_templates_id_seq OWNER TO dutchie;
--
-- Name: crawler_templates_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.crawler_templates_id_seq OWNED BY public.crawler_templates.id;
--
-- Name: products; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.products (
id integer NOT NULL,
store_id integer,
category_id integer,
dutchie_product_id character varying(255),
name character varying(500) NOT NULL,
slug character varying(500) NOT NULL,
description text,
price numeric(10,2),
original_price numeric(10,2),
strain_type character varying(100),
thc_percentage numeric(10,4),
cbd_percentage numeric(10,4),
brand character varying(255),
weight character varying(100),
image_url text,
local_image_path text,
dutchie_url text NOT NULL,
in_stock boolean DEFAULT true,
is_special boolean DEFAULT false,
metadata jsonb,
first_seen_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
last_seen_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
dispensary_id integer,
variant character varying(255),
special_ends_at timestamp without time zone,
special_text text,
special_type character varying(100),
terpenes text[],
effects text[],
flavors text[],
regular_price numeric(10,2),
sale_price numeric(10,2),
stock_quantity integer,
stock_status text,
discount_type character varying(50),
discount_value character varying(100),
availability_status character varying(20) DEFAULT 'unknown'::character varying,
availability_raw jsonb,
last_seen_in_stock_at timestamp with time zone,
last_seen_out_of_stock_at timestamp with time zone,
enterprise_product_id character varying(255),
sku character varying(100),
brand_external_id character varying(255),
brand_logo_url text,
subcategory character varying(100),
canonical_category character varying(255),
rec_price numeric(10,2),
med_price numeric(10,2),
rec_special_price numeric(10,2),
med_special_price numeric(10,2),
is_on_special boolean DEFAULT false,
special_name text,
discount_percent numeric(10,2),
special_data jsonb,
inventory_quantity integer,
inventory_available integer,
is_below_threshold boolean DEFAULT false,
status character varying(20) DEFAULT 'Active'::character varying,
cannabinoids jsonb,
weight_mg integer,
net_weight_value numeric(10,2),
net_weight_unit character varying(20),
options text[],
raw_options text[],
additional_images text[],
is_featured boolean DEFAULT false,
medical_only boolean DEFAULT false,
rec_only boolean DEFAULT false,
source_created_at timestamp with time zone,
source_updated_at timestamp with time zone,
raw_data jsonb,
external_id character varying(255)
);
ALTER TABLE public.products OWNER TO dutchie;
--
-- Name: COLUMN products.availability_status; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.availability_status IS 'Normalized status: in_stock, out_of_stock, limited, unknown';
--
-- Name: COLUMN products.availability_raw; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.availability_raw IS 'Raw availability payload from provider for debugging';
--
-- Name: COLUMN products.last_seen_in_stock_at; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.last_seen_in_stock_at IS 'Last time product was seen in stock';
--
-- Name: COLUMN products.last_seen_out_of_stock_at; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.last_seen_out_of_stock_at IS 'Last time product was seen out of stock';
--
-- Name: COLUMN products.enterprise_product_id; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.enterprise_product_id IS 'Dutchie enterpriseProductId - shared across dispensaries';
--
-- Name: COLUMN products.brand_external_id; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.brand_external_id IS 'Dutchie brand.id / brandId field';
--
-- Name: COLUMN products.canonical_category; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.canonical_category IS 'Dutchie POSMetaData.canonicalCategory - pipe-separated category path';
--
-- Name: COLUMN products.rec_special_price; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.rec_special_price IS 'Dutchie recSpecialPrices[0] - discounted recreational price';
--
-- Name: COLUMN products.special_data; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.special_data IS 'Full Dutchie specialData JSONB including all active specials';
--
-- Name: COLUMN products.cannabinoids; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.cannabinoids IS 'Full Dutchie cannabinoidsV2 array as JSONB';
--
-- Name: COLUMN products.raw_data; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON COLUMN public.products.raw_data IS 'Complete Dutchie GraphQL response for this product';
--
-- Name: current_specials; Type: VIEW; Schema: public; Owner: dutchie
--
CREATE VIEW public.current_specials AS
SELECT p.id,
p.store_id,
p.name,
p.brand,
p.subcategory,
p.strain_type,
p.rec_price,
p.rec_special_price,
p.discount_percent,
p.special_name,
p.image_url,
p.slug,
p.thc_percentage,
p.cbd_percentage,
s.name AS store_name,
s.slug AS store_slug
FROM (public.products p
JOIN public.stores s ON ((s.id = p.store_id)))
WHERE ((p.is_on_special = true) AND ((p.status)::text = 'Active'::text) AND (p.rec_special_price IS NOT NULL));
ALTER TABLE public.current_specials OWNER TO dutchie;
--
-- Name: derived_brands; Type: VIEW; Schema: public; Owner: dutchie
--
CREATE VIEW public.derived_brands AS
SELECT p.store_id,
p.brand AS brand_name,
p.brand_external_id,
max(p.brand_logo_url) AS brand_logo_url,
count(*) AS product_count,
count(*) FILTER (WHERE ((p.status)::text = 'Active'::text)) AS active_count,
count(*) FILTER (WHERE p.is_on_special) AS special_count,
min(p.rec_price) AS min_price,
max(p.rec_price) AS max_price,
avg(p.rec_price) AS avg_price,
array_agg(DISTINCT p.subcategory) FILTER (WHERE (p.subcategory IS NOT NULL)) AS categories,
max(p.updated_at) AS last_updated
FROM public.products p
WHERE (p.brand IS NOT NULL)
GROUP BY p.store_id, p.brand, p.brand_external_id;
ALTER TABLE public.derived_brands OWNER TO dutchie;
--
-- Name: derived_categories; Type: VIEW; Schema: public; Owner: dutchie
--
CREATE VIEW public.derived_categories AS
SELECT p.store_id,
p.subcategory AS category_name,
count(*) AS product_count,
count(*) FILTER (WHERE ((p.status)::text = 'Active'::text)) AS active_count,
count(*) FILTER (WHERE p.is_on_special) AS special_count,
min(p.rec_price) AS min_price,
max(p.rec_price) AS max_price,
array_agg(DISTINCT p.brand) FILTER (WHERE (p.brand IS NOT NULL)) AS brands,
max(p.updated_at) AS last_updated
FROM public.products p
WHERE (p.subcategory IS NOT NULL)
GROUP BY p.store_id, p.subcategory;
ALTER TABLE public.derived_categories OWNER TO dutchie;
--
-- Name: dispensaries_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.dispensaries_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.dispensaries_id_seq OWNER TO dutchie;
--
-- Name: dispensaries_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.dispensaries_id_seq OWNED BY public.dispensaries.id;
--
-- Name: dispensary_brand_stats; Type: VIEW; Schema: public; Owner: dutchie
--
CREATE VIEW public.dispensary_brand_stats AS
SELECT d.id AS dispensary_id,
COALESCE(d.dba_name, d.name) AS dispensary_name,
count(DISTINCT p.brand) FILTER (WHERE (p.last_seen_at >= (now() - '7 days'::interval))) AS current_brands,
count(DISTINCT p.brand) AS total_brands_ever,
( SELECT count(DISTINCT bh.brand_name) AS count
FROM public.brand_history bh
WHERE ((bh.dispensary_id = d.id) AND ((bh.event_type)::text = 'added'::text) AND (bh.event_at >= (now() - '7 days'::interval)))) AS new_brands_7d,
( SELECT count(DISTINCT bh.brand_name) AS count
FROM public.brand_history bh
WHERE ((bh.dispensary_id = d.id) AND ((bh.event_type)::text = 'dropped'::text) AND (bh.event_at >= (now() - '7 days'::interval)))) AS dropped_brands_7d
FROM (public.dispensaries d
LEFT JOIN public.products p ON ((p.dispensary_id = d.id)))
GROUP BY d.id, d.dba_name, d.name;
ALTER TABLE public.dispensary_brand_stats OWNER TO dutchie;
--
-- Name: dispensary_changes; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.dispensary_changes (
id integer NOT NULL,
dispensary_id integer NOT NULL,
field_name character varying(100) NOT NULL,
old_value text,
new_value text,
source character varying(50) NOT NULL,
confidence_score character varying(20),
change_notes text,
status character varying(20) DEFAULT 'pending'::character varying NOT NULL,
requires_recrawl boolean DEFAULT false,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
reviewed_at timestamp without time zone,
reviewed_by integer,
rejection_reason text,
CONSTRAINT dispensary_changes_status_check CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'approved'::character varying, 'rejected'::character varying])::text[])))
);
ALTER TABLE public.dispensary_changes OWNER TO dutchie;
--
-- Name: dispensary_changes_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.dispensary_changes_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.dispensary_changes_id_seq OWNER TO dutchie;
--
-- Name: dispensary_changes_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.dispensary_changes_id_seq OWNED BY public.dispensary_changes.id;
--
-- Name: dispensary_crawl_jobs; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.dispensary_crawl_jobs (
id integer NOT NULL,
dispensary_id integer NOT NULL,
schedule_id integer,
job_type character varying(50) DEFAULT 'orchestrator'::character varying NOT NULL,
trigger_type character varying(50) DEFAULT 'scheduled'::character varying NOT NULL,
status character varying(20) DEFAULT 'pending'::character varying NOT NULL,
priority integer DEFAULT 0,
scheduled_at timestamp with time zone DEFAULT now(),
started_at timestamp with time zone,
completed_at timestamp with time zone,
duration_ms integer,
detection_ran boolean DEFAULT false,
crawl_ran boolean DEFAULT false,
crawl_type character varying(20),
products_found integer,
products_new integer,
products_updated integer,
detected_provider character varying(50),
detected_confidence smallint,
detected_mode character varying(20),
error_message text,
worker_id character varying(100),
run_id uuid,
created_at timestamp with time zone DEFAULT now(),
updated_at timestamp with time zone DEFAULT now(),
in_stock_count integer,
out_of_stock_count integer,
limited_count integer,
unknown_count integer,
availability_changed_count integer
);
ALTER TABLE public.dispensary_crawl_jobs OWNER TO dutchie;
--
-- Name: dispensary_crawl_jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.dispensary_crawl_jobs_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.dispensary_crawl_jobs_id_seq OWNER TO dutchie;
--
-- Name: dispensary_crawl_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.dispensary_crawl_jobs_id_seq OWNED BY public.dispensary_crawl_jobs.id;
--
-- Name: dispensary_crawl_schedule; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.dispensary_crawl_schedule (
id integer NOT NULL,
dispensary_id integer NOT NULL,
is_active boolean DEFAULT true NOT NULL,
interval_minutes integer DEFAULT 240 NOT NULL,
priority integer DEFAULT 0 NOT NULL,
last_run_at timestamp with time zone,
next_run_at timestamp with time zone,
last_status character varying(50),
last_summary text,
last_error text,
last_duration_ms integer,
consecutive_failures integer DEFAULT 0,
total_runs integer DEFAULT 0,
successful_runs integer DEFAULT 0,
created_at timestamp with time zone DEFAULT now(),
updated_at timestamp with time zone DEFAULT now()
);
ALTER TABLE public.dispensary_crawl_schedule OWNER TO dutchie;
--
-- Name: dispensary_crawl_schedule_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.dispensary_crawl_schedule_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.dispensary_crawl_schedule_id_seq OWNER TO dutchie;
--
-- Name: dispensary_crawl_schedule_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.dispensary_crawl_schedule_id_seq OWNED BY public.dispensary_crawl_schedule.id;
--
-- Name: dispensary_crawl_status; Type: VIEW; Schema: public; Owner: dutchie
--
CREATE VIEW public.dispensary_crawl_status AS
SELECT d.id AS dispensary_id,
COALESCE(d.dba_name, d.name) AS dispensary_name,
d.city,
d.state,
d.slug,
d.website,
d.menu_url,
COALESCE(d.product_provider, d.provider_type) AS product_provider,
d.provider_type,
d.product_confidence,
d.product_crawler_mode,
d.last_product_scan_at,
COALESCE(dcs.is_active, d.scrape_enabled, false) AS schedule_active,
COALESCE(dcs.interval_minutes, 240) AS interval_minutes,
COALESCE(dcs.priority, 0) AS priority,
COALESCE(dcs.last_run_at, d.last_crawl_at) AS last_run_at,
COALESCE(dcs.next_run_at, d.next_crawl_at) AS next_run_at,
COALESCE(dcs.last_status, d.crawl_status) AS last_status,
dcs.last_summary,
COALESCE(dcs.last_error, d.crawl_error) AS last_error,
COALESCE(dcs.consecutive_failures, d.consecutive_failures, 0) AS consecutive_failures,
COALESCE(dcs.total_runs, d.total_crawls, 0) AS total_runs,
COALESCE(dcs.successful_runs, d.successful_crawls, 0) AS successful_runs,
dcj.id AS latest_job_id,
dcj.job_type AS latest_job_type,
dcj.status AS latest_job_status,
dcj.started_at AS latest_job_started,
dcj.products_found AS latest_products_found
FROM ((public.dispensaries d
LEFT JOIN public.dispensary_crawl_schedule dcs ON ((dcs.dispensary_id = d.id)))
LEFT JOIN LATERAL ( SELECT dispensary_crawl_jobs.id,
dispensary_crawl_jobs.dispensary_id,
dispensary_crawl_jobs.schedule_id,
dispensary_crawl_jobs.job_type,
dispensary_crawl_jobs.trigger_type,
dispensary_crawl_jobs.status,
dispensary_crawl_jobs.priority,
dispensary_crawl_jobs.scheduled_at,
dispensary_crawl_jobs.started_at,
dispensary_crawl_jobs.completed_at,
dispensary_crawl_jobs.duration_ms,
dispensary_crawl_jobs.detection_ran,
dispensary_crawl_jobs.crawl_ran,
dispensary_crawl_jobs.crawl_type,
dispensary_crawl_jobs.products_found,
dispensary_crawl_jobs.products_new,
dispensary_crawl_jobs.products_updated,
dispensary_crawl_jobs.detected_provider,
dispensary_crawl_jobs.detected_confidence,
dispensary_crawl_jobs.detected_mode,
dispensary_crawl_jobs.error_message,
dispensary_crawl_jobs.worker_id,
dispensary_crawl_jobs.run_id,
dispensary_crawl_jobs.created_at,
dispensary_crawl_jobs.updated_at,
dispensary_crawl_jobs.in_stock_count,
dispensary_crawl_jobs.out_of_stock_count,
dispensary_crawl_jobs.limited_count,
dispensary_crawl_jobs.unknown_count,
dispensary_crawl_jobs.availability_changed_count
FROM public.dispensary_crawl_jobs
WHERE (dispensary_crawl_jobs.dispensary_id = d.id)
ORDER BY dispensary_crawl_jobs.created_at DESC
LIMIT 1) dcj ON (true))
ORDER BY
CASE
WHEN (d.scrape_enabled = true) THEN 0
ELSE 1
END, COALESCE(dcs.priority, 0) DESC, COALESCE(d.dba_name, d.name);
ALTER TABLE public.dispensary_crawl_status OWNER TO dutchie;
--
-- Name: dutchie_product_snapshots; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.dutchie_product_snapshots (
id integer NOT NULL,
dutchie_product_id integer NOT NULL,
dispensary_id integer NOT NULL,
platform_dispensary_id character varying(100) NOT NULL,
external_product_id character varying(100) NOT NULL,
pricing_type character varying(20) DEFAULT 'unknown'::character varying,
crawl_mode character varying(20) DEFAULT 'mode_a'::character varying,
status character varying(50),
featured boolean DEFAULT false,
special boolean DEFAULT false,
medical_only boolean DEFAULT false,
rec_only boolean DEFAULT false,
is_present_in_feed boolean DEFAULT true,
stock_status character varying(20) DEFAULT 'unknown'::character varying,
rec_min_price_cents integer,
rec_max_price_cents integer,
rec_min_special_price_cents integer,
med_min_price_cents integer,
med_max_price_cents integer,
med_min_special_price_cents integer,
wholesale_min_price_cents integer,
total_quantity_available integer,
total_kiosk_quantity_available integer,
manual_inventory boolean DEFAULT false,
is_below_threshold boolean DEFAULT false,
is_below_kiosk_threshold boolean DEFAULT false,
options jsonb,
raw_payload jsonb NOT NULL,
crawled_at timestamp with time zone NOT NULL,
created_at timestamp with time zone DEFAULT now(),
updated_at timestamp with time zone DEFAULT now()
);
ALTER TABLE public.dutchie_product_snapshots OWNER TO dutchie;
--
-- Name: dutchie_product_snapshots_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.dutchie_product_snapshots_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.dutchie_product_snapshots_id_seq OWNER TO dutchie;
--
-- Name: dutchie_product_snapshots_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.dutchie_product_snapshots_id_seq OWNED BY public.dutchie_product_snapshots.id;
--
-- Name: dutchie_products; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.dutchie_products (
id integer NOT NULL,
dispensary_id integer NOT NULL,
platform character varying(20) DEFAULT 'dutchie'::character varying NOT NULL,
external_product_id character varying(100) NOT NULL,
platform_dispensary_id character varying(100) NOT NULL,
c_name character varying(500),
name character varying(500) NOT NULL,
brand_name character varying(255),
brand_id character varying(100),
brand_logo_url text,
type character varying(100),
subcategory character varying(100),
strain_type character varying(50),
provider character varying(100),
thc numeric(10,4),
thc_content numeric(10,4),
cbd numeric(10,4),
cbd_content numeric(10,4),
cannabinoids_v2 jsonb,
effects jsonb,
status character varying(50),
medical_only boolean DEFAULT false,
rec_only boolean DEFAULT false,
featured boolean DEFAULT false,
coming_soon boolean DEFAULT false,
certificate_of_analysis_enabled boolean DEFAULT false,
is_below_threshold boolean DEFAULT false,
is_below_kiosk_threshold boolean DEFAULT false,
options_below_threshold boolean DEFAULT false,
options_below_kiosk_threshold boolean DEFAULT false,
stock_status character varying(20) DEFAULT 'unknown'::character varying,
total_quantity_available integer DEFAULT 0,
primary_image_url text,
images jsonb,
measurements jsonb,
weight character varying(50),
past_c_names text[],
created_at_dutchie timestamp with time zone,
updated_at_dutchie timestamp with time zone,
latest_raw_payload jsonb,
created_at timestamp with time zone DEFAULT now(),
updated_at timestamp with time zone DEFAULT now()
);
ALTER TABLE public.dutchie_products OWNER TO dutchie;
--
-- Name: dutchie_products_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.dutchie_products_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.dutchie_products_id_seq OWNER TO dutchie;
--
-- Name: dutchie_products_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.dutchie_products_id_seq OWNED BY public.dutchie_products.id;
--
-- Name: failed_proxies; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.failed_proxies (
id integer NOT NULL,
host character varying(255) NOT NULL,
port integer NOT NULL,
protocol character varying(10) NOT NULL,
username character varying(255),
password character varying(255),
failure_count integer NOT NULL,
last_error text,
failed_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
city character varying(100),
state character varying(100),
country character varying(100),
country_code character varying(2),
location_updated_at timestamp without time zone
);
ALTER TABLE public.failed_proxies OWNER TO dutchie;
--
-- Name: failed_proxies_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.failed_proxies_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.failed_proxies_id_seq OWNER TO dutchie;
--
-- Name: failed_proxies_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.failed_proxies_id_seq OWNED BY public.failed_proxies.id;
--
-- Name: jobs; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.jobs (
id integer NOT NULL,
type character varying(50) NOT NULL,
status character varying(50) DEFAULT 'pending'::character varying,
store_id integer,
progress integer DEFAULT 0,
total_items integer,
processed_items integer DEFAULT 0,
error text,
started_at timestamp without time zone,
completed_at timestamp without time zone,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.jobs OWNER TO dutchie;
--
-- Name: jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.jobs_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.jobs_id_seq OWNER TO dutchie;
--
-- Name: jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.jobs_id_seq OWNED BY public.jobs.id;
--
-- Name: price_history; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.price_history (
id integer NOT NULL,
product_id integer,
regular_price numeric(10,2),
sale_price numeric(10,2),
recorded_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.price_history OWNER TO dutchie;
--
-- Name: price_history_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.price_history_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.price_history_id_seq OWNER TO dutchie;
--
-- Name: price_history_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.price_history_id_seq OWNED BY public.price_history.id;
--
-- Name: product_categories; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.product_categories (
id integer NOT NULL,
product_id integer,
category_slug character varying(255) NOT NULL,
first_seen_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
last_seen_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.product_categories OWNER TO dutchie;
--
-- Name: product_categories_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.product_categories_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.product_categories_id_seq OWNER TO dutchie;
--
-- Name: product_categories_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.product_categories_id_seq OWNED BY public.product_categories.id;
--
-- Name: products_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.products_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.products_id_seq OWNER TO dutchie;
--
-- Name: products_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.products_id_seq OWNED BY public.products.id;
--
-- Name: proxies; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.proxies (
id integer NOT NULL,
host character varying(255) NOT NULL,
port integer NOT NULL,
protocol character varying(10) NOT NULL,
username character varying(255),
password character varying(255),
active boolean DEFAULT true,
is_anonymous boolean DEFAULT false,
last_tested_at timestamp without time zone,
test_result character varying(50),
response_time_ms integer,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
failure_count integer DEFAULT 0,
city character varying(100),
state character varying(100),
country character varying(100),
country_code character varying(2),
location_updated_at timestamp without time zone
);
ALTER TABLE public.proxies OWNER TO dutchie;
--
-- Name: proxies_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.proxies_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.proxies_id_seq OWNER TO dutchie;
--
-- Name: proxies_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.proxies_id_seq OWNED BY public.proxies.id;
--
-- Name: proxy_test_jobs; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.proxy_test_jobs (
id integer NOT NULL,
status character varying(20) DEFAULT 'pending'::character varying NOT NULL,
total_proxies integer DEFAULT 0 NOT NULL,
tested_proxies integer DEFAULT 0 NOT NULL,
passed_proxies integer DEFAULT 0 NOT NULL,
failed_proxies integer DEFAULT 0 NOT NULL,
started_at timestamp without time zone,
completed_at timestamp without time zone,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.proxy_test_jobs OWNER TO dutchie;
--
-- Name: proxy_test_jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.proxy_test_jobs_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.proxy_test_jobs_id_seq OWNER TO dutchie;
--
-- Name: proxy_test_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.proxy_test_jobs_id_seq OWNED BY public.proxy_test_jobs.id;
--
-- Name: sandbox_crawl_jobs; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.sandbox_crawl_jobs (
id integer NOT NULL,
dispensary_id integer NOT NULL,
sandbox_id integer,
job_type character varying(30) DEFAULT 'detection'::character varying NOT NULL,
status character varying(20) DEFAULT 'pending'::character varying NOT NULL,
priority integer DEFAULT 0,
scheduled_at timestamp with time zone DEFAULT now() NOT NULL,
started_at timestamp with time zone,
completed_at timestamp with time zone,
worker_id character varying(100),
result_summary jsonb DEFAULT '{}'::jsonb,
error_message text,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
category character varying(30) DEFAULT 'product'::character varying,
template_name character varying(100),
CONSTRAINT chk_sandbox_job_status CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'running'::character varying, 'completed'::character varying, 'failed'::character varying, 'cancelled'::character varying])::text[]))),
CONSTRAINT chk_sandbox_job_type CHECK (((job_type)::text = ANY ((ARRAY['detection'::character varying, 'template_test'::character varying, 'deep_crawl'::character varying])::text[])))
);
ALTER TABLE public.sandbox_crawl_jobs OWNER TO dutchie;
--
-- Name: TABLE sandbox_crawl_jobs; Type: COMMENT; Schema: public; Owner: dutchie
--
COMMENT ON TABLE public.sandbox_crawl_jobs IS 'Job queue for sandbox crawl operations (separate from production)';
--
-- Name: sandbox_crawl_jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.sandbox_crawl_jobs_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.sandbox_crawl_jobs_id_seq OWNER TO dutchie;
--
-- Name: sandbox_crawl_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.sandbox_crawl_jobs_id_seq OWNED BY public.sandbox_crawl_jobs.id;
--
-- Name: settings; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.settings (
key character varying(255) NOT NULL,
value text NOT NULL,
description text,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.settings OWNER TO dutchie;
--
-- Name: specials; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.specials (
id integer NOT NULL,
store_id integer NOT NULL,
product_id integer,
name character varying(255) NOT NULL,
description text,
discount_amount numeric(10,2),
discount_percentage numeric(5,2),
special_price numeric(10,2),
original_price numeric(10,2),
valid_date date NOT NULL,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.specials OWNER TO dutchie;
--
-- Name: specials_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.specials_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.specials_id_seq OWNER TO dutchie;
--
-- Name: specials_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.specials_id_seq OWNED BY public.specials.id;
--
-- Name: store_crawl_schedule_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.store_crawl_schedule_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.store_crawl_schedule_id_seq OWNER TO dutchie;
--
-- Name: store_crawl_schedule_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.store_crawl_schedule_id_seq OWNED BY public.store_crawl_schedule.id;
--
-- Name: stores_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.stores_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.stores_id_seq OWNER TO dutchie;
--
-- Name: stores_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.stores_id_seq OWNED BY public.stores.id;
--
-- Name: users; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.users (
id integer NOT NULL,
email character varying(255) NOT NULL,
password_hash character varying(255) NOT NULL,
role character varying(50) DEFAULT 'admin'::character varying,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.users OWNER TO dutchie;
--
-- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.users_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.users_id_seq OWNER TO dutchie;
--
-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id;
--
-- Name: wp_dutchie_api_permissions; Type: TABLE; Schema: public; Owner: dutchie
--
CREATE TABLE public.wp_dutchie_api_permissions (
id integer NOT NULL,
user_name character varying(255) NOT NULL,
api_key character varying(255) NOT NULL,
allowed_ips text,
allowed_domains text,
is_active smallint DEFAULT 1,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
last_used_at timestamp without time zone,
store_id integer,
store_name character varying(255)
);
ALTER TABLE public.wp_dutchie_api_permissions OWNER TO dutchie;
--
-- Name: wp_dutchie_api_permissions_id_seq; Type: SEQUENCE; Schema: public; Owner: dutchie
--
CREATE SEQUENCE public.wp_dutchie_api_permissions_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.wp_dutchie_api_permissions_id_seq OWNER TO dutchie;
--
-- Name: wp_dutchie_api_permissions_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: dutchie
--
ALTER SEQUENCE public.wp_dutchie_api_permissions_id_seq OWNED BY public.wp_dutchie_api_permissions.id;
--
-- Name: api_token_usage id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.api_token_usage ALTER COLUMN id SET DEFAULT nextval('public.api_token_usage_id_seq'::regclass);
--
-- Name: api_tokens id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.api_tokens ALTER COLUMN id SET DEFAULT nextval('public.api_tokens_id_seq'::regclass);
--
-- Name: azdhs_list id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.azdhs_list ALTER COLUMN id SET DEFAULT nextval('public.azdhs_list_id_seq'::regclass);
--
-- Name: batch_history id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.batch_history ALTER COLUMN id SET DEFAULT nextval('public.batch_history_id_seq'::regclass);
--
-- Name: brand_history id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brand_history ALTER COLUMN id SET DEFAULT nextval('public.brand_history_id_seq'::regclass);
--
-- Name: brand_scrape_jobs id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brand_scrape_jobs ALTER COLUMN id SET DEFAULT nextval('public.brand_scrape_jobs_id_seq'::regclass);
--
-- Name: brands id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brands ALTER COLUMN id SET DEFAULT nextval('public.brands_id_seq'::regclass);
--
-- Name: campaign_products id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaign_products ALTER COLUMN id SET DEFAULT nextval('public.campaign_products_id_seq'::regclass);
--
-- Name: campaigns id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaigns ALTER COLUMN id SET DEFAULT nextval('public.campaigns_id_seq'::regclass);
--
-- Name: categories id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.categories ALTER COLUMN id SET DEFAULT nextval('public.categories_id_seq'::regclass);
--
-- Name: clicks id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.clicks ALTER COLUMN id SET DEFAULT nextval('public.clicks_id_seq'::regclass);
--
-- Name: crawl_jobs id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawl_jobs ALTER COLUMN id SET DEFAULT nextval('public.crawl_jobs_id_seq'::regclass);
--
-- Name: crawler_sandboxes id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_sandboxes ALTER COLUMN id SET DEFAULT nextval('public.crawler_sandboxes_id_seq'::regclass);
--
-- Name: crawler_schedule id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_schedule ALTER COLUMN id SET DEFAULT nextval('public.crawler_schedule_id_seq'::regclass);
--
-- Name: crawler_templates id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_templates ALTER COLUMN id SET DEFAULT nextval('public.crawler_templates_id_seq'::regclass);
--
-- Name: dispensaries id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensaries ALTER COLUMN id SET DEFAULT nextval('public.dispensaries_id_seq'::regclass);
--
-- Name: dispensary_changes id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_changes ALTER COLUMN id SET DEFAULT nextval('public.dispensary_changes_id_seq'::regclass);
--
-- Name: dispensary_crawl_jobs id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_jobs ALTER COLUMN id SET DEFAULT nextval('public.dispensary_crawl_jobs_id_seq'::regclass);
--
-- Name: dispensary_crawl_schedule id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_schedule ALTER COLUMN id SET DEFAULT nextval('public.dispensary_crawl_schedule_id_seq'::regclass);
--
-- Name: dutchie_product_snapshots id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_product_snapshots ALTER COLUMN id SET DEFAULT nextval('public.dutchie_product_snapshots_id_seq'::regclass);
--
-- Name: dutchie_products id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_products ALTER COLUMN id SET DEFAULT nextval('public.dutchie_products_id_seq'::regclass);
--
-- Name: failed_proxies id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.failed_proxies ALTER COLUMN id SET DEFAULT nextval('public.failed_proxies_id_seq'::regclass);
--
-- Name: jobs id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.jobs ALTER COLUMN id SET DEFAULT nextval('public.jobs_id_seq'::regclass);
--
-- Name: price_history id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.price_history ALTER COLUMN id SET DEFAULT nextval('public.price_history_id_seq'::regclass);
--
-- Name: product_categories id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.product_categories ALTER COLUMN id SET DEFAULT nextval('public.product_categories_id_seq'::regclass);
--
-- Name: products id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.products ALTER COLUMN id SET DEFAULT nextval('public.products_id_seq'::regclass);
--
-- Name: proxies id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.proxies ALTER COLUMN id SET DEFAULT nextval('public.proxies_id_seq'::regclass);
--
-- Name: proxy_test_jobs id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.proxy_test_jobs ALTER COLUMN id SET DEFAULT nextval('public.proxy_test_jobs_id_seq'::regclass);
--
-- Name: sandbox_crawl_jobs id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.sandbox_crawl_jobs ALTER COLUMN id SET DEFAULT nextval('public.sandbox_crawl_jobs_id_seq'::regclass);
--
-- Name: specials id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.specials ALTER COLUMN id SET DEFAULT nextval('public.specials_id_seq'::regclass);
--
-- Name: store_crawl_schedule id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.store_crawl_schedule ALTER COLUMN id SET DEFAULT nextval('public.store_crawl_schedule_id_seq'::regclass);
--
-- Name: stores id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.stores ALTER COLUMN id SET DEFAULT nextval('public.stores_id_seq'::regclass);
--
-- Name: users id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass);
--
-- Name: wp_dutchie_api_permissions id; Type: DEFAULT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.wp_dutchie_api_permissions ALTER COLUMN id SET DEFAULT nextval('public.wp_dutchie_api_permissions_id_seq'::regclass);
--
-- Name: api_token_usage api_token_usage_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.api_token_usage
ADD CONSTRAINT api_token_usage_pkey PRIMARY KEY (id);
--
-- Name: api_tokens api_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.api_tokens
ADD CONSTRAINT api_tokens_pkey PRIMARY KEY (id);
--
-- Name: api_tokens api_tokens_token_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.api_tokens
ADD CONSTRAINT api_tokens_token_key UNIQUE (token);
--
-- Name: azdhs_list azdhs_list_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.azdhs_list
ADD CONSTRAINT azdhs_list_pkey PRIMARY KEY (id);
--
-- Name: batch_history batch_history_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.batch_history
ADD CONSTRAINT batch_history_pkey PRIMARY KEY (id);
--
-- Name: brand_history brand_history_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brand_history
ADD CONSTRAINT brand_history_pkey PRIMARY KEY (id);
--
-- Name: brand_scrape_jobs brand_scrape_jobs_dispensary_id_brand_slug_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brand_scrape_jobs
ADD CONSTRAINT brand_scrape_jobs_dispensary_id_brand_slug_key UNIQUE (dispensary_id, brand_slug);
--
-- Name: brand_scrape_jobs brand_scrape_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brand_scrape_jobs
ADD CONSTRAINT brand_scrape_jobs_pkey PRIMARY KEY (id);
--
-- Name: brands brands_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brands
ADD CONSTRAINT brands_pkey PRIMARY KEY (id);
--
-- Name: campaign_products campaign_products_campaign_id_product_id_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaign_products
ADD CONSTRAINT campaign_products_campaign_id_product_id_key UNIQUE (campaign_id, product_id);
--
-- Name: campaign_products campaign_products_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaign_products
ADD CONSTRAINT campaign_products_pkey PRIMARY KEY (id);
--
-- Name: campaigns campaigns_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaigns
ADD CONSTRAINT campaigns_pkey PRIMARY KEY (id);
--
-- Name: campaigns campaigns_slug_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaigns
ADD CONSTRAINT campaigns_slug_key UNIQUE (slug);
--
-- Name: categories categories_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT categories_pkey PRIMARY KEY (id);
--
-- Name: categories categories_store_id_slug_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT categories_store_id_slug_key UNIQUE (store_id, slug);
--
-- Name: clicks clicks_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.clicks
ADD CONSTRAINT clicks_pkey PRIMARY KEY (id);
--
-- Name: crawl_jobs crawl_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawl_jobs
ADD CONSTRAINT crawl_jobs_pkey PRIMARY KEY (id);
--
-- Name: crawler_sandboxes crawler_sandboxes_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_sandboxes
ADD CONSTRAINT crawler_sandboxes_pkey PRIMARY KEY (id);
--
-- Name: crawler_schedule crawler_schedule_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_schedule
ADD CONSTRAINT crawler_schedule_pkey PRIMARY KEY (id);
--
-- Name: crawler_templates crawler_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_templates
ADD CONSTRAINT crawler_templates_pkey PRIMARY KEY (id);
--
-- Name: dispensaries dispensaries_azdhs_id_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensaries
ADD CONSTRAINT dispensaries_azdhs_id_key UNIQUE (azdhs_id);
--
-- Name: dispensaries dispensaries_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensaries
ADD CONSTRAINT dispensaries_pkey PRIMARY KEY (id);
--
-- Name: dispensaries dispensaries_slug_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensaries
ADD CONSTRAINT dispensaries_slug_key UNIQUE (slug);
--
-- Name: dispensary_changes dispensary_changes_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_changes
ADD CONSTRAINT dispensary_changes_pkey PRIMARY KEY (id);
--
-- Name: dispensary_crawl_jobs dispensary_crawl_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_jobs
ADD CONSTRAINT dispensary_crawl_jobs_pkey PRIMARY KEY (id);
--
-- Name: dispensary_crawl_schedule dispensary_crawl_schedule_dispensary_id_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_schedule
ADD CONSTRAINT dispensary_crawl_schedule_dispensary_id_key UNIQUE (dispensary_id);
--
-- Name: dispensary_crawl_schedule dispensary_crawl_schedule_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_schedule
ADD CONSTRAINT dispensary_crawl_schedule_pkey PRIMARY KEY (id);
--
-- Name: dutchie_product_snapshots dutchie_product_snapshots_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_product_snapshots
ADD CONSTRAINT dutchie_product_snapshots_pkey PRIMARY KEY (id);
--
-- Name: dutchie_products dutchie_products_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_products
ADD CONSTRAINT dutchie_products_pkey PRIMARY KEY (id);
--
-- Name: failed_proxies failed_proxies_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.failed_proxies
ADD CONSTRAINT failed_proxies_pkey PRIMARY KEY (id);
--
-- Name: jobs jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.jobs
ADD CONSTRAINT jobs_pkey PRIMARY KEY (id);
--
-- Name: price_history price_history_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.price_history
ADD CONSTRAINT price_history_pkey PRIMARY KEY (id);
--
-- Name: product_categories product_categories_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.product_categories
ADD CONSTRAINT product_categories_pkey PRIMARY KEY (id);
--
-- Name: product_categories product_categories_product_id_category_slug_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.product_categories
ADD CONSTRAINT product_categories_product_id_category_slug_key UNIQUE (product_id, category_slug);
--
-- Name: products products_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.products
ADD CONSTRAINT products_pkey PRIMARY KEY (id);
--
-- Name: products products_store_id_slug_unique; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.products
ADD CONSTRAINT products_store_id_slug_unique UNIQUE (store_id, slug);
--
-- Name: proxies proxies_host_port_protocol_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.proxies
ADD CONSTRAINT proxies_host_port_protocol_key UNIQUE (host, port, protocol);
--
-- Name: proxies proxies_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.proxies
ADD CONSTRAINT proxies_pkey PRIMARY KEY (id);
--
-- Name: proxy_test_jobs proxy_test_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.proxy_test_jobs
ADD CONSTRAINT proxy_test_jobs_pkey PRIMARY KEY (id);
--
-- Name: sandbox_crawl_jobs sandbox_crawl_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.sandbox_crawl_jobs
ADD CONSTRAINT sandbox_crawl_jobs_pkey PRIMARY KEY (id);
--
-- Name: settings settings_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.settings
ADD CONSTRAINT settings_pkey PRIMARY KEY (key);
--
-- Name: specials specials_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.specials
ADD CONSTRAINT specials_pkey PRIMARY KEY (id);
--
-- Name: store_crawl_schedule store_crawl_schedule_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.store_crawl_schedule
ADD CONSTRAINT store_crawl_schedule_pkey PRIMARY KEY (id);
--
-- Name: stores stores_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.stores
ADD CONSTRAINT stores_pkey PRIMARY KEY (id);
--
-- Name: stores stores_slug_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.stores
ADD CONSTRAINT stores_slug_key UNIQUE (slug);
--
-- Name: dutchie_products uk_dutchie_products; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_products
ADD CONSTRAINT uk_dutchie_products UNIQUE (dispensary_id, external_product_id);
--
-- Name: crawler_schedule uq_crawler_schedule_type; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_schedule
ADD CONSTRAINT uq_crawler_schedule_type UNIQUE (schedule_type);
--
-- Name: store_crawl_schedule uq_store_crawl_schedule_store; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.store_crawl_schedule
ADD CONSTRAINT uq_store_crawl_schedule_store UNIQUE (store_id);
--
-- Name: crawler_templates uq_template_name; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_templates
ADD CONSTRAINT uq_template_name UNIQUE (provider, name, version);
--
-- Name: users users_email_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.users
ADD CONSTRAINT users_email_key UNIQUE (email);
--
-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.users
ADD CONSTRAINT users_pkey PRIMARY KEY (id);
--
-- Name: wp_dutchie_api_permissions wp_dutchie_api_permissions_api_key_key; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.wp_dutchie_api_permissions
ADD CONSTRAINT wp_dutchie_api_permissions_api_key_key UNIQUE (api_key);
--
-- Name: wp_dutchie_api_permissions wp_dutchie_api_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.wp_dutchie_api_permissions
ADD CONSTRAINT wp_dutchie_api_permissions_pkey PRIMARY KEY (id);
--
-- Name: failed_proxies_host_port_protocol_idx; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE UNIQUE INDEX failed_proxies_host_port_protocol_idx ON public.failed_proxies USING btree (host, port, protocol);
--
-- Name: idx_api_token_usage_created_at; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_api_token_usage_created_at ON public.api_token_usage USING btree (created_at);
--
-- Name: idx_api_token_usage_endpoint; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_api_token_usage_endpoint ON public.api_token_usage USING btree (endpoint);
--
-- Name: idx_api_token_usage_token_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_api_token_usage_token_id ON public.api_token_usage USING btree (token_id);
--
-- Name: idx_api_tokens_active; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_api_tokens_active ON public.api_tokens USING btree (active);
--
-- Name: idx_api_tokens_token; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_api_tokens_token ON public.api_tokens USING btree (token);
--
-- Name: idx_batch_history_product; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_batch_history_product ON public.batch_history USING btree (product_id, recorded_at DESC);
--
-- Name: idx_batch_history_recorded; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_batch_history_recorded ON public.batch_history USING btree (recorded_at DESC);
--
-- Name: idx_brand_history_brand; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brand_history_brand ON public.brand_history USING btree (brand_name, event_at DESC);
--
-- Name: idx_brand_history_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brand_history_dispensary ON public.brand_history USING btree (dispensary_id, event_at DESC);
--
-- Name: idx_brand_history_event; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brand_history_event ON public.brand_history USING btree (event_type, event_at DESC);
--
-- Name: idx_brand_jobs_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brand_jobs_dispensary ON public.brand_scrape_jobs USING btree (dispensary_id);
--
-- Name: idx_brand_jobs_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brand_jobs_status ON public.brand_scrape_jobs USING btree (status);
--
-- Name: idx_brand_jobs_worker; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brand_jobs_worker ON public.brand_scrape_jobs USING btree (worker_id) WHERE (worker_id IS NOT NULL);
--
-- Name: idx_brands_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brands_dispensary ON public.brands USING btree (dispensary_id);
--
-- Name: idx_brands_last_seen; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brands_last_seen ON public.brands USING btree (last_seen_at DESC);
--
-- Name: idx_brands_store_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_brands_store_id ON public.brands USING btree (store_id);
--
-- Name: idx_brands_store_name; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE UNIQUE INDEX idx_brands_store_name ON public.brands USING btree (store_id, name);
--
-- Name: idx_categories_dispensary_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_categories_dispensary_id ON public.categories USING btree (dispensary_id);
--
-- Name: idx_categories_parent_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_categories_parent_id ON public.categories USING btree (parent_id);
--
-- Name: idx_categories_path; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_categories_path ON public.categories USING btree (path);
--
-- Name: idx_clicks_campaign_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_clicks_campaign_id ON public.clicks USING btree (campaign_id);
--
-- Name: idx_clicks_clicked_at; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_clicks_clicked_at ON public.clicks USING btree (clicked_at);
--
-- Name: idx_clicks_product_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_clicks_product_id ON public.clicks USING btree (product_id);
--
-- Name: idx_crawl_jobs_pending; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_crawl_jobs_pending ON public.crawl_jobs USING btree (scheduled_at) WHERE ((status)::text = 'pending'::text);
--
-- Name: idx_crawl_jobs_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_crawl_jobs_status ON public.crawl_jobs USING btree (status);
--
-- Name: idx_crawl_jobs_store_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_crawl_jobs_store_status ON public.crawl_jobs USING btree (store_id, status);
--
-- Name: idx_crawl_jobs_store_time; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_crawl_jobs_store_time ON public.crawl_jobs USING btree (store_id, created_at DESC);
--
-- Name: idx_disp_brand_mode; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_brand_mode ON public.dispensaries USING btree (brand_crawler_mode);
--
-- Name: idx_disp_brand_provider; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_brand_provider ON public.dispensaries USING btree (brand_provider);
--
-- Name: idx_disp_metadata_mode; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_metadata_mode ON public.dispensaries USING btree (metadata_crawler_mode);
--
-- Name: idx_disp_metadata_provider; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_metadata_provider ON public.dispensaries USING btree (metadata_provider);
--
-- Name: idx_disp_product_mode; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_product_mode ON public.dispensaries USING btree (product_crawler_mode);
--
-- Name: idx_disp_product_provider; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_product_provider ON public.dispensaries USING btree (product_provider);
--
-- Name: idx_disp_specials_mode; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_specials_mode ON public.dispensaries USING btree (specials_crawler_mode);
--
-- Name: idx_disp_specials_provider; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_disp_specials_provider ON public.dispensaries USING btree (specials_provider);
--
-- Name: idx_dispensaries_azdhs_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_azdhs_id ON public.dispensaries USING btree (azdhs_id);
--
-- Name: idx_dispensaries_city; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_city ON public.dispensaries USING btree (city);
--
-- Name: idx_dispensaries_crawl_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_crawl_status ON public.dispensaries USING btree (crawl_status);
--
-- Name: idx_dispensaries_crawler_mode; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_crawler_mode ON public.dispensaries USING btree (crawler_mode);
--
-- Name: idx_dispensaries_crawler_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_crawler_status ON public.dispensaries USING btree (crawler_status);
--
-- Name: idx_dispensaries_dutchie_production; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_dutchie_production ON public.dispensaries USING btree (id) WHERE (((menu_provider)::text = 'dutchie'::text) AND ((crawler_mode)::text = 'production'::text));
--
-- Name: idx_dispensaries_location; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_location ON public.dispensaries USING btree (latitude, longitude) WHERE ((latitude IS NOT NULL) AND (longitude IS NOT NULL));
--
-- Name: idx_dispensaries_menu_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_menu_status ON public.dispensaries USING btree (menu_scrape_status);
--
-- Name: idx_dispensaries_needs_detection; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_needs_detection ON public.dispensaries USING btree (id) WHERE ((menu_provider IS NULL) OR (menu_provider_confidence < 70));
--
-- Name: idx_dispensaries_next_crawl; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_next_crawl ON public.dispensaries USING btree (next_crawl_at) WHERE (scrape_enabled = true);
--
-- Name: idx_dispensaries_provider; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_provider ON public.dispensaries USING btree (menu_provider);
--
-- Name: idx_dispensaries_provider_confidence; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_provider_confidence ON public.dispensaries USING btree (menu_provider_confidence);
--
-- Name: idx_dispensaries_sandbox; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_sandbox ON public.dispensaries USING btree (id) WHERE ((crawler_mode)::text = 'sandbox'::text);
--
-- Name: idx_dispensaries_slug; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_slug ON public.dispensaries USING btree (slug);
--
-- Name: idx_dispensaries_state; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensaries_state ON public.dispensaries USING btree (state);
--
-- Name: idx_dispensary_changes_created_at; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_changes_created_at ON public.dispensary_changes USING btree (created_at DESC);
--
-- Name: idx_dispensary_changes_dispensary_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_changes_dispensary_status ON public.dispensary_changes USING btree (dispensary_id, status);
--
-- Name: idx_dispensary_changes_requires_recrawl; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_changes_requires_recrawl ON public.dispensary_changes USING btree (requires_recrawl) WHERE (requires_recrawl = true);
--
-- Name: idx_dispensary_changes_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_changes_status ON public.dispensary_changes USING btree (status);
--
-- Name: idx_dispensary_crawl_jobs_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_jobs_dispensary ON public.dispensary_crawl_jobs USING btree (dispensary_id, created_at DESC);
--
-- Name: idx_dispensary_crawl_jobs_pending; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_jobs_pending ON public.dispensary_crawl_jobs USING btree (priority DESC, scheduled_at) WHERE ((status)::text = 'pending'::text);
--
-- Name: idx_dispensary_crawl_jobs_recent; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_jobs_recent ON public.dispensary_crawl_jobs USING btree (created_at DESC);
--
-- Name: idx_dispensary_crawl_jobs_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_jobs_status ON public.dispensary_crawl_jobs USING btree (status);
--
-- Name: idx_dispensary_crawl_schedule_active; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_schedule_active ON public.dispensary_crawl_schedule USING btree (is_active);
--
-- Name: idx_dispensary_crawl_schedule_next_run; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_schedule_next_run ON public.dispensary_crawl_schedule USING btree (next_run_at) WHERE (is_active = true);
--
-- Name: idx_dispensary_crawl_schedule_priority; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_schedule_priority ON public.dispensary_crawl_schedule USING btree (priority DESC, next_run_at);
--
-- Name: idx_dispensary_crawl_schedule_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_dispensary_crawl_schedule_status ON public.dispensary_crawl_schedule USING btree (last_status);
--
-- Name: idx_jobs_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_jobs_status ON public.jobs USING btree (status);
--
-- Name: idx_jobs_store_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_jobs_store_id ON public.jobs USING btree (store_id);
--
-- Name: idx_jobs_type; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_jobs_type ON public.jobs USING btree (type);
--
-- Name: idx_price_history_product; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_price_history_product ON public.price_history USING btree (product_id, recorded_at DESC);
--
-- Name: idx_price_history_recorded; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_price_history_recorded ON public.price_history USING btree (recorded_at DESC);
--
-- Name: idx_product_categories_product; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_product_categories_product ON public.product_categories USING btree (product_id);
--
-- Name: idx_product_categories_slug; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_product_categories_slug ON public.product_categories USING btree (category_slug, last_seen_at DESC);
--
-- Name: idx_products_availability_by_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_availability_by_dispensary ON public.products USING btree (dispensary_id, availability_status) WHERE (dispensary_id IS NOT NULL);
--
-- Name: idx_products_availability_by_store; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_availability_by_store ON public.products USING btree (store_id, availability_status) WHERE (store_id IS NOT NULL);
--
-- Name: idx_products_availability_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_availability_status ON public.products USING btree (availability_status);
--
-- Name: idx_products_brand_external; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_brand_external ON public.products USING btree (brand_external_id);
--
-- Name: idx_products_dispensary_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_dispensary_id ON public.products USING btree (dispensary_id);
--
-- Name: idx_products_enterprise; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_enterprise ON public.products USING btree (enterprise_product_id);
--
-- Name: idx_products_is_special; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_is_special ON public.products USING btree (is_on_special);
--
-- Name: idx_products_sku; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_sku ON public.products USING btree (sku);
--
-- Name: idx_products_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_status ON public.products USING btree (status);
--
-- Name: idx_products_stock_quantity; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_stock_quantity ON public.products USING btree (stock_quantity) WHERE (stock_quantity IS NOT NULL);
--
-- Name: idx_products_stock_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_stock_status ON public.products USING btree (stock_status);
--
-- Name: idx_products_subcategory; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_products_subcategory ON public.products USING btree (subcategory);
--
-- Name: idx_proxies_location; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_proxies_location ON public.proxies USING btree (country_code, state, city);
--
-- Name: idx_proxy_test_jobs_created_at; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_proxy_test_jobs_created_at ON public.proxy_test_jobs USING btree (created_at DESC);
--
-- Name: idx_proxy_test_jobs_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_proxy_test_jobs_status ON public.proxy_test_jobs USING btree (status);
--
-- Name: idx_sandbox_active_per_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE UNIQUE INDEX idx_sandbox_active_per_dispensary ON public.crawler_sandboxes USING btree (dispensary_id) WHERE ((status)::text <> ALL ((ARRAY['moved_to_production'::character varying, 'failed'::character varying])::text[]));
--
-- Name: idx_sandbox_category; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_category ON public.crawler_sandboxes USING btree (category);
--
-- Name: idx_sandbox_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_dispensary ON public.crawler_sandboxes USING btree (dispensary_id);
--
-- Name: idx_sandbox_job_category; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_job_category ON public.sandbox_crawl_jobs USING btree (category);
--
-- Name: idx_sandbox_job_dispensary; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_job_dispensary ON public.sandbox_crawl_jobs USING btree (dispensary_id);
--
-- Name: idx_sandbox_job_pending; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_job_pending ON public.sandbox_crawl_jobs USING btree (scheduled_at) WHERE ((status)::text = 'pending'::text);
--
-- Name: idx_sandbox_job_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_job_status ON public.sandbox_crawl_jobs USING btree (status);
--
-- Name: idx_sandbox_mode; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_mode ON public.crawler_sandboxes USING btree (mode);
--
-- Name: idx_sandbox_status; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_status ON public.crawler_sandboxes USING btree (status);
--
-- Name: idx_sandbox_suspected_provider; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_suspected_provider ON public.crawler_sandboxes USING btree (suspected_menu_provider);
--
-- Name: idx_sandbox_template; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_sandbox_template ON public.crawler_sandboxes USING btree (template_name);
--
-- Name: idx_specials_product_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_specials_product_id ON public.specials USING btree (product_id);
--
-- Name: idx_specials_store_date; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_specials_store_date ON public.specials USING btree (store_id, valid_date DESC);
--
-- Name: idx_stores_dispensary_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_stores_dispensary_id ON public.stores USING btree (dispensary_id);
--
-- Name: idx_template_active; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_template_active ON public.crawler_templates USING btree (is_active);
--
-- Name: idx_template_default; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_template_default ON public.crawler_templates USING btree (provider, is_default_for_provider) WHERE (is_default_for_provider = true);
--
-- Name: idx_template_provider; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_template_provider ON public.crawler_templates USING btree (provider);
--
-- Name: idx_wp_api_permissions_store_id; Type: INDEX; Schema: public; Owner: dutchie
--
CREATE INDEX idx_wp_api_permissions_store_id ON public.wp_dutchie_api_permissions USING btree (store_id);
--
-- Name: api_tokens api_tokens_updated_at; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER api_tokens_updated_at BEFORE UPDATE ON public.api_tokens FOR EACH ROW EXECUTE FUNCTION public.update_api_token_updated_at();
--
-- Name: crawl_jobs trigger_crawl_jobs_updated_at; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_crawl_jobs_updated_at BEFORE UPDATE ON public.crawl_jobs FOR EACH ROW EXECUTE FUNCTION public.update_schedule_updated_at();
--
-- Name: crawler_schedule trigger_crawler_schedule_updated_at; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_crawler_schedule_updated_at BEFORE UPDATE ON public.crawler_schedule FOR EACH ROW EXECUTE FUNCTION public.update_schedule_updated_at();
--
-- Name: sandbox_crawl_jobs trigger_sandbox_job_updated_at; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_sandbox_job_updated_at BEFORE UPDATE ON public.sandbox_crawl_jobs FOR EACH ROW EXECUTE FUNCTION public.update_sandbox_timestamp();
--
-- Name: crawler_sandboxes trigger_sandbox_updated_at; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_sandbox_updated_at BEFORE UPDATE ON public.crawler_sandboxes FOR EACH ROW EXECUTE FUNCTION public.update_sandbox_timestamp();
--
-- Name: dispensary_changes trigger_set_requires_recrawl; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_set_requires_recrawl BEFORE INSERT ON public.dispensary_changes FOR EACH ROW EXECUTE FUNCTION public.set_requires_recrawl();
--
-- Name: store_crawl_schedule trigger_store_crawl_schedule_updated_at; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_store_crawl_schedule_updated_at BEFORE UPDATE ON public.store_crawl_schedule FOR EACH ROW EXECUTE FUNCTION public.update_schedule_updated_at();
--
-- Name: crawler_templates trigger_template_updated_at; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_template_updated_at BEFORE UPDATE ON public.crawler_templates FOR EACH ROW EXECUTE FUNCTION public.update_sandbox_timestamp();
--
-- Name: brand_scrape_jobs trigger_update_brand_scrape_jobs_timestamp; Type: TRIGGER; Schema: public; Owner: dutchie
--
CREATE TRIGGER trigger_update_brand_scrape_jobs_timestamp BEFORE UPDATE ON public.brand_scrape_jobs FOR EACH ROW EXECUTE FUNCTION public.update_brand_scrape_jobs_updated_at();
--
-- Name: api_token_usage api_token_usage_token_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.api_token_usage
ADD CONSTRAINT api_token_usage_token_id_fkey FOREIGN KEY (token_id) REFERENCES public.api_tokens(id) ON DELETE CASCADE;
--
-- Name: api_tokens api_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.api_tokens
ADD CONSTRAINT api_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
--
-- Name: batch_history batch_history_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.batch_history
ADD CONSTRAINT batch_history_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;
--
-- Name: brand_history brand_history_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brand_history
ADD CONSTRAINT brand_history_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: brand_scrape_jobs brand_scrape_jobs_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brand_scrape_jobs
ADD CONSTRAINT brand_scrape_jobs_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id);
--
-- Name: brands brands_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brands
ADD CONSTRAINT brands_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id);
--
-- Name: brands brands_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.brands
ADD CONSTRAINT brands_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id) ON DELETE CASCADE;
--
-- Name: campaign_products campaign_products_campaign_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaign_products
ADD CONSTRAINT campaign_products_campaign_id_fkey FOREIGN KEY (campaign_id) REFERENCES public.campaigns(id) ON DELETE CASCADE;
--
-- Name: campaign_products campaign_products_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.campaign_products
ADD CONSTRAINT campaign_products_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;
--
-- Name: categories categories_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT categories_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: categories categories_parent_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT categories_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES public.categories(id) ON DELETE CASCADE;
--
-- Name: categories categories_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT categories_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id) ON DELETE CASCADE;
--
-- Name: clicks clicks_campaign_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.clicks
ADD CONSTRAINT clicks_campaign_id_fkey FOREIGN KEY (campaign_id) REFERENCES public.campaigns(id) ON DELETE SET NULL;
--
-- Name: clicks clicks_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.clicks
ADD CONSTRAINT clicks_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;
--
-- Name: crawl_jobs crawl_jobs_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawl_jobs
ADD CONSTRAINT crawl_jobs_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id) ON DELETE CASCADE;
--
-- Name: crawler_sandboxes crawler_sandboxes_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.crawler_sandboxes
ADD CONSTRAINT crawler_sandboxes_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: dispensaries dispensaries_azdhs_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensaries
ADD CONSTRAINT dispensaries_azdhs_id_fkey FOREIGN KEY (azdhs_id) REFERENCES public.azdhs_list(id);
--
-- Name: dispensary_changes dispensary_changes_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_changes
ADD CONSTRAINT dispensary_changes_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: dispensary_changes dispensary_changes_reviewed_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_changes
ADD CONSTRAINT dispensary_changes_reviewed_by_fkey FOREIGN KEY (reviewed_by) REFERENCES public.users(id);
--
-- Name: dispensary_crawl_jobs dispensary_crawl_jobs_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_jobs
ADD CONSTRAINT dispensary_crawl_jobs_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: dispensary_crawl_jobs dispensary_crawl_jobs_schedule_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_jobs
ADD CONSTRAINT dispensary_crawl_jobs_schedule_id_fkey FOREIGN KEY (schedule_id) REFERENCES public.dispensary_crawl_schedule(id) ON DELETE SET NULL;
--
-- Name: dispensary_crawl_schedule dispensary_crawl_schedule_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dispensary_crawl_schedule
ADD CONSTRAINT dispensary_crawl_schedule_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: dutchie_product_snapshots dutchie_product_snapshots_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_product_snapshots
ADD CONSTRAINT dutchie_product_snapshots_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: dutchie_product_snapshots dutchie_product_snapshots_dutchie_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_product_snapshots
ADD CONSTRAINT dutchie_product_snapshots_dutchie_product_id_fkey FOREIGN KEY (dutchie_product_id) REFERENCES public.dutchie_products(id) ON DELETE CASCADE;
--
-- Name: dutchie_products dutchie_products_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.dutchie_products
ADD CONSTRAINT dutchie_products_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: jobs jobs_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.jobs
ADD CONSTRAINT jobs_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id) ON DELETE CASCADE;
--
-- Name: price_history price_history_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.price_history
ADD CONSTRAINT price_history_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;
--
-- Name: product_categories product_categories_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.product_categories
ADD CONSTRAINT product_categories_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;
--
-- Name: products products_category_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.products
ADD CONSTRAINT products_category_id_fkey FOREIGN KEY (category_id) REFERENCES public.categories(id) ON DELETE SET NULL;
--
-- Name: products products_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.products
ADD CONSTRAINT products_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: products products_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.products
ADD CONSTRAINT products_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id) ON DELETE CASCADE;
--
-- Name: sandbox_crawl_jobs sandbox_crawl_jobs_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.sandbox_crawl_jobs
ADD CONSTRAINT sandbox_crawl_jobs_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE CASCADE;
--
-- Name: sandbox_crawl_jobs sandbox_crawl_jobs_sandbox_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.sandbox_crawl_jobs
ADD CONSTRAINT sandbox_crawl_jobs_sandbox_id_fkey FOREIGN KEY (sandbox_id) REFERENCES public.crawler_sandboxes(id) ON DELETE SET NULL;
--
-- Name: specials specials_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.specials
ADD CONSTRAINT specials_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;
--
-- Name: specials specials_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.specials
ADD CONSTRAINT specials_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id) ON DELETE CASCADE;
--
-- Name: store_crawl_schedule store_crawl_schedule_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.store_crawl_schedule
ADD CONSTRAINT store_crawl_schedule_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id) ON DELETE CASCADE;
--
-- Name: stores stores_dispensary_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.stores
ADD CONSTRAINT stores_dispensary_id_fkey FOREIGN KEY (dispensary_id) REFERENCES public.dispensaries(id) ON DELETE SET NULL;
--
-- Name: wp_dutchie_api_permissions wp_dutchie_api_permissions_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: dutchie
--
ALTER TABLE ONLY public.wp_dutchie_api_permissions
ADD CONSTRAINT wp_dutchie_api_permissions_store_id_fkey FOREIGN KEY (store_id) REFERENCES public.stores(id);
--
-- PostgreSQL database dump complete
--
\unrestrict u76b1lsSuckyRNpZbORH9drBRaNwzQbqR7X3xYnHxUdiczMnjtBCdx8KbLlDBsP