# Edge Function 재배포 + 채널 에러 수정 + AI 주제 추천 검증

## 작업 레벨: Lv.2 (Edge Function 배포 + 코드 수정)

## 배경
task-2155(서버 get_user_plan 버그), task-2156(금소법 UX)이 main에 머지 완료.
하지만 Edge Function이 재배포되지 않아 프로덕션에 반영 안 됨.
추가로 채널 에러의 근본 원인(planName 문자열 매칭 불안정)을 수정해야 함.

## 작업 1: Supabase Edge Function 재배포 (★ 최우선)

### 1.1 배포 대상
1. `generate-content` — 금소법 동의 검증 로직 추가됨 (task-2156)
2. `suggest-topics` — 동작 확인 필요

### 1.2 배포 방법
```bash
cd /home/jay/projects/InsuRo

# Supabase CLI 로그인 확인
npx supabase login

# Edge Function 배포
npx supabase functions deploy generate-content --project-ref zayhfjuwviporbzokudr
npx supabase functions deploy suggest-topics --project-ref zayhfjuwviporbzokudr
```

만약 supabase CLI가 없으면:
```bash
npm install -g supabase
# 또는
npx supabase@latest functions deploy ...
```

### 1.3 배포 검증
```bash
# generate-content 동작 확인
curl -X OPTIONS "https://zayhfjuwviporbzokudr.supabase.co/functions/v1/generate-content"
# → 200 OK

# suggest-topics 동작 확인  
curl -X OPTIONS "https://zayhfjuwviporbzokudr.supabase.co/functions/v1/suggest-topics"
# → 200 OK
```

## 작업 2: 채널 에러 근본 수정

### 2.1 현재 문제
파일: `/home/jay/projects/InsuRo/supabase/functions/generate-content/index.ts`
라인 393-396:
```typescript
const requestedChannel = settings?.channel || contentType || "naver-blog";
const planLevel = PLAN_HIERARCHY[planName] ?? 0;  // ← planName 문자열 매칭 불안정
const allowedChannels = PLAN_CHANNEL_MAP[planLevel] || PLAN_CHANNEL_MAP[0];
```

`PLAN_HIERARCHY`에 planName이 매칭 안 되면 `?? 0` → Free(level 0) → naver-blog만 허용 → 다른 채널 전부 차단.

### 2.2 수정 방안
task-2157(3팀) 보고서 권고: **planName 문자열 매칭 대신 sort_order 숫자 비교로 전환**

getUserPlan() 반환값에 이미 `features` 객체가 포함되어 있고, subscription_plans 테이블에 `sort_order` 컬럼이 있음.

**수정 코드 (참고):**
```typescript
// 기존: planName 문자열로 레벨 결정 (불안정)
// const planLevel = PLAN_HIERARCHY[planName] ?? 0;

// 변경: getUserPlan에서 sort_order도 반환하도록 수정
const { planId, planName, features: planFeatures, sortOrder } = await getUserPlan(sb, userId);
const planLevel = sortOrder ?? 0;

// PLAN_CHANNEL_MAP은 그대로 유지
const allowedChannels = PLAN_CHANNEL_MAP[planLevel] || PLAN_CHANNEL_MAP[0];
```

**getUserPlan 수정 (같은 파일 내):**
```typescript
// 반환값에 sortOrder 추가
async function getUserPlan(sb: any, userId: string): Promise<{
  planId: string | null;
  planName: string;
  features: Record<string, any>;
  sortOrder: number;  // ← 추가
}> {
  // 기존 조회 로직에서 sort_order도 select
  // .select("subscription_plans(id, name, features, sort_order)")
  // 반환 시 sortOrder: plan.sort_order ?? 0 추가
}
```

### 2.3 영향 범위
- generate-content/index.ts 내의 getUserPlan + 채널 체크 부분만 수정
- 다른 파일 영향 없음
- suggest-topics는 이미 sort_order 기반이므로 수정 불필요

## 작업 3: AI 주제 추천 동작 검증

### 3.1 확인 사항
- suggest-topics Edge Function 재배포 후 실제 동작 테스트
- Hidden 유저 JWT로 API 호출하여 응답 확인
- 프론트엔드에서 버튼이 표시되는지 확인 (useFeatureGate("ai_topic_suggest"))

### 3.2 테스트 방법
```bash
# Hidden 유저 JWT 획득 (Supabase 대시보드 또는 로그인 API)
# suggest-topics 호출
curl -X POST "https://zayhfjuwviporbzokudr.supabase.co/functions/v1/suggest-topics" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <JWT_TOKEN>" \
  -H "apikey: <ANON_KEY>" \
  -d '{"channel":"naver-blog","insuranceCategory":"암보험","targetAge":"30대"}'
```

## 검증 시나리오

1. Edge Function 배포 성공 확인 (OPTIONS → 200)
2. Hidden 유저로 InsuRo 로그인 → AI 콘텐츠 작성 → "SNS용" → "Threads" 선택 → 콘텐츠 생성 → **채널 에러 없이 성공**
3. Hidden 유저로 AI 주제 추천 버튼 클릭 → **주제 6개 표시** → 클릭 시 입력란에 채워짐
4. Free 유저로 Threads 선택 시 → **여전히 에러 (정상 제한)**

## 주의사항
- Edge Function 배포 시 환경변수 확인 (ANTHROPIC_API_KEY, GOOGLE_AI_API_KEY 등)
- 배포 후 기존 세션에 영향 없는지 확인
- generate-content 수정 시 task-2156에서 추가한 금소법 동의 검증 로직 건드리지 말 것

## 참고
- task-2157 보고서: `/home/jay/workspace/memory/reports/task-2157.md`
- 채널 에러 분석: generate-content/index.ts 라인 54-60 (PLAN_CHANNEL_MAP), 393-402 (채널 체크)
- .env 키: `/home/jay/projects/InsuRo/.env` (INSURO_NEW_SERVICE_ROLE_KEY 등)
