CREATE TABLE IF NOT EXISTS items ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, description TEXT, price_cents INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'available', reserved_until TIMESTAMPTZ, sold_at TIMESTAMPTZ, paypal_order_id TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS item_images ( id SERIAL PRIMARY KEY, item_id INTEGER NOT NULL REFERENCES items(id) ON DELETE CASCADE, image_path TEXT NOT NULL, sort_order INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS customers ( id SERIAL PRIMARY KEY, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, name TEXT, email_verified BOOLEAN NOT NULL DEFAULT false, marketing_consent BOOLEAN NOT NULL DEFAULT false, marketing_consent_at TIMESTAMPTZ, marketing_consent_text TEXT, unsubscribe_token TEXT NOT NULL UNIQUE, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS customer_sessions ( token TEXT PRIMARY KEY, customer_id INTEGER NOT NULL REFERENCES customers(id) ON DELETE CASCADE, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS customer_tokens ( token TEXT PRIMARY KEY, customer_id INTEGER NOT NULL REFERENCES customers(id) ON DELETE CASCADE, kind TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS orders ( id SERIAL PRIMARY KEY, item_id INTEGER REFERENCES items(id), customer_id INTEGER REFERENCES customers(id) ON DELETE SET NULL, processor TEXT NOT NULL, processor_order_id TEXT, amount_cents INTEGER, status TEXT, raw_event JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT now() );