📋 CURSOR INSTRUCTION
Goal: scan 유형 결과(A/B/C/D)를 주문에 저장하고 Sonnet 리포트 프롬프트에 컨텍스트로 주입
Steps:
Supabase SQL — orders 테이블에 scan_type 컬럼 추가
apps/web/app/scan/page.tsx — CTA 버튼 URL에 scan_type 쿼리 추가
apps/web/app/api/checkout/toss-confirm/route.ts — orders insert 시 scan_type 포함
apps/web/app/api/checkout/bank-transfer/route.ts — orders insert 시 scan_type 포함
apps/web/services/calculators/chapters.ts — userData 블록에 scan_type 컨텍스트 주입
Code:
[1] Supabase SQL (대시보드 SQL Editor에서 직접 실행):
sqlALTER TABLE orders
ADD COLUMN IF NOT EXISTS scan_type VARCHAR(1) CHECK (scan_type IN ('A', 'B', 'C', 'D'));
[2] apps/web/app/scan/page.tsx — CTA 버튼 onClick만 교체:
typescriptonClick={() => router.push(`/checkout?product=${product}&scan_type=${result}`)}
[3] apps/web/app/api/checkout/toss-confirm/route.ts
request body에서 scan_type 추출 후 insert에 추가:
typescript// 기존 body 파싱 부분에 scan_type 추가
const { ..., scan_type } = await req.json();
// orders insert 객체에 추가
const orderData = {
// 기존 필드들 유지
...,
scan_type: scan_type ?? null,
};
[4] apps/web/app/api/checkout/bank-transfer/route.ts
동일하게 적용:
typescriptconst { ..., scan_type } = await req.json();
const orderData = {
// 기존 필드들 유지
...,
scan_type: scan_type ?? null,
};
[5] apps/web/services/calculators/chapters.ts
generateChapters 함수 시그니처에 scanType 추가 후 userData 블록 끝에 주입:
typescript// 유형 매핑
const SCAN_TYPE_CONTEXT: Record = {
A: { name: '그믐달형', pattern: '조용히 많은 것을 감당하며 혼자 버텨온 패턴, 감정 억압과 자기희생 경향' },
B: { name: '반달형', pattern: '앎과 행동 사이의 간극, 시작하지만 멈추는 반복 패턴, 심리적 제동' },
C: { name: '보름달형', pattern: '타인에게 너무 많이 주는 패턴, 타인 기준으로 살아온 경향, 에너지 소진' },
D: { name: '초승달형', pattern: '전환점에 선 사람, 기존 방식이 맞지 않음을 느끼지만 방향 미정, 불확실감' },
};
// generateChapters 함수 시그니처 수정
export async function generateChapters(
// 기존 파라미터 유지
...,
scanType?: string | null,
) {
// 기존 userData 블록 끝에 아래 추가
const scanContext = scanType && SCAN_TYPE_CONTEXT[scanType]
? `\n\n[달빛 유형 진단 결과]
이 사용자는 사전 진단에서 ${SCAN_TYPE_CONTEXT[scanType]!.name}(${scanType}유형)으로 분류되었습니다.
핵심 패턴: ${SCAN_TYPE_CONTEXT[scanType]!.pattern}
리포트 전반에서 이 패턴이 사주·별자리 배치와 어떻게 연결되는지 구체적으로 분석하고,
scan 미리보기에서 언급된 심리 패턴의 천문학적·명리학적 뿌리를 짚어주세요.`
: '';
// userData 선언 끝에 scanContext 붙이기
const userData = `
... (기존 내용 유지)
` + scanContext;
그리고 generateChapters를 호출하는 apps/web/services/reportGenerator.ts에서:
typescript// orders에서 scan_type 읽어서 전달
await generateChapters(
// 기존 파라미터 유지
...,
order.scan_type ?? null,
);
Validation:
Supabase orders 테이블에 scan_type 컬럼 생성 확인
/scan → 퀴즈 완료 → "달빛 리포트 전체 보기" URL에 ?scan_type=A (또는 B/C/D) 포함 확인
pnpm run build (apps/web) 통과 확인
무통장 주문 생성 시 Supabase orders row에 scan_type 값 저장 확인 (Toss는 라이브 후)
Dependencies: 없음 (Supabase SQL만 먼저 실행)
健康・病気予防