refactor(packs): PACK_ASSETS.files 폐기 → DB SSOT
Phase 2 시작 — pack_files 테이블이 자료 리스트 source of truth. PACK_TIER_NAMES export 신규 추가 (mypage가 카드 제목용으로 참조). TIER_LABEL, extractPackTier 변경 없음. Note: 이 commit 단독으로는 mypage 빌드 깨짐. Task C3 (mypage page.tsx 수정) 에서 PACK_ASSETS 참조 제거 + 새 데이터 흐름 적용 후 빌드 복구. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,3 @@
|
|||||||
export interface PackAsset {
|
|
||||||
name: string;
|
|
||||||
files: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export type PackTier = 'starter' | 'pro' | 'master';
|
export type PackTier = 'starter' | 'pro' | 'master';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,43 +14,21 @@ const LABEL_TO_TIER: Record<string, PackTier> = Object.fromEntries(
|
|||||||
Object.entries(TIER_LABEL).map(([tier, label]) => [label, tier as PackTier])
|
Object.entries(TIER_LABEL).map(([tier, label]) => [label, tier as PackTier])
|
||||||
);
|
);
|
||||||
|
|
||||||
export const PACK_ASSETS: Record<PackTier, PackAsset> = {
|
/**
|
||||||
starter: {
|
* Tier 키 → 팩 이름 (mypage 표시용).
|
||||||
name: `AI 음악 마스터 팩 (${TIER_LABEL.starter})`,
|
* 자료 파일 리스트는 pack_files DB 테이블이 SSOT.
|
||||||
files: [
|
*/
|
||||||
'Suno 프롬프트 북 PDF (40p)',
|
export const PACK_TIER_NAMES: Record<PackTier, string> = {
|
||||||
'구조 템플릿 PDF',
|
starter: `AI 음악 마스터 팩 (${TIER_LABEL.starter})`,
|
||||||
'저작권 가이드 기본판',
|
pro: `AI 음악 마스터 팩 (${TIER_LABEL.pro})`,
|
||||||
],
|
master: `AI 음악 마스터 팩 (${TIER_LABEL.master})`,
|
||||||
},
|
|
||||||
pro: {
|
|
||||||
name: `AI 음악 마스터 팩 (${TIER_LABEL.pro})`,
|
|
||||||
files: [
|
|
||||||
'입문 자료 전체',
|
|
||||||
'MV 워크플로우 가이드 (Runway · Luma · Pika)',
|
|
||||||
'샘플 프로젝트 1개 (.prj 파일 + 영상)',
|
|
||||||
'유튜브 SEO 템플릿',
|
|
||||||
'1:1 Q&A 1회 (이메일 응답)',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
master: {
|
|
||||||
name: `AI 음악 마스터 팩 (${TIER_LABEL.master})`,
|
|
||||||
files: [
|
|
||||||
'프로 자료 전체',
|
|
||||||
'샘플 프로젝트 장르별 3종',
|
|
||||||
'저작권 심화판 + 상업 이용 체크리스트',
|
|
||||||
'제작 레시피 영상 (우선 공개)',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* orders.service ("구매 신청: AI 음악 마스터 팩 · 프로") → tier key.
|
* orders.service ("구매 신청: AI 음악 마스터 팩 · 프로") → tier key.
|
||||||
* 매칭 안 되면 null 반환 (Music 팩 외 의뢰).
|
* 매칭 안 되면 null 반환 (Music 팩 외 의뢰).
|
||||||
*
|
*
|
||||||
* NOTE: service 문자열은 U+00B7 MIDDLE DOT (·) 사용. 이 함수는 "마지막 ·" 뒤의
|
* NOTE: service 문자열은 U+00B7 MIDDLE DOT (·) 사용.
|
||||||
* 단어를 tier 라벨로 인식. 예: "구매 신청: AI 음악 마스터 팩 · 프로" → "프로" → 'pro'.
|
|
||||||
* Phase 2에서 marketing 카피가 tier 뒤에 추가 ·를 두면 이 로직 재검토 필요.
|
|
||||||
*/
|
*/
|
||||||
export function extractPackTier(service: string): PackTier | null {
|
export function extractPackTier(service: string): PackTier | null {
|
||||||
if (!service.startsWith('구매 신청:')) return null;
|
if (!service.startsWith('구매 신청:')) return null;
|
||||||
@@ -64,10 +37,3 @@ export function extractPackTier(service: string): PackTier | null {
|
|||||||
const tierName = service.slice(dotIdx + 1).trim();
|
const tierName = service.slice(dotIdx + 1).trim();
|
||||||
return LABEL_TO_TIER[tierName] ?? null;
|
return LABEL_TO_TIER[tierName] ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Phase 2 migration note: `files: string[]` 는 placeholder. Phase 2에서 NAS
|
|
||||||
* 파일 URL 도입 시 `files: { label: string; url?: string; sizeBytes?: number }[]`
|
|
||||||
* 형태로 확장 필요. mypage page.tsx 의 `<span>{file}</span>` → `<span>{file.label}</span>`
|
|
||||||
* 동시 변경.
|
|
||||||
*/
|
|
||||||
|
|||||||
Reference in New Issue
Block a user