CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE TABLE IF NOT EXISTS gifts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), slug VARCHAR(100) NOT NULL UNIQUE, recipient_name TEXT NOT NULL, sender_name TEXT NOT NULL, title TEXT NOT NULL, intro_message TEXT NOT NULL, reveal_message TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'published', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT gifts_status_check CHECK (status IN ('draft', 'published', 'archived')) ); CREATE TABLE IF NOT EXISTS gift_items ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), gift_id UUID NOT NULL REFERENCES gifts(id) ON DELETE CASCADE, type TEXT NOT NULL, title TEXT, text TEXT, media_url TEXT, sort_order INTEGER NOT NULL DEFAULT 0, metadata JSONB NOT NULL DEFAULT '{}'::jsonb, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT gift_items_type_check CHECK (length(trim(type)) > 0) ); CREATE INDEX IF NOT EXISTS gift_items_gift_id_sort_order_idx ON gift_items (gift_id, sort_order, id);