- 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>
4043 lines
114 KiB
PL/PgSQL
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
|
|
|