refactor: [alt-262] 업장 등록 신청 댓글 기반 소통 구조 리팩토링#93
Conversation
|
Warning Review limit reached
More reviews will be available in 24 minutes and 43 seconds. Learn how PR review limits work. Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file). ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (6)
📝 WalkthroughWalkthrough워크스페이스 요청의 반려 사유(Reason) 기반 엔티티/포트/유스케이스/컨트롤러 전체를 제거하고, 요청 댓글(WorkspaceRequestComment) 기반으로 교체합니다. 동시에 관리자 approve 엔드포인트를 ACTIVATED/REVOKED 분기를 지원하는 updateStatus 엔드포인트로 통합하며, 신규 유스케이스에 대한 단위 테스트를 추가합니다. ChangesWorkspaceReason → WorkspaceRequestComment 전환 및 상태 통합
Sequence Diagram(s)sequenceDiagram
participant Client
participant AdminWorkspaceRequestController
participant UpdateWorkspaceRequestStatus
participant WorkspaceRequestQueryRepository
participant WorkspaceRequest
Client->>AdminWorkspaceRequestController: PATCH /{workspaceRequestId}/status {status}
AdminWorkspaceRequestController->>UpdateWorkspaceRequestStatus: execute(workspaceRequestId, status)
alt status가 ACTIVATED/REVOKED가 아님
UpdateWorkspaceRequestStatus-->>AdminWorkspaceRequestController: CustomException(ILLEGAL_ARGUMENT)
else
UpdateWorkspaceRequestStatus->>WorkspaceRequestQueryRepository: findByIdWithUser(workspaceRequestId)
alt 없음
WorkspaceRequestQueryRepository-->>UpdateWorkspaceRequestStatus: empty
UpdateWorkspaceRequestStatus-->>AdminWorkspaceRequestController: CustomException(NOT_FOUND)
else ACTIVATED
UpdateWorkspaceRequestStatus->>WorkspaceRequest: approve(...)
UpdateWorkspaceRequestStatus-->>AdminWorkspaceRequestController: void
else REVOKED
UpdateWorkspaceRequestStatus->>WorkspaceRequest: reject()
UpdateWorkspaceRequestStatus-->>AdminWorkspaceRequestController: void
end
end
AdminWorkspaceRequestController-->>Client: 200 OK
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
@coderabbitai review |
✅ Action performedReview finished.
|
CreateWorkspaceRequestComment에 CommentOwner==USER일 때 소유권 비교 추가 GetWorkspaceRequestCommentList 시그니처 변경(requester, ownerType 추가) - USER: existsByIdAndUserId로 검증 → FORBIDDEN - ADMIN: existsById만 검증 → NOT_FOUND GET 호출부 3개(Admin/User/Manager) 및 port 인터페이스 동기화 User/Manager GET·POST ControllerSpec에 403 응답 복원
ACTIVATED 상태에서 reject() 호출 시 CONFLICT 예외 발생 approve()와 대칭적으로 처리하여 승인된 신청의 고아화 방지
WorkspaceRequestTests에 Approve/Reject 전이 테스트 추가 - PENDING→ACTIVATED, ACTIVATED에서 재호출 시 CONFLICT - PENDING→REVOKED, ACTIVATED→REVOKED 시 CONFLICT 신규 UseCase 테스트 3개: - UpdateWorkspaceRequestStatusTests: 잘못된 status/존재 여부 검증 + approve/reject 분기 - CreateWorkspaceRequestCommentTests: 소유권 검증 + ADMIN 무제약 + 파일 첨부 - GetWorkspaceRequestCommentListTests: 소유권 게이트 + ADMIN 무제약 전체 테스트 통과 (BUILD SUCCESSFUL)
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestComment.java (1)
66-77:⚠️ Potential issue | 🟠 Major | ⚡ Quick wincreate()에서 핵심 불변식 검증이 누락되었습니다.
workspaceRequest,user,commentOwner,comment(blank 포함)가 유효하지 않아도 엔티티가 생성되어 저장 시점까지 오류가 지연됩니다. 생성 시점에서 즉시 검증해야 데이터 무결성 리스크를 줄일 수 있습니다.As per coding guidelines, "Entities encapsulate business rules and invariants."
수정 예시
public static WorkspaceRequestComment create( WorkspaceRequest workspaceRequest, User user, CommentOwner commentOwner, String comment ) { + if (workspaceRequest == null || user == null || commentOwner == null) { + throw new IllegalArgumentException("workspaceRequest, user, commentOwner 는 필수입니다."); + } + if (comment == null || comment.isBlank()) { + throw new IllegalArgumentException("comment 는 비어 있을 수 없습니다."); + } + return WorkspaceRequestComment.builder() .workspaceRequest(workspaceRequest) .user(user) .commentOwner(commentOwner) .comment(comment) .build(); }🤖 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 `@src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestComment.java` around lines 66 - 77, The create() method in WorkspaceRequestComment is missing parameter validation before building the entity, which violates the principle that entities should encapsulate business rules and invariants. Add null and validity checks for all parameters (workspaceRequest, user, commentOwner, and comment) before the builder is called, throwing appropriate exceptions (such as IllegalArgumentException) if any parameter is null or if comment is blank or empty. This ensures data integrity constraints are enforced at creation time rather than being deferred until persistence.Source: Coding guidelines
🤖 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
`@src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestCommentController.java`:
- Around line 25-31: The AdminWorkspaceRequestCommentController class is missing
the `@Getter` annotation which is required by the coding guidelines. Add the
`@Getter` annotation from the lombok library to the
AdminWorkspaceRequestCommentController class declaration alongside the existing
`@RequiredArgsConstructor` annotation. This follows the standard controller
pattern of using `@Getter` and `@RequiredArgsConstructor` without `@Setter`.
In
`@src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceRequestCommentController.java`:
- Around line 27-31: The UserWorkspaceRequestCommentController class is missing
the `@Getter` annotation required by the project's controller standards. Add the
`@Getter` annotation to the class declaration before or after
`@RequiredArgsConstructor`, ensuring it follows the project convention of using
`@Getter` with `@RequiredArgsConstructor` but without `@Setter`.
In
`@src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceRequestCommentController.java`:
- Around line 27-31: The ManagerWorkspaceRequestCommentController class is
missing the `@Getter` annotation. Add the `@Getter` annotation to the class
declaration above the existing `@RestController` annotation to comply with the
controller coding guidelines which require `@Getter` and `@RequiredArgsConstructor`
annotations (without `@Setter`).
In
`@src/main/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceRequestCommentList.java`:
- Around line 60-67: The getFilesByCommentId method currently executes a
database query even when the input comments list is empty, causing unnecessary
I/O. Add an early return check at the beginning of the getFilesByCommentId
method to immediately return an empty map if the comments list is empty or null,
preventing the fileQueryRepository.findAllByTargetTypeAndTargetIdIn call from
executing unnecessarily.
In
`@src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestComment.java`:
- Around line 32-45: The WorkspaceRequestComment class in the domain layer
contains JPA infrastructure annotations (`@Table`, `@JoinColumn`, `@ManyToOne`,
`@GeneratedValue`, etc.) which violates hexagonal architecture principles that
require zero infrastructure dependencies in the domain layer. Move all
JPA-specific annotations and the persistence mapping details from
WorkspaceRequestComment to a new persistence model (e.g.,
WorkspaceRequestCommentJpaEntity) in the adapter layer, then refactor the domain
WorkspaceRequestComment class to be a pure domain model containing only business
logic and domain properties without any Spring or JPA annotations. Create the
necessary mapper in the adapter layer to convert between the domain model and
the persistence entity.
In
`@src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceRequestCommentListUseCase.java`:
- Around line 5-10: The GetWorkspaceRequestCommentListUseCase interface is
importing and returning WorkspaceRequestCommentResponseDto from the adapter
layer, violating hexagonal architecture by creating a dependency from the domain
port to the adapter layer. Remove the import of
WorkspaceRequestCommentResponseDto from the adapter package and create a new
response model in the domain or application layer (not tied to adapter
infrastructure). Update the execute method signature to return this new
domain-level response model instead of the adapter DTO. The adapter/controller
layer should then handle the mapping from the domain response to the adapter DTO
for HTTP responses.
In
`@src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceRequestCommentQueryRepository.java`:
- Around line 5-8: The WorkspaceRequestCommentQueryRepository port interface is
directly returning the adapter layer DTO WorkspaceRequestCommentListResponse,
which violates domain layer isolation by creating a dependency on infrastructure
code. Create a new domain-level model or projection class (e.g.,
WorkspaceRequestCommentInfo or similar record) in the domain package to
represent the contract, change the getCommentList method signature to return a
List of this domain model instead of WorkspaceRequestCommentListResponse, and
move the DTO mapping logic to the adapter implementation so the port remains
infrastructure-independent.
---
Outside diff comments:
In
`@src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestComment.java`:
- Around line 66-77: The create() method in WorkspaceRequestComment is missing
parameter validation before building the entity, which violates the principle
that entities should encapsulate business rules and invariants. Add null and
validity checks for all parameters (workspaceRequest, user, commentOwner, and
comment) before the builder is called, throwing appropriate exceptions (such as
IllegalArgumentException) if any parameter is null or if comment is blank or
empty. This ensures data integrity constraints are enforced at creation time
rather than being deferred until persistence.
🪄 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: ASSERTIVE
Plan: Pro
Run ID: 710a41d6-b560-4c91-95b9-b36df03b5373
📒 Files selected for processing (68)
src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonCommentController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonCommentControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestCommentController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestCommentControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/AdminCreateWorkspaceReasonCommentRequestDto.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/AdminWorkspaceReasonCommentResponseDto.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/CreateWorkspaceReasonDto.javasrc/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/UpdateWorkspaceRequestStatusDto.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonCommentControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceRequestCommentController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceRequestCommentControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/CreateWorkspaceRequestCommentRequestDto.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/WorkspaceReasonResponseDto.javasrc/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/WorkspaceRequestCommentResponseDto.javasrc/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceReasonCommentControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceReasonController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceReasonControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceRequestCommentController.javasrc/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceRequestCommentControllerSpec.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonCommentJpaRepository.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonCommentRepositoryImpl.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonQueryRepositoryImpl.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonRepositoryImpl.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentJpaRepository.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentQueryRepositoryImpl.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentRepositoryImpl.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/readonly/WorkspaceReasonListResponse.javasrc/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/readonly/WorkspaceRequestCommentListResponse.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/AdminCreateWorkspaceReasonComment.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/AdminGetWorkspaceReasonList.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceReason.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceReasonComment.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceRequestComment.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/GetAdminWorkspaceReasonCommentList.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceReasonList.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceRequestCommentList.javasrc/main/java/com/dreamteam/alter/application/workspace/usecase/UpdateWorkspaceRequestStatus.javasrc/main/java/com/dreamteam/alter/domain/file/type/FileTargetType.javasrc/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceReason.javasrc/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequest.javasrc/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestComment.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/AdminCreateWorkspaceReasonCommentUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/AdminGetWorkspaceReasonListUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ApproveWorkspaceRequestUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceReasonCommentUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceReasonUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceRequestCommentUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetAdminWorkspaceReasonCommentListUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceReasonCommentsUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceReasonListUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceRequestCommentListUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/inbound/UpdateWorkspaceRequestStatusUseCase.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonCommentQueryRepository.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonCommentRepository.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonQueryRepository.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonRepository.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceRequestCommentQueryRepository.javasrc/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceRequestCommentRepository.javasrc/main/java/com/dreamteam/alter/domain/workspace/type/WorkspaceReasonStatus.javasrc/test/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceRequestCommentTests.javasrc/test/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceRequestCommentListTests.javasrc/test/java/com/dreamteam/alter/application/workspace/usecase/UpdateWorkspaceRequestStatusTests.javasrc/test/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestTests.java
💤 Files with no reviewable changes (38)
- src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonCommentJpaRepository.java
- src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonRepositoryImpl.java
- src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonCommentControllerSpec.java
- src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/readonly/WorkspaceReasonListResponse.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetAdminWorkspaceReasonCommentListUseCase.java
- src/main/java/com/dreamteam/alter/domain/workspace/type/WorkspaceReasonStatus.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceReasonListUseCase.java
- src/main/java/com/dreamteam/alter/application/workspace/usecase/AdminGetWorkspaceReasonList.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonRepository.java
- src/main/java/com/dreamteam/alter/application/workspace/usecase/GetAdminWorkspaceReasonCommentList.java
- src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonController.java
- src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/WorkspaceReasonResponseDto.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonQueryRepository.java
- src/main/java/com/dreamteam/alter/application/workspace/usecase/AdminCreateWorkspaceReasonComment.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/AdminCreateWorkspaceReasonCommentUseCase.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceReasonCommentUseCase.java
- src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceReasonController.java
- src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceReasonCommentControllerSpec.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonCommentRepository.java
- src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceReason.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/AdminGetWorkspaceReasonListUseCase.java
- src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonControllerSpec.java
- src/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceReasonComment.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceReasonUseCase.java
- src/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceReason.java
- src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonCommentController.java
- src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/AdminWorkspaceReasonCommentResponseDto.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonCommentQueryRepository.java
- src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonCommentRepositoryImpl.java
- src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonCommentControllerSpec.java
- src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceReasonControllerSpec.java
- src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/AdminCreateWorkspaceReasonCommentRequestDto.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceReasonCommentsUseCase.java
- src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonController.java
- src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/CreateWorkspaceReasonDto.java
- src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ApproveWorkspaceRequestUseCase.java
- src/main/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceReasonList.java
- src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonQueryRepositoryImpl.java
* refactor: WorkspaceReason 도메인 제거 및 WorkspaceRequestComment 도메인 통합 * refactor: WorkspaceReason UseCase 제거 및 WorkspaceRequestComment UseCase 구현 * refactor: WorkspaceReason persistence 제거 및 WorkspaceRequestComment repository 추가 * refactor: Admin workspace Reason API 제거 및 RequestComment API로 재구성 * refactor: User/Manager workspace Reason API 제거 및 RequestComment API로 재구성 * fix: 댓글 API 소유권 검증 복원 (IDOR) CreateWorkspaceRequestComment에 CommentOwner==USER일 때 소유권 비교 추가 GetWorkspaceRequestCommentList 시그니처 변경(requester, ownerType 추가) - USER: existsByIdAndUserId로 검증 → FORBIDDEN - ADMIN: existsById만 검증 → NOT_FOUND GET 호출부 3개(Admin/User/Manager) 및 port 인터페이스 동기화 User/Manager GET·POST ControllerSpec에 403 응답 복원 * fix: WorkspaceRequest.reject() 상태 가드 추가 ACTIVATED 상태에서 reject() 호출 시 CONFLICT 예외 발생 approve()와 대칭적으로 처리하여 승인된 신청의 고아화 방지 * test: 댓글/상태 변경 API 테스트 추가 WorkspaceRequestTests에 Approve/Reject 전이 테스트 추가 - PENDING→ACTIVATED, ACTIVATED에서 재호출 시 CONFLICT - PENDING→REVOKED, ACTIVATED→REVOKED 시 CONFLICT 신규 UseCase 테스트 3개: - UpdateWorkspaceRequestStatusTests: 잘못된 status/존재 여부 검증 + approve/reject 분기 - CreateWorkspaceRequestCommentTests: 소유권 검증 + ADMIN 무제약 + 파일 첨부 - GetWorkspaceRequestCommentListTests: 소유권 게이트 + ADMIN 무제약 전체 테스트 통과 (BUILD SUCCESSFUL) * refactor: 댓글 조회 outbound 포트 어댑터 의존 제거 및 도메인 모델 이동 * fix: 빈 댓글 목록일 때 파일 조회 쿼리 스킵
변경사항
https://app.notion.com/p/38186553162880a58446ed2d929264c3?pvs=1
기존 업장 등록 신청 처리 흐름에서 반려 사유 생성이 상태 변경(REVOKED)을 동시에 트리거하고, 댓글이 특정 반려 사유에 종속되어 있어 관리자-신청자 간 게시판형 소통이 불가능하던 구조를, 신청 단위 댓글 기반 소통 구조로 리팩토링했습니다.
Summary by CodeRabbit
Release Notes
New Features
Refactor
Tests