Skip to content

[Docs] 권한 블록 설계 문서 보강 - #81

Merged
kangcheolung merged 8 commits into
developfrom
docs/80
Jul 30, 2026
Merged

[Docs] 권한 블록 설계 문서 보강#81
kangcheolung merged 8 commits into
developfrom
docs/80

Conversation

@kangcheolung

@kangcheolung kangcheolung commented Jul 30, 2026

Copy link
Copy Markdown
Member

Summary

closes #80

Test plan

  • 5개 문서 모두 실제 소스 코드(domain/collection, domain/permission) 대조 검증
  • 문서에 인용된 에러 코드 전부 ErrorCode.java와 대조 확인
  • MD040(코드블록 언어 태그) 검증 통과

Summary by CodeRabbit

  • 새 기능

    • 컬렉션 생성, 단건 조회, 문서 추가 및 삭제 기능의 API 설계를 구체화했습니다.
    • 컬렉션 목록 조회와 컬렉션·문서 권한 부여 및 회수 API를 정리했습니다.
    • 문서별 본인 권한 확인 API와 권한 출처 정보를 추가했습니다.
    • 컬렉션 및 문서 삭제 시 권한과 캐시 처리 기준을 명확히 했습니다.
  • 문서화

    • 성공·오류 응답, 권한 검증, 중복 처리, 테스트 결과와 후속 작업을 보강했습니다.

실제 코드 인용, Swagger 검증 로그, 에러 케이스 표, 설계 결정 요약을 담아
RAG 블록 문서와 동일한 스타일로 다시 작성. 코드 변경 없음.
실제 코드 인용, Swagger 검증 로그, 에러 케이스 표, 설계 결정 요약을 담아
RAG 블록 문서와 동일한 스타일로 다시 작성. 코드 변경 없음.
실제 코드 인용, Swagger 검증 로그, 에러 케이스 표, 설계 결정 요약을 담아
RAG 블록 문서와 동일한 스타일로 다시 작성. 코드 변경 없음.
실제 코드 인용, Swagger 검증 로그, 에러 케이스 표, 설계 결정 요약을 담아
RAG 블록 문서와 동일한 스타일로 다시 작성. 코드 변경 없음.
실제 코드 인용, Swagger 검증 로그, 에러 케이스 표, 설계 결정 요약을 담아
RAG 블록 문서와 동일한 스타일로 다시 작성. 코드 변경 없음.
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@kangcheolung, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 44 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 97bca022-4bf0-4e35-a2d2-e22935e80dc4

📥 Commits

Reviewing files that changed from the base of the PR and between 00beaa9 and 604dd29.

📒 Files selected for processing (4)
  • docs/design/kangcheolung-#16-collection-crud.md
  • docs/design/kangcheolung-#18-permission-grant-revoke.md
  • docs/design/kangcheolung-#29-collection-management.md
  • src/main/java/com/opensource/docgrid/domain/permission/controller/PermissionController.java
📝 Walkthrough

Walkthrough

컬렉션 CRUD와 권한 부여·회수·판단·관리 설계 문서 5개가 엔티티, 서비스, 리포지토리, DTO, 컨트롤러, 캐시 처리 및 테스트 결과를 포함하도록 보강되었다.

Changes

컬렉션 및 권한 설계

Layer / File(s) Summary
컬렉션 CRUD 계약과 실행 흐름
docs/design/kangcheolung-#16-collection-crud.md
컬렉션 엔티티와 문서 연결, 생성·조회·문서 추가 서비스, API 계약, 예외 코드 및 검증 결과가 구현 흐름에 맞게 정리되었다.
권한 부여·회수와 USER 캐시 갱신
docs/design/kangcheolung-#18-permission-grant-revoke.md
권한 대상·타입, 권한 엔티티, USER 캐시의 벌크 갱신·soft invalidation, 권한 API와 오류 흐름이 구체화되었다.
통합 권한 판단 서비스
docs/design/kangcheolung-#21-permission-query-service.md
문서·컬렉션 권한 판단 단계, 캐시·라이브 조회 조건, 리포지토리 쿼리, 성능 로그와 테스트 범위가 명시되었다.
문서 권한 상세 조회 API
docs/design/kangcheolung-#24-document-permission-check.md
문서 권한을 누적 계산하는 checkDocumentPermission()과 응답 DTO, /me 엔드포인트, 검증 시나리오가 추가되었다.
컬렉션 삭제와 문서 제거
docs/design/kangcheolung-#29-collection-management.md
컬렉션 목록, 소유자 전용 삭제·문서 제거, 범위별 캐시 무효화와 소프트 삭제 흐름이 문서화되었다.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • DocGrid/backend#23: PermissionQueryService와 컬렉션 문서 추가 권한 흐름을 실제 코드로 구현한 변경입니다.
  • DocGrid/backend#28: 문서 권한 상세 조회 API와 응답 DTO·enum 구현이 이 문서의 설계와 연결됩니다.
  • DocGrid/backend#31: 컬렉션 삭제·문서 제거 및 캐시 무효화 API 구현이 관련됩니다.

Suggested labels: 📃 Docs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning 필수 섹션 템플릿과 달리 Summary/Test plan만 있어 구조와 안내 정보가 부족합니다. ## 🔍️ 작업 내용, ## ✨ 상세 설명, ## 🛠️ 추후 리팩토링 및 고도화 계획, ## 💬 리뷰 요구사항을 채우고 Closes #80를 해당 섹션에 정리하세요.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 문서 보강이라는 핵심 변경과 일치하고, 대상도 권한 블록 설계 문서로 명확합니다.
Linked Issues check ✅ Passed 이슈 #80의 요구대로 5개 설계 문서를 RAG 스타일로 보강했고, 코드 변경 없이 문서만 수정했습니다.
Out of Scope Changes check ✅ Passed 요약상 변경은 5개 설계 문서 보강에 한정되어 있어, 이슈 범위를 벗어난 코드 변경은 보이지 않습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/80

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/design/kangcheolung-`#16-collection-crud.md:
- Around line 160-166: 문서 추가 흐름의 addDocument에서 컬렉션을 조회한 뒤 ACTIVE 상태인지 검증하고,
DELETED 컬렉션에는 문서를 추가할 수 없도록 명시하세요. 단건 조회 흐름도 동일한 ACTIVE 검증 또는 삭제 상태 제외 조회를 적용하도록
명시하고, 삭제된 컬렉션의 추가·조회 응답을 테스트로 고정하세요. 대상 사이트는
docs/design/kangcheolung-#16-collection-crud.md 160-166(anchor),
192-195(sibling)이며 두 위치 모두 해당 변경을 반영해야 합니다.

In `@docs/design/kangcheolung-`#18-permission-grant-revoke.md:
- Line 158: 권한 위임 정책을 ADMIN 위임자까지 허용할지 하나로 확정하고,
docs/design/kangcheolung-#18-permission-grant-revoke.md 158행의 설계 설명과
docs/design/kangcheolung-#16-collection-crud.md 186-187행의 canWriteCollection()
설명을 동일한 정책으로 수정하세요. 확정한 정책에 맞춰 CollectionController의 OpenAPI owner-only 설명, 서비스
권한 검사, 관련 테스트도 일관되게 갱신하세요.
- Around line 9-11: 캐시 대상 정책을 USER 권한과 OWNER 소유권 중 무엇을 포함할지 확정하고 모든 문서에서 동일하게
명시하세요. docs/design/kangcheolung-#18-permission-grant-revoke.md의 9-11행은 캐시 대상
설명을, 50-56행은 source of truth와 소유권 캐시 설명을, 102-104행은 OWNER source의 실제 생성·조회·무효화
규칙을 확정된 정책에 맞게 수정하세요. docs/design/kangcheolung-#21-permission-query-service.md
17-23행도 같은 정책으로 갱신해 검색 pre-filter와 최종 권한 판단이 일치하도록 하세요.

In `@docs/design/kangcheolung-`#29-collection-management.md:
- Line 119: The design document’s related comments at
docs/design/kangcheolung-#29-collection-management.md:119-119 and
docs/design/kangcheolung-#29-collection-management.md:224-224 incorrectly claim
empty JPQL IN parameters are safely executed. Update both comments to remove
that assertion and state that removeDocument() deletes the document link, then
skips cache invalidation when the permission/source ID list is empty; retain the
distinction that non-empty IDs use document-scoped invalidation rather than
collection-wide invalidation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4ec3ebd4-54d0-42e2-ad86-8c0816d29c5c

📥 Commits

Reviewing files that changed from the base of the PR and between 1eb1761 and 00beaa9.

📒 Files selected for processing (5)
  • docs/design/kangcheolung-#16-collection-crud.md
  • docs/design/kangcheolung-#18-permission-grant-revoke.md
  • docs/design/kangcheolung-#21-permission-query-service.md
  • docs/design/kangcheolung-#24-document-permission-check.md
  • docs/design/kangcheolung-#29-collection-management.md

Comment on lines +160 to +166
public CollectionDocumentResponse addDocument(Long collectionId, Long userId, AddDocumentRequest request) {
DocumentCollection collection = collectionRepository.findById(collectionId)
.orElseThrow(() -> new DocGridException(ErrorCode.COLLECTION_NOT_FOUND));

```json
{
"id": 3,
"name": "설계 문서",
"description": "설계 관련 문서 모음",
"visibility": "PRIVATE",
"status": "ACTIVE",
"ownerId": 1
}
```
if (!permissionQueryService.canWriteCollection(userId, collectionId)) {
throw new DocGridException(ErrorCode.PERMISSION_DENIED);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

soft-deleted 컬렉션의 접근을 ACTIVE 상태로 제한하세요.

현재 흐름은 findById() 후 상태를 확인하지 않고 문서를 추가하며, 단건 조회도 동일하게 ID만 조회합니다. #29의 soft delete가 DELETED 상태를 남기는 계약이라면 삭제된 컬렉션에 문서를 추가하거나 메타데이터를 조회할 수 있습니다. ACTIVE 검증을 공통 서비스/repository에 추가하고 삭제 상태의 응답을 테스트로 고정하세요.

  • docs/design/kangcheolung-#16-collection-crud.md#L160-L166: 문서 추가 전 ACTIVE 상태 검증을 명시하세요.
  • docs/design/kangcheolung-#16-collection-crud.md#L192-L195: 단건 조회도 삭제 상태를 제외하도록 명시하세요.
📍 Affects 1 file
  • docs/design/kangcheolung-#16-collection-crud.md#L160-L166 (this comment)
  • docs/design/kangcheolung-#16-collection-crud.md#L192-L195
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/design/kangcheolung-`#16-collection-crud.md around lines 160 - 166, 문서
추가 흐름의 addDocument에서 컬렉션을 조회한 뒤 ACTIVE 상태인지 검증하고, DELETED 컬렉션에는 문서를 추가할 수 없도록
명시하세요. 단건 조회 흐름도 동일한 ACTIVE 검증 또는 삭제 상태 제외 조회를 적용하도록 명시하고, 삭제된 컬렉션의 추가·조회 응답을
테스트로 고정하세요. 대상 사이트는 docs/design/kangcheolung-#16-collection-crud.md
160-166(anchor), 192-195(sibling)이며 두 위치 모두 해당 변경을 반영해야 합니다.

Comment on lines +9 to +11
`#16`에서 컬렉션 CRUD 기본을 만들었지만, 아직 "누가 이 컬렉션/문서를 볼 수 있는지"를 실제로 부여·회수하는 API가 없었다. 이번 이슈는 그 권한 부여/회수 API와, 검색 pre-filter를 빠르게 만들기 위한 `user_document_access_cache` 갱신 로직을 만든다.

RAG 명세 초반에 이미 정리된 3단계 캐싱 전략(`project_docgrid_specs.md` 메모리 참고)이 여기서 구현된다: **USER 대상 권한만 캐시에 저장**하고, ROLE/DEPARTMENT는 구성원이 동적으로 바뀌므로 캐시하지 않고 매번 live 조회한다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

캐시 대상 정책을 하나의 불변식으로 정리하세요.

#18은 USER 권한만 캐시한다고 설명하면서도 Javadoc과 AccessSourceType.OWNER는 소유권 캐시를 포함한다고 기술합니다. 반면 #21은 USER만 캐시한다고 단정합니다. OWNER 캐시를 실제로 생성·조회·무효화하는지 결정하고, 검색 pre-filter와 최종 권한 판단 문서를 동일한 정책으로 맞춰야 합니다.

  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L9-L11: 캐시 대상 설명을 수정하세요.
  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L50-L56: source of truth 및 소유권 캐시 설명을 일치시키세요.
  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L102-L104: OWNER source의 실제 생성·사용 규칙을 명시하세요.
  • docs/design/kangcheolung-#21-permission-query-service.md#L17-L23: 확정된 캐시 정책에 맞춰 수정하세요.
📍 Affects 2 files
  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L9-L11 (this comment)
  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L50-L56
  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L102-L104
  • docs/design/kangcheolung-#21-permission-query-service.md#L17-L23
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/design/kangcheolung-`#18-permission-grant-revoke.md around lines 9 - 11,
캐시 대상 정책을 USER 권한과 OWNER 소유권 중 무엇을 포함할지 확정하고 모든 문서에서 동일하게 명시하세요.
docs/design/kangcheolung-#18-permission-grant-revoke.md의 9-11행은 캐시 대상 설명을,
50-56행은 source of truth와 소유권 캐시 설명을, 102-104행은 OWNER source의 실제 생성·조회·무효화 규칙을
확정된 정책에 맞게 수정하세요. docs/design/kangcheolung-#21-permission-query-service.md
17-23행도 같은 정책으로 갱신해 검색 pre-filter와 최종 권한 판단이 일치하도록 하세요.

```

### 컬렉션 권한 회수
**권한을 부여하려면 권한 부여자(`grantorId`)가 이미 `canAdminCollection`이어야 한다** — `#21`의 `PermissionQueryService`를 여기서도 재사용한다. `#16`의 `owner`만 되던 것과 달리, 이제 ADMIN 권한을 가진 사람(소유자 포함, ADMIN으로 위임받은 사람도 포함)이 다른 사람에게 권한을 나눠줄 수 있다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

권한 위임 정책을 문서·컨트롤러·서비스에서 일치시키세요.

설계 문서는 ADMIN 권한 위임자가 권한을 부여하거나 컬렉션을 수정할 수 있다고 설명하지만, 제공된 CollectionController.java의 API 설명은 해당 동작을 owner-only로 명시합니다. 실제 정책을 하나로 결정한 뒤 서비스 권한 검사, OpenAPI 설명, 문서와 테스트를 모두 맞춰야 합니다.

  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L158-L158: ADMIN 위임 허용 여부를 확정하고 API 계약과 일치시키세요.
  • docs/design/kangcheolung-#16-collection-crud.md#L186-L187: canWriteCollection() 기반 권한 모델이 owner-only 설명과 충돌하지 않도록 수정하세요.
📍 Affects 2 files
  • docs/design/kangcheolung-#18-permission-grant-revoke.md#L158-L158 (this comment)
  • docs/design/kangcheolung-#16-collection-crud.md#L186-L187
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/design/kangcheolung-`#18-permission-grant-revoke.md at line 158, 권한 위임
정책을 ADMIN 위임자까지 허용할지 하나로 확정하고,
docs/design/kangcheolung-#18-permission-grant-revoke.md 158행의 설계 설명과
docs/design/kangcheolung-#16-collection-crud.md 186-187행의 canWriteCollection()
설명을 동일한 정책으로 수정하세요. 확정한 정책에 맞춰 CollectionController의 OpenAPI owner-only 설명, 서비스
권한 검사, 관련 테스트도 일관되게 갱신하세요.

Comment thread docs/design/kangcheolung-#29-collection-management.md Outdated
CodeRabbit 리뷰 검증 결과 확인된 사항 반영:
- #16: findById()가 status를 필터링하지 않아 삭제된 컬렉션에도
  addDocument/getCollection이 가능한 갭을 명시적으로 기록
- #18: AccessSourceType.OWNER가 엔티티 Javadoc과 달리 실제로는
  어디서도 생성되지 않는 dead value임을 확인 후 정정,
  Swagger @operation description이 "owner만 가능"이라 적혀있지만
  실제로는 canAdminCollection/canAdminDocument로 ADMIN 위임자도
  통과하는 불일치를 TODO로 기록
- #29: 빈 IN 절이 JPQL 자체로 안전하다는 잘못된 설명을 제거하고,
  실제로는 UserDocumentAccessCacheService의 명시적 isEmpty() 가드가
  처리한다는 정확한 설명으로 교체
grantCollectionPermission/revokeCollectionPermission/grantDocumentPermission/
revokeDocumentPermission의 @operation description이 "소유자(owner)만 가능"
이라고 적혀 있었으나, 실제 서비스 코드는 canAdminCollection()/canAdminDocument()로
판단해 ADMIN 위임자도 통과시킨다. 로직 변경 없이 설명 문구만 실제 동작에 맞게 수정.
@kangcheolung
kangcheolung merged commit 41014da into develop Jul 30, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Docs] 권한 블록 설계 문서 보강

1 participant