← back to Wallco Ai
db/migrations/003_schema_parity.sql
62 lines
-- 003_schema_parity.sql — bring prod's spoon_all_designs in line with Mac2.
--
-- Discovered 2026-05-14 during /designs surprise-me debug: prod was missing
-- 18 columns vs the local Mac2 dw_unified, causing chat-driven INSERTs to
-- silently fail (RETURNING id came back empty because the BEFORE INSERT
-- trigger fn_spoon_all_designs_assign_dig referenced a column that didn't
-- exist on prod, and `psql -q` returned exit-0 with empty stdout, so the
-- chat layer surfaced {id: null} to the client).
--
-- All ALTER TABLE ... ADD COLUMN are IF NOT EXISTS — safe on Mac2 (no-op)
-- and on any future prod replay.
--
-- After applying, retest with:
-- curl -X POST https://wallco.ai/api/chat/catalog \
-- -H "Content-Type: application/json" \
-- -d '{"message":"give me a navy and gold wallpaper with celestial motif"}'
-- Expected: 200, design.id is a real bigint, /design/<id> opens.
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS dig_number TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS ai_title TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS ai_pattern TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS ai_color_name TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS ai_reviewed_at TIMESTAMPTZ;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS ai_review_raw JSONB;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS room_mockups JSONB;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS spoonflower_design_id TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS spoonflower_url TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS spoonflower_uploaded_at TIMESTAMPTZ;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS shopify_product_id TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS shopify_product_url TEXT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS shopify_uploaded_at TIMESTAMPTZ;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS user_color_good BOOLEAN;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS user_style_good BOOLEAN;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS user_scale_good BOOLEAN;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS user_stars SMALLINT;
ALTER TABLE spoon_all_designs ADD COLUMN IF NOT EXISTS user_rated_at TIMESTAMPTZ;
-- Backfill dig_number for any pre-migration row that didn't have one yet.
-- Matches the namespace used by /api/design/:id/ai-designer and the trigger.
UPDATE spoon_all_designs
SET dig_number = 'DIG_AI_' || lpad(id::text, 6, '0')
WHERE dig_number IS NULL OR dig_number = '';
-- Verify the trigger function is fresh (recreating is safe — DROP IF EXISTS
-- inside the migration handles already-applied case). The trigger references
-- NEW.dig_number, so it can't compile until the column exists above.
CREATE OR REPLACE FUNCTION fn_spoon_all_designs_assign_dig()
RETURNS trigger AS $$
BEGIN
IF NEW.dig_number IS NULL OR NEW.dig_number = '' THEN
NEW.dig_number := 'DIG_AI_' || lpad(NEW.id::text, 6, '0');
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_spoon_all_designs_assign_dig ON spoon_all_designs;
CREATE TRIGGER trg_spoon_all_designs_assign_dig
BEFORE INSERT ON spoon_all_designs
FOR EACH ROW
EXECUTE FUNCTION fn_spoon_all_designs_assign_dig();