From e86ca278311867608d897b02376e1d7415cc85d6 Mon Sep 17 00:00:00 2001 From: gahusb Date: Thu, 11 Jun 2026 08:28:34 +0900 Subject: [PATCH] =?UTF-8?q?feat(db):=20=EC=9D=8C=EC=95=85=20=ED=8C=A9=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=20=EC=9D=B4=EB=A0=A5=20contact=5Frequests=20?= =?UTF-8?q?=E2=86=92=20orders=20=EB=A9=B1=EB=93=B1=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-06-12-migrate-pack-purchases.sql | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 supabase/migrations/2026-06-12-migrate-pack-purchases.sql diff --git a/supabase/migrations/2026-06-12-migrate-pack-purchases.sql b/supabase/migrations/2026-06-12-migrate-pack-purchases.sql new file mode 100644 index 0000000..443f648 --- /dev/null +++ b/supabase/migrations/2026-06-12-migrate-pack-purchases.sql @@ -0,0 +1,32 @@ +-- 2026-06-12 Phase 2: 음악 팩 구매(contact_requests 문자열) → orders 이관 +-- 대상: status='completed' AND user_id 보유 AND '구매 신청:' + '· 입문/프로/마스터' 패턴 +-- (user_id 없는 행은 현행 다운로드 시스템도 서빙하지 않으므로 이관 대상 아님) +INSERT INTO orders (user_id, product_id, amount, status, metadata, created_at) +SELECT + cr.user_id, + p.id, + p.price, + 'paid', + jsonb_build_object( + 'method', 'bank_transfer', + 'source_contact_id', cr.id::text, + 'migrated_at', now()::text, + 'original_service', cr.service + ), + cr.created_at +FROM contact_requests cr +JOIN products p ON p.id = CASE + WHEN cr.service LIKE '%· 입문' THEN 'music_starter' + WHEN cr.service LIKE '%· 프로' THEN 'music_pro' + WHEN cr.service LIKE '%· 마스터' THEN 'music_master' +END +WHERE cr.status = 'completed' + AND cr.user_id IS NOT NULL + AND cr.service LIKE '구매 신청:%' + AND NOT EXISTS ( + SELECT 1 FROM orders o WHERE o.metadata->>'source_contact_id' = cr.id::text + ); + +-- 검증: 이관 건수 = 대상 건수 확인 +-- SELECT count(*) FROM orders WHERE metadata ? 'source_contact_id'; +-- SELECT count(*) FROM contact_requests WHERE status='completed' AND user_id IS NOT NULL AND service LIKE '구매 신청:%' AND (service LIKE '%· 입문' OR service LIKE '%· 프로' OR service LIKE '%· 마스터');