# 알림(이메일) 설정 가이드 — Zefio-edu

승인/거절/신청 시 학생에게 이메일을 보냅니다.  
**알림이 없어도** 학생은 「내 수업 → 신청 내역」에서 승인 여부와 Meet 링크를 볼 수 있습니다.

---

## 1. Resend 계정 (무료 티어로 충분)

1. https://resend.com 가입
2. **API Keys** → Create API Key → 복사 (`re_...`)
3. 처음에는 `EMAIL_FROM`을 Resend 테스트 주소로 사용:
   - `Zefio-edu <onboarding@resend.dev>`
   - 이 경우 **본인 Resend 가입 이메일로만** 발송 가능
4. 실제 학생에게 보내려면 도메인 추가 후 인증하고 `noreply@yourdomain.com` 사용

---

## 2. Supabase Edge Function secrets

프로젝트 루트에서 (CLI 로그인·링크 완료 후):

```bash
supabase login
supabase link --project-ref fzskpponrniqqnbowibl

supabase secrets set EMAIL_PROVIDER=resend
supabase secrets set RESEND_API_KEY=re_여기에키
supabase secrets set EMAIL_FROM="Zefio-edu <onboarding@resend.dev>"
```

Dashboard → Project Settings → Edge Functions → Secrets 에서도 동일하게 넣을 수 있습니다.

---

## 3. notify 함수 배포

**중요:** 브라우저에서 anon key로 호출하려면 JWT 검증을 끄거나, 프론트가 Bearer를 넣어야 합니다.  
이 프로젝트 프론트는 **anon key를 Authorization에 자동으로 넣도록** 수정되어 있습니다.

```bash
# 권장: JWT 검증 유지 + 프론트가 anon key Bearer 전송 (코드에 반영됨)
supabase functions deploy notify

# 또는 인증 없이 열기 (공개 API가 되므로 남용 주의)
# supabase functions deploy notify --no-verify-jwt
```

배포 URL 형식:

```text
https://fzskpponrniqqnbowibl.supabase.co/functions/v1/notify
```

---

## 4. 프론트 `.env`

```env
VITE_BACKEND=supabase
VITE_SUPABASE_URL=https://fzskpponrniqqnbowibl.supabase.co
VITE_SUPABASE_ANON_KEY=eyJ...   # Legacy anon 또는 Publishable key

# 알림
VITE_NOTIFY_API_URL=https://fzskpponrniqqnbowibl.supabase.co/functions/v1/notify
VITE_NOTIFY_API_KEY=            # 비워 두면 ANON_KEY를 Bearer로 사용
```

변경 후 **반드시** 개발 서버 재시작:

```bash
npm run dev
```

---

## 5. 동작 확인

1. 관리자로 로그인 → 일정 신청 → **승인**
2. 알림이 성공하면 별도 에러 alert 없음
3. 실패 시: `승인은 완료됐지만 알림 발송에 실패: ...`  
   - `UNAUTHORIZED` → 배포 시 JWT / 프론트 Bearer / `VITE_SUPABASE_ANON_KEY` 확인  
   - `RESEND_API_KEY missing` → secrets 미설정  
   - Resend 403/422 → `EMAIL_FROM` 도메인 또는 수신자 제한

브라우저 개발자도구 Network에서 `notify` 요청 Status 200과 Response `results.email.ok` 를 확인하세요.

---

## 6. 카카오 알림톡 (선택, 나중에)

현재 Edge Function은 카카오 부분을 **시뮬레이션만** 합니다.  
실제 발송은 비즈메시지 중계사 API를 `notify/index.ts`의 kakao 블록에 연결해야 합니다.  
이메일만으로도 운영 가능합니다.

---

## 7. Google Meet / Calendar (아직 미연결 시)

`VITE_MEET_API_URL`이 비어 있으면 **가짜 Meet 링크**가 생성됩니다 (입장 불가).

임시 운영 방법:
- Google Meet에서 회의 직접 생성 → 관리자 대시보드 세션의 Meet 링크를 수동으로 교체하거나  
- 세션 생성 후 DB/화면에서 실제 링크로 수정

실제 자동 연동은 `docs/GOOGLE_MEET_CALENDAR.md` 참고.
