real Supabase schema + data loaded; cleanup synthesized placeholder

Major changes:
- Drop synthesized base schema (supabase/synthesized/000_base_schema.sql) —
  real pg_dump from Supabase is now the source of truth
- Switch better-auth from better-auth/minimal to better-auth (full)
- Add localhost:9000 (MinIO) to next.config images allowlist
- Add .data/, bin/ to gitignore (local runtime artifacts)
- Ignore supabase/captured/ (regenerate from Supabase as needed)

DB state after dump:
- 65 real tables (vs 70 synthesized)
- 252 functions
- 5 brands: Tuxedo Corn, Indian River Direct + 3 test brands
- 3 admin users, 1 communication template, 7 brand features

Pooler URL: aws-1-us-east-1.pooler.supabase.com:5432
  user: postgres.wnzkhezyhnfzhkhiflrp
  (NOT aws-0 — that one doesn't know this project)
This commit is contained in:
2026-06-05 17:30:30 +00:00
parent b433c79677
commit be226d3430
6 changed files with 37 additions and 698 deletions
+1
View File
@@ -0,0 +1 @@
Captured Supabase dumps go here. Regenerate with docs/SUPABASE_DUMP_GUIDE.md
-694
View File
@@ -1,694 +0,0 @@
-- =====================================================================
-- SYNTHESIZED BASE SCHEMA - TEMPORARY
-- =====================================================================
-- This is a synthesized base schema derived from migration column
-- references. It exists to give the local DB a workable structure
-- BEFORE the real Supabase data dump arrives.
--
-- WHEN the brother removes the Supabase spend cap and the user gets
-- the real pg_dump, this entire file should be DROPPED and replaced
-- with the real schema from the dump. Do NOT rely on this for prod.
--
-- Pattern: every table has id (UUID PK), created_at, updated_at.
-- Columns confirmed by migrations are added with proper types.
-- For data we don't know about, a payload JSONB column holds it
-- so the dump can be loaded without constraint failures.
-- =====================================================================
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
-- ============== BRANDS ==============
CREATE TABLE IF NOT EXISTS brands (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
slug TEXT UNIQUE,
name TEXT,
owner_user_id UUID,
stripe_customer_id TEXT,
stripe_subscription_id TEXT,
stripe_subscription_status TEXT DEFAULT 'inactive',
stripe_current_period_end TIMESTAMPTZ,
plan_tier TEXT DEFAULT 'starter',
max_users INT DEFAULT 1,
max_stops_monthly INT DEFAULT 25,
max_products INT DEFAULT 50,
logo_url TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== BRAND SETTINGS ==============
CREATE TABLE IF NOT EXISTS brand_settings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
hero_tagline TEXT,
hero_image_url TEXT,
about_headline TEXT,
about_subheadline TEXT,
custom_footer_text TEXT,
show_wholesale_link BOOLEAN DEFAULT true,
show_zip_search BOOLEAN DEFAULT true,
show_schedule_pdf BOOLEAN DEFAULT true,
show_text_alerts BOOLEAN DEFAULT false,
schedule_pdf_notes TEXT,
brand_primary_color TEXT DEFAULT '#16a34a',
brand_secondary_color TEXT DEFAULT '#f5f5f4',
brand_bg_color TEXT DEFAULT '#fafaf9',
brand_text_color TEXT DEFAULT '#1c1917',
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== BRAND FEATURES (add-ons) ==============
CREATE TABLE IF NOT EXISTS brand_features (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
feature_key TEXT,
enabled BOOLEAN DEFAULT false,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== PRODUCTS ==============
CREATE TABLE IF NOT EXISTS products (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
description TEXT,
price NUMERIC(12,2),
image_url TEXT,
is_taxable BOOLEAN DEFAULT true,
is_active BOOLEAN DEFAULT true,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== STOPS ==============
CREATE TABLE IF NOT EXISTS stops (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
address TEXT,
zip TEXT,
city TEXT,
state TEXT,
datetime TIMESTAMPTZ,
cutoff_time TIMESTAMPTZ,
status TEXT DEFAULT 'active',
deleted_at TIMESTAMPTZ,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== ORDERS ==============
CREATE TABLE IF NOT EXISTS orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
stop_id UUID,
customer_email TEXT,
customer_name TEXT,
customer_phone TEXT,
customer_address TEXT,
total_amount NUMERIC(12,2),
status TEXT DEFAULT 'pending',
fulfillment_type TEXT,
shipping_status TEXT DEFAULT 'pending',
tracking_number TEXT,
idempotency_key UUID UNIQUE,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== ORDER ITEMS ==============
CREATE TABLE IF NOT EXISTS order_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
order_id UUID,
product_id UUID,
quantity INT DEFAULT 1,
price NUMERIC(12,2),
fulfillment TEXT DEFAULT 'pickup',
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== PRODUCT STOPS (junction) ==============
CREATE TABLE IF NOT EXISTS product_stops (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
product_id UUID,
stop_id UUID,
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== CUSTOMERS ==============
CREATE TABLE IF NOT EXISTS customers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
email TEXT,
name TEXT,
phone TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== ADMIN USERS ==============
CREATE TABLE IF NOT EXISTS admin_users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID,
brand_id UUID,
email TEXT,
role TEXT,
is_active BOOLEAN DEFAULT true,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== WHOLESALE TABLES ==============
CREATE TABLE IF NOT EXISTS wholesale_settings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
wholesale_enabled BOOLEAN DEFAULT true,
require_approval BOOLEAN DEFAULT true,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_products (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
description TEXT,
price NUMERIC(12,2),
rc_product_id UUID,
is_active BOOLEAN DEFAULT true,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_customers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
email TEXT,
name TEXT,
phone TEXT,
status TEXT DEFAULT 'pending',
approved_at TIMESTAMPTZ,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
customer_id UUID,
status TEXT DEFAULT 'pending',
total_amount NUMERIC(12,2),
cart_snapshot JSONB,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_order_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
wholesale_order_id UUID,
product_id UUID,
customer_id UUID,
quantity INT,
price NUMERIC(12,2),
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_deposits (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
customer_id UUID,
order_id UUID,
amount NUMERIC(12,2),
payment_method TEXT,
status TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
type TEXT,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_customer_product_pricing (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer_id UUID,
product_id UUID,
price NUMERIC(12,2),
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS wholesale_sync_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
-- ============== COMMUNICATIONS ==============
CREATE TABLE IF NOT EXISTS communication_campaigns (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
subject TEXT,
body TEXT,
status TEXT DEFAULT 'draft',
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS communication_templates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
subject TEXT,
body TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS communication_contacts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
email TEXT,
name TEXT,
sms_opt_in BOOLEAN DEFAULT false,
email_opt_in BOOLEAN DEFAULT true,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS communication_message_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
campaign_id UUID,
contact_id UUID,
channel TEXT,
customer_email TEXT,
subject TEXT,
body TEXT,
event_id TEXT,
status TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS communication_segments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
definition JSONB,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS communication_settings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== HARVEST LOTS ==============
CREATE TABLE IF NOT EXISTS harvest_lots (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
product_id UUID,
lot_number TEXT,
quantity_lbs NUMERIC(12,2),
quantity_used_lbs NUMERIC(12,2) DEFAULT 0,
harvest_date DATE,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS harvest_lot_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
lot_id UUID,
event_type TEXT,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
-- ============== WATER LOG ==============
CREATE TABLE IF NOT EXISTS water_users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
email TEXT,
name TEXT,
pin TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS water_headgates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
token TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS water_irrigators (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
pin TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS water_log_entries (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
headgate_id UUID,
irrigator_id UUID,
logged_by UUID,
gallons NUMERIC(12,2),
started_at TIMESTAMPTZ,
ended_at TIMESTAMPTZ,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS water_admin_settings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS water_alert_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS water_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== TIME TRACKING ==============
CREATE TABLE IF NOT EXISTS time_tracking_workers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
pin TEXT,
is_active BOOLEAN DEFAULT true,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS time_tracking_tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
name TEXT,
description TEXT,
is_active BOOLEAN DEFAULT true,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS time_tracking_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
worker_id UUID,
task_id UUID,
clock_in TIMESTAMPTZ,
clock_out TIMESTAMPTZ,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS time_tracking_settings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS time_tracking_notification_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS worker_time_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
worker_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== REFERRALS ==============
CREATE TABLE IF NOT EXISTS referral_codes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
code TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS referral_redemptions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
referral_code_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== PAYMENTS / SETTINGS ==============
CREATE TABLE IF NOT EXISTS payment_settings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS refunds (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
order_id UUID,
amount NUMERIC(12,2),
reason TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS square_sync_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS square_sync_queue (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
-- ============== API KEYS ==============
CREATE TABLE IF NOT EXISTS api_keys (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
key TEXT,
name TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== ONBOARDING / ACTIVITY ==============
CREATE TABLE IF NOT EXISTS onboarding_progress (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
user_id UUID,
step TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS notification_preferences (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
user_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS user_carts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
user_email TEXT,
cart JSONB,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS user_activity_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
user_id UUID,
action TEXT,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS admin_action_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
admin_user_id UUID,
action TEXT,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
user_id UUID,
action TEXT,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS operational_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
event_type TEXT,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
-- ============== WELCOME / ABANDONED CART ==============
CREATE TABLE IF NOT EXISTS welcome_email_sequence (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS abandoned_cart_recovery (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ============== CHANGELOGS ==============
CREATE TABLE IF NOT EXISTS changelogs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
title TEXT,
body TEXT,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS changelog_reads (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
changelog_id UUID,
user_id UUID,
read_at TIMESTAMPTZ DEFAULT now()
);
-- ============== FOUNDER / MISC ==============
CREATE TABLE IF NOT EXISTS founder_pain_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
payload JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
-- ============== VIEWS (used in some RPCs) ==============
CREATE TABLE IF NOT EXISTS completed_pickups (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS pending_pickups (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS pickup_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE IF NOT EXISTS shipping_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
brand_id UUID,
payload JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Done. 65 base tables synthesized.