# task-411.1: InsuRo DB 안전성 개선 (FK 누락 + 인덱스 + anon 정책)

## 배경
InsuRo 프로젝트 (`/home/jay/projects/InsuRo/`)의 Supabase DB를 분석한 결과, 3가지 안전성 이슈 발견.
Lovable.dev로 자동 생성된 코드라 구조적 보완이 필요함.

## Supabase 프로젝트 정보
- Project ID: `dmyjpvxhlwmrqqqisbjj`
- URL: `https://dmyjpvxhlwmrqqqisbjj.supabase.co`
- 마이그레이션 경로: `/home/jay/projects/InsuRo/supabase/migrations/`

## 수정 사항 3가지

### 1. FK(Foreign Key) 누락 수정
아래 테이블에 FK 제약 추가:

- `customers.agent_id` → `auth.users(id)` ON DELETE CASCADE
- `customer_notes.agent_id` → `auth.users(id)`
- `customer_ai_summaries.agent_id` → `auth.users(id)`
- `customer_call_logs.agent_id` → `auth.users(id)`
- `agent_todos.agent_id` → `auth.users(id)`
- `content_schedules.user_id` → `auth.users(id)`
- `content_metrics.user_id` → `auth.users(id)`
- `image_regeneration_feedback.user_id` → `auth.users(id)`
- `user_api_keys.user_id` → `auth.users(id)`
- `user_naver_keys.user_id` → `auth.users(id)`

⚠️ 주의: 기존 데이터가 있을 수 있으므로 `ALTER TABLE ... ADD CONSTRAINT ... IF NOT EXISTS` 또는 존재 체크 후 추가.

### 2. 인덱스 추가
CRM 테이블 성능 최적화:

- `customers(agent_id)` — 에이전트별 고객 조회
- `customer_insurance(customer_id)` — 고객별 보험 조회
- `customer_notes(customer_id)` — 고객별 메모 조회
- `customer_call_logs(customer_id, call_date DESC)` — 고객별 통화 최신순
- `agent_todos(agent_id, is_completed)` — 에이전트별 미완료 할 일
- `conversations(customer_id)` — 고객별 대화
- `conversation_messages(conversation_id, created_at DESC)` — 대화별 메시지 최신순
- `content_schedules(user_id, scheduled_date)` — 사용자별 일정
- `community_posts(board_type, created_at DESC)` — 게시판별 최신순

### 3. anon 정책 보강 (메신저 관련)
현재 `conversation_messages`, `conversations` 등이 anon에게 `USING (true)`로 전체 열람 가능.

수정 방향:
- `conversation_messages` SELECT: `USING (true)` → `USING (EXISTS (SELECT 1 FROM customer_chat_tokens WHERE conversation_id = conversation_messages.conversation_id AND is_active = true))`
- 즉, 활성 채팅 토큰이 있는 대화의 메시지만 anon 접근 허용
- `conversations` SELECT도 동일 패턴 적용
- `push_subscriptions` INSERT도 conversation_id 기반 토큰 검증 추가

## 산출물
- 새 마이그레이션 SQL 파일 1개: `/home/jay/projects/InsuRo/supabase/migrations/` 하위에 타임스탬프 형식으로 생성
- 파일명 예시: `20260309160000_db-safety-improvements.sql`
- 완료 보고서: `memory/reports/task-411.1.md`

## 가이드 시드 데이터 확인
추가로, `/guide` 페이지에 목차가 비어있는 문제가 있음.
- `guide_categories`와 `guide_sections` 테이블에 시드 데이터가 들어갔는지 확인
- 마이그레이션 `20260309023517_*.sql`과 `20260309045611_*.sql`에 INSERT문 있음
- 만약 테이블이 비어있다면, INSERT문만 모아서 별도 SQL 파일로 제공

## 테스트
- SQL 문법 검증 (syntax error 없음)
- 기존 마이그레이션과 충돌 없음 확인
- IF NOT EXISTS / IF EXISTS 방어 코드 포함

## 작업 레벨: Lv.2
- 기존 DB 스키마 분석 + SQL 마이그레이션 작성
