rspace-online/modules/providers/db/schema.sql

71 lines
2.1 KiB
SQL

-- Provider Registry schema (inside rSpace shared DB, schema: providers)
-- Uses earth_distance extension for proximity queries (lighter than PostGIS)
CREATE EXTENSION IF NOT EXISTS "cube";
CREATE EXTENSION IF NOT EXISTS "earthdistance";
CREATE TABLE IF NOT EXISTS providers.providers (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(200) NOT NULL,
description TEXT,
-- Location
lat DOUBLE PRECISION NOT NULL,
lng DOUBLE PRECISION NOT NULL,
address TEXT,
city VARCHAR(100),
region VARCHAR(100),
country CHAR(2),
service_radius_km DOUBLE PRECISION DEFAULT 0,
offers_shipping BOOLEAN DEFAULT FALSE,
-- Capabilities & substrates (arrays for containment queries)
capabilities TEXT[] NOT NULL DEFAULT '{}',
substrates TEXT[] NOT NULL DEFAULT '{}',
-- Turnaround
standard_days INTEGER,
rush_days INTEGER,
rush_surcharge_pct DOUBLE PRECISION DEFAULT 0,
-- Pricing (JSONB -- keyed by capability)
pricing JSONB DEFAULT '{}',
-- Community membership
communities TEXT[] NOT NULL DEFAULT '{}',
-- Contact
contact_email VARCHAR(255),
contact_phone VARCHAR(50),
contact_website VARCHAR(500),
-- Payment
wallet VARCHAR(255),
-- Reputation
jobs_completed INTEGER DEFAULT 0,
avg_rating DOUBLE PRECISION,
member_since TIMESTAMPTZ DEFAULT NOW(),
-- Status
active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_providers_location
ON providers.providers USING gist (ll_to_earth(lat, lng));
CREATE INDEX IF NOT EXISTS idx_providers_capabilities
ON providers.providers USING gin (capabilities);
CREATE INDEX IF NOT EXISTS idx_providers_substrates
ON providers.providers USING gin (substrates);
CREATE INDEX IF NOT EXISTS idx_providers_communities
ON providers.providers USING gin (communities);
CREATE INDEX IF NOT EXISTS idx_providers_active
ON providers.providers (active) WHERE active = TRUE;