Files
cannaiq/backend/migrations/011_create_dispensaries_table.sql
2025-11-28 19:45:44 -07:00

54 lines
2.2 KiB
SQL

-- Create dispensaries table as single source of truth
-- This consolidates azdhs_list (official data) + stores (menu data) into one table
CREATE TABLE dispensaries (
-- Primary key
id SERIAL PRIMARY KEY,
-- Link to source data
azdhs_id INTEGER UNIQUE REFERENCES azdhs_list(id),
-- AZDHS official data (source of truth for legal/address info)
name VARCHAR(255) NOT NULL,
company_name VARCHAR(255),
address VARCHAR(500) NOT NULL,
city VARCHAR(100) NOT NULL,
state VARCHAR(2) NOT NULL,
zip VARCHAR(10),
status_line VARCHAR(100),
azdhs_url TEXT,
latitude DECIMAL(10, 8),
longitude DECIMAL(11, 8),
-- Enriched data (source of truth from Google Maps)
dba_name VARCHAR(255), -- "Doing Business As" - display name
phone VARCHAR(20), -- From Google Maps, not AZDHS
email VARCHAR(255), -- From Google Maps (rare)
website TEXT, -- From Google Maps, not AZDHS
google_rating DECIMAL(2, 1), -- e.g., 4.7
google_review_count INTEGER, -- e.g., 1234
-- Menu/scraper configuration
menu_url TEXT, -- Dutchie or custom menu URL
scraper_template VARCHAR(100), -- 'sol-flower', 'curaleaf', 'deeply-rooted', 'generic-dutchie'
scraper_config JSONB, -- Store age gate settings, special navigation patterns
last_menu_scrape TIMESTAMP,
menu_scrape_status VARCHAR(50) DEFAULT 'pending', -- 'pending', 'active', 'needs_recrawl', 'failed', 'no_menu'
-- SEO and routing
slug VARCHAR(255) UNIQUE NOT NULL,
-- Metadata
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Create indexes for common queries
CREATE INDEX idx_dispensaries_city ON dispensaries(city);
CREATE INDEX idx_dispensaries_state ON dispensaries(state);
CREATE INDEX idx_dispensaries_slug ON dispensaries(slug);
CREATE INDEX idx_dispensaries_azdhs_id ON dispensaries(azdhs_id);
CREATE INDEX idx_dispensaries_menu_status ON dispensaries(menu_scrape_status);
-- Create index for location-based queries
CREATE INDEX idx_dispensaries_location ON dispensaries(latitude, longitude) WHERE latitude IS NOT NULL AND longitude IS NOT NULL;