# 대시보드 approve 엔드포인트 후속 개선 3건

## 수정 1: `/api/wiki/entries/{id}/approve` 전용 테스트 추가

**파일**: `dashboard/test_server.py`

approve 엔드포인트에 대한 단위 테스트 추가:
- 정상 승인 (status=approved) → wiki_statuses + wiki_sync_status 모두 업데이트 확인
- 정상 거부 (status=rejected) → 동일
- 잘못된 status 값 → 400 에러 반환
- 존재하지 않는 entry_id → 404 에러 반환
- Firestore sync 실패 시에도 로컬 상태는 정상 업데이트 확인

## 수정 2: Firestore 실패 시 `except Exception: pass` → 로깅 개선

**파일**: `dashboard/server.py`

approve 핸들러 내 Firestore 업데이트 부분 (line 6493-6512 근처):
```python
# 현재
except Exception:
    pass

# 변경
except Exception as e:
    import logging
    logging.getLogger(__name__).error(f"Firestore sync failed for {entry_id}: {e}")
```

server.py 전체에서 `except Exception: pass` 패턴을 검색하여 **approve/sync 관련 부분**만 로깅으로 변경. 무관한 곳은 건드리지 않음.

## 수정 3: approve 핸들러 entry_id 파싱 방식 통일

**파일**: `dashboard/server.py`

현재 entry_id 파싱:
```python
entry_id = self.path.split("/api/wiki/entries/")[1].replace("/approve", "")
```

이 방식은 entry_id에 `/`가 포함되면 문제. 정규식 또는 일관된 파싱으로 통일:
```python
import re
match = re.match(r'/api/wiki/entries/([^/]+)/approve', self.path)
if match:
    entry_id = urllib.parse.unquote(match.group(1))
```

다른 엔드포인트(`/api/wiki/entries/{id}` GET, PUT 등)도 동일한 파싱 방식 사용하는지 확인하고, 불일치하면 통일.

## 검증 시나리오
1. `pytest dashboard/test_server.py -k "approve"` 신규 테스트 전부 PASS
2. `grep -n "except Exception: pass" dashboard/server.py | grep -i "approve\|sync"` 결과 0건
3. entry_id 파싱이 정규식으로 통일되면 성공
4. 기존 테스트 회귀 없으면 성공
