# Wiki 정밀 보호 및 버전 관리 명세 (버전: 2차 수정)

> **일시**: 2026-02-15 21:40
> **안건/주제**: Wiki 영역(공용 문서)에 특화된 정밀한 보호 및 백업 전략 (9-Agent 검토 반영)

---

## 사용자 검토 필요 (User Review Required)
> [!IMPORTANT]
> **저장소 효율화**: 연속된 수정(5분 내)은 새로운 버전이 아닌 기존 버전을 덮어씁니다(Squash). 이는 History 노이즈를 줄이고 저장소 비용을 절감합니다.
> **법적 검토 (Legal)**: 실수로 올린 개인정보(PII)가 History에 남을 경우를 대비해, 관리자는 특정 Revision을 **영구 삭제(Hard Delete)**할 수 있어야 합니다.

## 제안된 변경 사항 (Proposed Changes)

### 1. 데이터베이스 모델링 (Database Modeling)

#### [MODIFY] [schema.prisma / types]
- **Document**: `isWiki` 또는 `visibility` 필드로 Wiki 문서 식별.
- **Revision Collection**: `documents/{id}/revisions` 서브 컬렉션 신설.

```typescript
interface Revision {
  id: string;          // 자동 생성 ID
  documentId: string;  // 부모 문서 ID
  content: string;     // 당시 본문 내용 (전체 저장)
  title: string;       // 당시 제목
  updatedBy: string;   // 수정자 ID
  updatedAt: Timestamp;// 수정 일시
  changeLog?: string;  // (Optional) 변경 사유
}
```

### 2. 백엔드 로직 (Backend Logic)

#### [MODIFY] [document-service.ts](file:///nextapp/src/lib/services/document-service.ts)
- `updateDocument` 함수 수정 (Squash 로직 추가):
    1.  현재 문서가 **Wiki**인지 확인.
    2.  `revisions` 컬렉션의 **마지막(최신) Revision** 조회.
    3.  **조건**: (같은 작성자) AND (마지막 수정 후 5분 이내)라면? -> **Update Last Revision** (새 버전 생성 안 함).
    4.  아니라면? -> **Create New Revision**.
    5.  본문 `update()`.

- `restoreRevision` 함수 추가:
    1.  특정 `revisionId`의 내용을 가져옴.
    2.  현재 문서 본문을 해당 내용으로 덮어씀.
    3.  이 작업 역시 하나의 Revision으로 기록됨 ("Restored from rev: ...").

- `purgeRevision` (Admin Only):
    1.  특정 `revisionId`를 물리적으로 삭제 (`delete()`).
    2.  PII 등 민감 정보가 포함된 우발적 History 제거용.

### 3. 보안 규칙 (Security Rules)

#### [MODIFY] [firestore.rules](file:///firestore.rules)
- `revisions` 서브 컬렉션 권한:
    - **Read**: `isPublic()` 또는 `isAuthenticated()` (역사 보기는 누구나).
    - **Write**: **오직 백엔드 로직(Cloud Function/Server Action)을 통해서만 가능하도록 제한**. (`request.auth.uid == updatedBy` 등의 클라이언트 직접 쓰기는 금지).
    - **Delete**: 오직 `admin`만 가능 (Purge 기능).

## 검증 계획 (Verification Plan)

### 자동화 테스트 (Automated Tests)
- **Squash Logic**:
    - 문서 수정 -> 1분 뒤 재수정 (같은 유저).
    - `revisions` 개수가 1개여야 함 (2개가 아님).
    - 내용이 두 번째 수정본으로 업데이트되었는지 확인.
- **New Revision**:
    - 문서 수정 -> 6분 뒤 재수정.
    - `revisions` 개수가 2개로 증가해야 함.
- **Admin Purge**:
    - 일반 유저가 `purgeRevision` 호출 시 실패 확인.
    - 관리자가 호출 시 성공 및 DB 삭제 확인.

### 수동 검증 (Manual Verification)
1.  **UI**: "형상 관리(History)" 탭 확인.
2.  **Action**: 잦은 수정 시도 -> History 목록이 깔끔하게 유지되는지 확인(Squash).
3.  **Restore**: 이전 버전 클릭 -> "되돌리기" -> 내용 복구 확인.
