RTIX / migrations /0001_baseline.sql
github-actions
deploy: clean backend production release
d8ffec9
-- 001_baseline.sql
-- Merchants Table
CREATE TABLE IF NOT EXISTS merchants (
merchant_id VARCHAR PRIMARY KEY,
email VARCHAR NOT NULL UNIQUE,
password_hash VARCHAR NOT NULL,
brand_name VARCHAR NOT NULL,
slug VARCHAR NOT NULL UNIQUE,
social_url VARCHAR,
upi_id VARCHAR,
recovery_key VARCHAR,
session_version BIGINT NOT NULL DEFAULT 1,
delivery_rate_per_km DOUBLE PRECISION NOT NULL DEFAULT 10.0,
delivery_base_fee DOUBLE PRECISION NOT NULL DEFAULT 20.0,
base_pincode VARCHAR NOT NULL DEFAULT '560001',
auto_settle_threshold DOUBLE PRECISION DEFAULT 0.5,
business_address TEXT,
logistics_config JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Product Links Table
CREATE TABLE IF NOT EXISTS product_links (
link_id VARCHAR PRIMARY KEY,
merchant_id VARCHAR NOT NULL,
product_name VARCHAR NOT NULL,
price_inr DOUBLE PRECISION NOT NULL,
image_data TEXT,
expected_weight DOUBLE PRECISION NOT NULL DEFAULT 0.0,
link_views BIGINT NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Orders Table
CREATE TABLE IF NOT EXISTS orders (
transaction_id VARCHAR PRIMARY KEY,
merchant_id VARCHAR NOT NULL,
link_id VARCHAR NOT NULL,
buyer_phone VARCHAR NOT NULL,
buyer_name VARCHAR NOT NULL DEFAULT '',
buyer_email VARCHAR NOT NULL DEFAULT '',
shipping_pincode VARCHAR,
delivery_address TEXT,
price_inr DOUBLE PRECISION NOT NULL,
status VARCHAR NOT NULL,
vpa VARCHAR NOT NULL DEFAULT '',
outbound_weight DOUBLE PRECISION NOT NULL DEFAULT 0.0,
return_weight DOUBLE PRECISION NOT NULL DEFAULT 0.0,
proof_data TEXT,
proof_received_at TIMESTAMP,
settled_at TIMESTAMP,
paid_at TIMESTAMP,
payu_id VARCHAR NOT NULL DEFAULT '',
shipped_at TIMESTAMP,
delivered_at TIMESTAMP,
estimated_delivery_at TIMESTAMP,
shipping_method VARCHAR,
is_payment BOOLEAN NOT NULL DEFAULT FALSE,
platform_fee_paid BOOLEAN NOT NULL DEFAULT FALSE,
platform_fee DOUBLE PRECISION NOT NULL DEFAULT 0.0,
delivery_fee DOUBLE PRECISION NOT NULL DEFAULT 0.0,
distance_km DOUBLE PRECISION NOT NULL DEFAULT 0.0,
risk_score DOUBLE PRECISION DEFAULT 0.0,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Feedback Table
CREATE TABLE IF NOT EXISTS feedback (
id BIGSERIAL PRIMARY KEY,
merchant_id VARCHAR,
category VARCHAR,
message TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Risk Audit Logs Table
CREATE TABLE IF NOT EXISTS risk_audit_logs (
id BIGSERIAL PRIMARY KEY,
transaction_id VARCHAR,
merchant_id VARCHAR NOT NULL,
event_type VARCHAR NOT NULL,
risk_level VARCHAR NOT NULL,
details TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Idempotency Keys Table
CREATE TABLE IF NOT EXISTS idempotency_keys (
key VARCHAR NOT NULL,
merchant_id VARCHAR,
action_scope VARCHAR NOT NULL DEFAULT 'global',
request_hash VARCHAR NOT NULL,
response_data TEXT,
status VARCHAR NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP,
PRIMARY KEY (key, merchant_id, action_scope)
);
-- Customers Table
CREATE TABLE IF NOT EXISTS customers (
customer_id VARCHAR PRIMARY KEY,
phone VARCHAR NOT NULL UNIQUE,
name VARCHAR,
email VARCHAR,
password_hash VARCHAR NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Security Blocks Table
CREATE TABLE IF NOT EXISTS security_blocks (
ip VARCHAR PRIMARY KEY,
reason VARCHAR,
block_level VARCHAR NOT NULL,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Login Attempts Table
CREATE TABLE IF NOT EXISTS login_attempts (
id BIGSERIAL PRIMARY KEY,
email VARCHAR NOT NULL,
ip_address VARCHAR NOT NULL,
successful BOOLEAN NOT NULL DEFAULT FALSE,
attempted_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Indices
CREATE INDEX IF NOT EXISTS idx_merchants_email ON merchants(email);
CREATE INDEX IF NOT EXISTS idx_merchants_slug ON merchants(slug);
CREATE INDEX IF NOT EXISTS idx_product_links_merchant ON product_links(merchant_id);
CREATE INDEX IF NOT EXISTS idx_orders_merchant_status ON orders(merchant_id, status);
CREATE INDEX IF NOT EXISTS idx_orders_link ON orders(link_id);
CREATE INDEX IF NOT EXISTS idx_orders_phone ON orders(buyer_phone);
CREATE INDEX IF NOT EXISTS idx_risk_merchant ON risk_audit_logs(merchant_id);
CREATE INDEX IF NOT EXISTS idx_login_attempts_email_time ON login_attempts(email, attempted_at);
CREATE INDEX IF NOT EXISTS idx_login_attempts_ip_time ON login_attempts(ip_address, attempted_at);
CREATE INDEX IF NOT EXISTS idx_idempotency_lookup ON idempotency_keys(key, merchant_id, action_scope);
CREATE INDEX IF NOT EXISTS idx_orders_pincode_prefix ON orders ((LEFT(shipping_pincode, 3)));
CREATE INDEX IF NOT EXISTS idx_orders_status_created ON orders(status, created_at);
CREATE INDEX IF NOT EXISTS idx_orders_merchant_created ON orders(merchant_id, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_orders_buyer_merchant ON orders(buyer_phone, merchant_id);
CREATE INDEX IF NOT EXISTS idx_security_blocks_expires ON security_blocks(ip, expires_at);
CREATE INDEX IF NOT EXISTS idx_customers_phone_unique ON customers(phone);