new-site/api/migrations/009_entity_cache.sql
justin f8cd37ac8c Initial commit — Performance West telecom compliance platform
Includes: API (Express/TypeScript), Astro site, Python workers,
document generators, FCC compliance tools, Canada CRTC formation,
Ansible infrastructure, and deployment scripts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 06:54:22 -05:00

48 lines
2.3 KiB
SQL

-- 009: Entity cache — stores bulk-downloaded business entity records
-- from state Secretary of State open data portals.
-- Used by Verilex Data Professional API via internal bulk export endpoint.
CREATE TABLE IF NOT EXISTS entity_cache (
id SERIAL PRIMARY KEY,
jurisdiction TEXT NOT NULL, -- US_CO, US_NY, etc.
entity_name TEXT NOT NULL,
entity_number TEXT, -- state filing number
entity_type TEXT, -- LLC, CORPORATION, LP, LLP, etc.
status TEXT, -- ACTIVE, DISSOLVED, SUSPENDED, DELINQUENT
formation_date DATE,
dissolution_date DATE,
registered_agent TEXT,
principal_address TEXT,
state TEXT NOT NULL, -- 2-letter
source TEXT DEFAULT 'socrata', -- socrata, sftp, csv, playwright
raw_data JSONB, -- original source record for debugging
last_synced TIMESTAMPTZ DEFAULT NOW(),
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(jurisdiction, entity_number)
);
CREATE INDEX IF NOT EXISTS idx_ec_state ON entity_cache (state);
CREATE INDEX IF NOT EXISTS idx_ec_name ON entity_cache USING gin (entity_name gin_trgm_ops);
CREATE INDEX IF NOT EXISTS idx_ec_number ON entity_cache (entity_number);
CREATE INDEX IF NOT EXISTS idx_ec_status ON entity_cache (status);
CREATE INDEX IF NOT EXISTS idx_ec_synced ON entity_cache (last_synced);
-- Name search cache — stores results of live name availability searches
-- to avoid hammering state portals. Entries expire after 24 hours.
CREATE TABLE IF NOT EXISTS name_search_cache (
id SERIAL PRIMARY KEY,
state_code CHAR(2) NOT NULL,
searched_name TEXT NOT NULL,
available BOOLEAN,
exact_match BOOLEAN DEFAULT FALSE,
similar_names TEXT[],
raw_response TEXT,
searched_at TIMESTAMPTZ DEFAULT NOW(),
expires_at TIMESTAMPTZ DEFAULT NOW() + INTERVAL '24 hours',
UNIQUE(state_code, searched_name)
);
CREATE INDEX IF NOT EXISTS idx_nsc_lookup ON name_search_cache (state_code, searched_name) WHERE expires_at > NOW();
-- Enable trigram extension if not already enabled
CREATE EXTENSION IF NOT EXISTS pg_trgm;