From a8fea0368eb706fed06f10e9cc426bf29140e37a Mon Sep 17 00:00:00 2001 From: gahusb Date: Tue, 28 Apr 2026 03:39:16 +0900 Subject: [PATCH] =?UTF-8?q?feat(packs):=20Music=20=ED=8C=A9=203=ED=8B=B0?= =?UTF-8?q?=EC=96=B4=20=EC=A0=95=EC=A0=81=20=EC=9E=90=EB=A3=8C=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20+=20tier=20=EC=B6=94=EC=B6=9C=20=ED=95=A8=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PACK_ASSETS: starter/pro/master 각 자료 리스트 (Phase 1 placeholder, 실제 파일 URL은 Phase 2) - extractPackTier(): orders.service "구매 신청: AI 음악 마스터 팩 · {tier}" → tier key · "·" 뒤의 마지막 단어로 매칭하여 "마스터 팩" + "프로" 같은 충돌 회피 Co-Authored-By: Claude Opus 4.7 (1M context) --- lib/pack-assets.ts | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 lib/pack-assets.ts diff --git a/lib/pack-assets.ts b/lib/pack-assets.ts new file mode 100644 index 0000000..fe6967b --- /dev/null +++ b/lib/pack-assets.ts @@ -0,0 +1,53 @@ +export interface PackAsset { + name: string; + files: string[]; +} + +export type PackTier = 'starter' | 'pro' | 'master'; + +export const PACK_ASSETS: Record = { + starter: { + name: 'AI 음악 마스터 팩 (입문)', + files: [ + 'Suno 프롬프트 북 PDF (40p)', + '구조 템플릿 PDF', + '저작권 가이드 기본판', + ], + }, + pro: { + name: 'AI 음악 마스터 팩 (프로)', + files: [ + '입문 자료 전체', + 'MV 워크플로우 가이드 (Runway · Luma · Pika)', + '샘플 프로젝트 1개 (.prj 파일 + 영상)', + '유튜브 SEO 템플릿', + '1:1 Q&A 1회 (이메일 응답)', + ], + }, + master: { + name: 'AI 음악 마스터 팩 (마스터)', + files: [ + '프로 자료 전체', + '샘플 프로젝트 장르별 3종', + '저작권 심화판 + 상업 이용 체크리스트', + '제작 레시피 영상 (우선 공개)', + ], + }, +}; + +/** + * orders.service ("구매 신청: AI 음악 마스터 팩 · 프로") → tier key. + * 매칭 안 되면 null 반환 (Music 팩 외 의뢰). + */ +export function extractPackTier(service: string): PackTier | null { + if (!service.startsWith('구매 신청:')) return null; + // service 예시: "구매 신청: AI 음악 마스터 팩 · 프로" + // 마지막 "·" 뒤가 tier 이름 + const dotIdx = service.lastIndexOf('·'); + if (dotIdx === -1) return null; + const tierName = service.slice(dotIdx + 1).trim(); + if (tierName === '입문') return 'starter'; + if (tierName === '프로') return 'pro'; + if (tierName === '마스터') return 'master'; + return null; +}