# FloatingTermDetection 검색 — Firestore 권한 에러 수정

## Lv.1 작업

## 문제
FloatingTermDetection의 수동 검색 입력란에 "위고비" 입력 시 드롭다운이 나타나지 않음.
"신규 용어로 생성" 옵션(task-1751.1에서 추가)도 보이지 않음.

### 원인 (확인 완료)
`handleSearch`에서 Firestore 쿼리:
```typescript
const q = query(docsRef, where('searchKeywords', 'array-contains', keyword));
```

이 쿼리가 **Firestore 보안 규칙에 의해 거부됨**:
- `documents` 컬렉션의 read 규칙: `isPublic() || isAuthor()` 조건 필요
- 대부분의 문서가 `visibility: 'private'`
- 쿼리에 visibility 필터가 없어서 Firestore가 "Rules are not filters" 원칙으로 전체 쿼리 거부
- catch 블록에서 `setResults([])` → 드롭다운 안 나타남

## 수정 (2가지 모두 적용)

### 1. catch 블록에서도 "신규 용어로 생성" 표시
```typescript
} catch (error) {
    console.error('[ManualTermInput] 검색 실패:', error);
    // 쿼리 실패해도 신규 용어 생성은 가능
    const keyword_trimmed = keyword.trim();
    if (keyword_trimmed.length > 0) {
        setResults([{
            id: `new-${keyword_trimmed}`,
            title: `"${keyword_trimmed}" — 신규 용어로 생성`,
            isNew: true,
            originalTerm: keyword_trimmed,
        }]);
        setShowDropdown(true);
    } else {
        setResults([]);
    }
}
```

### 2. Firestore 쿼리에 visibility 필터 추가 (선택적 개선)
쿼리에 조건 추가하여 권한 에러 방지:
```typescript
// 기존 문서 검색은 public/shared만 대상
const q = query(
    docsRef,
    where('searchKeywords', 'array-contains', keyword),
    where('visibility', 'in', ['public', 'shared'])
);
```
단, 이 경우 `visibility` 필드가 없는 레거시 문서(legacy docs)는 검색 안 됨.
**→ 복잡해질 수 있으므로 #1 수정만으로도 충분. #2는 선택 사항.**

## 참조
- 파일: `/home/jay/projects/insuwiki/nextapp/src/components/FloatingTermDetection.tsx`
- handleSearch 함수: 34줄
- catch 블록: 67줄
- Firestore 규칙: `/home/jay/projects/insuwiki/firestore.rules` (documents 컬렉션 read 규칙)

## 수정 후
- InsuWiki 빌드 + push: `cd /home/jay/projects/insuwiki/nextapp && npm run build && cd .. && git add -A && git commit -m "fix: floating search permission error + fallback" && git push origin master`

## 보고서
`/home/jay/workspace/memory/reports/task-{TASK_ID}.md`
