Skip to content

refactor: [alt-262] 업장 등록 신청 댓글 기반 소통 구조 리팩토링#93

Merged
ysw789 merged 10 commits into
devfrom
refactor/alt-262
Jun 17, 2026
Merged

refactor: [alt-262] 업장 등록 신청 댓글 기반 소통 구조 리팩토링#93
ysw789 merged 10 commits into
devfrom
refactor/alt-262

Conversation

@ysw789

@ysw789 ysw789 commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

변경사항

https://app.notion.com/p/38186553162880a58446ed2d929264c3?pvs=1

기존 업장 등록 신청 처리 흐름에서 반려 사유 생성이 상태 변경(REVOKED)을 동시에 트리거하고, 댓글이 특정 반려 사유에 종속되어 있어 관리자-신청자 간 게시판형 소통이 불가능하던 구조를, 신청 단위 댓글 기반 소통 구조로 리팩토링했습니다.

  • WorkspaceReason 도메인 제거 및 WorkspaceRequestComment 도메인으로 통합
  • WorkspaceReason UseCase 제거 및 WorkspaceRequestComment UseCase 구현
  • WorkspaceReason persistence 제거 및 WorkspaceRequestComment repository 추가
  • Admin workspace Reason API 제거 및 RequestComment API로 재구성
  • User/Manager workspace Reason API 제거 및 RequestComment API로 재구성

Summary by CodeRabbit

Release Notes

  • New Features

    • 업장 등록 신청에 대한 직접 댓글 기능 추가 (사용자, 매니저, 관리자)
    • 신청 상태 일괄 관리 엔드포인트 추가 (승인/반려)
  • Refactor

    • 반려 사유 기반 댓글 시스템을 신청 기반 댓글 시스템으로 개선
    • 신청 승인 처리 메커니즘 단순화
  • Tests

    • 요청 댓글 생성 및 조회 테스트 추가
    • 상태 업데이트 동작 검증 테스트 추가

@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@ysw789, we couldn't start this review because you've reached your PR review rate limit.

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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c76fccd1-1896-4e6f-8770-a5e41e5ad0cd

📥 Commits

Reviewing files that changed from the base of the PR and between e37263c and 71d988c.

📒 Files selected for processing (6)
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/WorkspaceRequestCommentResponseDto.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentQueryRepositoryImpl.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceRequestCommentList.java
  • src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceRequestCommentListResponse.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceRequestCommentQueryRepository.java
  • src/test/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceRequestCommentListTests.java
📝 Walkthrough

Walkthrough

워크스페이스 요청의 반려 사유(Reason) 기반 엔티티/포트/유스케이스/컨트롤러 전체를 제거하고, 요청 댓글(WorkspaceRequestComment) 기반으로 교체합니다. 동시에 관리자 approve 엔드포인트를 ACTIVATED/REVOKED 분기를 지원하는 updateStatus 엔드포인트로 통합하며, 신규 유스케이스에 대한 단위 테스트를 추가합니다.

Changes

WorkspaceReason → WorkspaceRequestComment 전환 및 상태 통합

Layer / File(s) Summary
도메인 엔티티, 포트 인터페이스, 열거형 교체
src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestComment.java, WorkspaceRequest.java, src/main/java/com/dreamteam/alter/domain/file/type/FileTargetType.java, src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceRequestCommentUseCase.java, GetWorkspaceRequestCommentListUseCase.java, UpdateWorkspaceRequestStatusUseCase.java, src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceRequestCommentRepository.java, WorkspaceRequestCommentQueryRepository.java
WorkspaceReason 엔티티·WorkspaceReasonStatus 열거형을 제거하고, WorkspaceRequestCommentworkspace_request_comments 테이블 기준으로 재정의합니다. WorkspaceRequest.reject()에 ACTIVATED 상태 검사가 추가되며, 아웃바운드/인바운드 포트는 Reason 계열을 삭제하고 RequestComment·UpdateStatus 계열을 신규 추가합니다. FileTargetTypeWORKSPACE_REASON_COMMENTWORKSPACE_REQUEST_COMMENT로 교체됩니다.
퍼시스턴스 어댑터: JPA 리포지토리 및 QueryDSL 구현체 교체
src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentJpaRepository.java, WorkspaceRequestCommentRepositoryImpl.java, WorkspaceRequestCommentQueryRepositoryImpl.java, readonly/WorkspaceRequestCommentListResponse.java
WorkspaceRequestCommentJpaRepositoryWorkspaceRequestComment 기준으로 재정의하고, save 위임 구현체와 QWorkspaceRequestComment 기반 getCommentList QueryDSL 구현체를 신규 추가합니다. 조회 응답 모델의 workspaceReasonId 필드를 workspaceRequestId로 변경합니다.
애플리케이션 유스케이스: Reason 계열 제거 및 RequestComment/Status 유스케이스 구현
src/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceRequestComment.java, GetWorkspaceRequestCommentList.java, UpdateWorkspaceRequestStatus.java
Reason 계열 서비스 7종을 모두 제거합니다. CreateWorkspaceRequestComment(소유권 검증 → 댓글 저장 → 조건부 파일 첨부)와 GetWorkspaceRequestCommentList(ownerType 기반 권한 분기 → 댓글 조회 → 파일 URL 매핑)를 신규 구현합니다. UpdateWorkspaceRequestStatus는 ACTIVATED/REVOKED 분기로 approve 로직을 흡수합니다.
DTO 및 응답 모델: Reason 계열 제거 및 RequestComment 계열 교체
src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/UpdateWorkspaceRequestStatusDto.java, src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/WorkspaceRequestCommentResponseDto.java, CreateWorkspaceRequestCommentRequestDto.java
Reason 계열 DTO 4종을 삭제합니다. UpdateWorkspaceRequestStatusDto를 신규 추가하고, WorkspaceRequestCommentResponseDtoworkspaceReasonId 필드를 제거하며 from() 팩토리를 단일 시그니처로 정리합니다.
인바운드 컨트롤러: Reason 계열 제거 및 RequestComment 컨트롤러/스펙 교체 (Admin/Manager/User)
src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestCommentController.java, AdminWorkspaceRequestCommentControllerSpec.java, src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceRequestCommentController.java, UserWorkspaceRequestCommentControllerSpec.java, src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceRequestCommentController.java, ManagerWorkspaceRequestCommentControllerSpec.java
Admin/Manager/User 각 Reason 계열 컨트롤러·스펙 총 9종을 제거합니다. 세 역할 모두 /workspace-requests/{id}/comments 경로 기반 GET/POST 엔드포인트로 재구성하고, CommentOwner.USER를 유스케이스 호출 시 명시적으로 전달하도록 변경합니다.
워크스페이스 요청 상태 갱신: approve → updateStatus 엔드포인트 전환
src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestController.java, AdminWorkspaceRequestControllerSpec.java
POST /{id}/approve 엔드포인트를 제거하고 PATCH /{id}/status 엔드포인트(UpdateWorkspaceRequestStatusDto 바디)로 교체합니다. 스펙 인터페이스도 updateStatus 시그니처와 400 응답 코드를 반영하도록 갱신합니다.
단위 테스트: 신규 유스케이스 및 도메인 엔티티 검증
src/test/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceRequestCommentTests.java, GetWorkspaceRequestCommentListTests.java, UpdateWorkspaceRequestStatusTests.java, src/test/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestTests.java
CreateWorkspaceRequestComment(5개), GetWorkspaceRequestCommentList(4개), UpdateWorkspaceRequestStatus(6개) 유스케이스 시나리오와 WorkspaceRequest approve/reject 상태 전이 및 CONFLICT 예외 케이스를 Mockito 기반으로 검증합니다.

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
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • alter-app/alter-backend#70: 메인 PR에서 제거된 "사유(reason) 기반 코멘트" 컨트롤러/UseCase/리포지토리/DTO 구성요소가 최초 도입된 PR입니다.
  • alter-app/alter-backend#74: 메인 PR에서 삭제된 AdminWorkspaceReasonCommentResponseDto의 파일 첨부 반환 기능을 확장하고 reason-scoped 코멘트 컨트롤러를 수정한 PR입니다.
  • alter-app/alter-backend#80: 메인 PR에서 제거된 AdminWorkspaceReasonControllergetWorkspaceReasonList 엔드포인트와 AdminGetWorkspaceReasonListUseCase를 추가한 PR입니다.

Suggested labels

FEAT

Suggested reviewers

  • hodoon
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 주요 변경사항을 정확하게 요약하고 있습니다. '업장 등록 신청 댓글 기반 소통 구조 리팩토링'은 기존 반려 사유 기반에서 댓글 기반으로의 전환을 명확히 설명하고 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/alt-262

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 and usage tips.

@ysw789

ysw789 commented Jun 16, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

ysw789 added 3 commits June 17, 2026 12:05
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)

@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: 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 win

create()에서 핵심 불변식 검증이 누락되었습니다.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 5d93875 and e37263c.

📒 Files selected for processing (68)
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonCommentController.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonCommentControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceReasonController.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestCommentController.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestCommentControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestController.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/controller/AdminWorkspaceRequestControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/AdminCreateWorkspaceReasonCommentRequestDto.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/AdminWorkspaceReasonCommentResponseDto.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/CreateWorkspaceReasonDto.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/admin/workspace/dto/UpdateWorkspaceRequestStatusDto.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonCommentControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonController.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceReasonControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceRequestCommentController.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/controller/UserWorkspaceRequestCommentControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/CreateWorkspaceRequestCommentRequestDto.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/WorkspaceReasonResponseDto.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/general/workspace/dto/WorkspaceRequestCommentResponseDto.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceReasonCommentControllerSpec.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/ManagerWorkspaceReasonControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceRequestCommentController.java
  • src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/controller/ManagerWorkspaceRequestCommentControllerSpec.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonCommentJpaRepository.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonCommentRepositoryImpl.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonQueryRepositoryImpl.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceReasonRepositoryImpl.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentJpaRepository.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentQueryRepositoryImpl.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceRequestCommentRepositoryImpl.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/readonly/WorkspaceReasonListResponse.java
  • src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/readonly/WorkspaceRequestCommentListResponse.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/AdminCreateWorkspaceReasonComment.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/AdminGetWorkspaceReasonList.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceReason.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceReasonComment.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceRequestComment.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/GetAdminWorkspaceReasonCommentList.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceReasonList.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceRequestCommentList.java
  • src/main/java/com/dreamteam/alter/application/workspace/usecase/UpdateWorkspaceRequestStatus.java
  • src/main/java/com/dreamteam/alter/domain/file/type/FileTargetType.java
  • src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceReason.java
  • src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequest.java
  • src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceRequestComment.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/AdminCreateWorkspaceReasonCommentUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/AdminGetWorkspaceReasonListUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ApproveWorkspaceRequestUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceReasonCommentUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceReasonUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/CreateWorkspaceRequestCommentUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetAdminWorkspaceReasonCommentListUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceReasonCommentsUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceReasonListUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetWorkspaceRequestCommentListUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/UpdateWorkspaceRequestStatusUseCase.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonCommentQueryRepository.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonCommentRepository.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonQueryRepository.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceReasonRepository.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceRequestCommentQueryRepository.java
  • src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceRequestCommentRepository.java
  • src/main/java/com/dreamteam/alter/domain/workspace/type/WorkspaceReasonStatus.java
  • src/test/java/com/dreamteam/alter/application/workspace/usecase/CreateWorkspaceRequestCommentTests.java
  • src/test/java/com/dreamteam/alter/application/workspace/usecase/GetWorkspaceRequestCommentListTests.java
  • src/test/java/com/dreamteam/alter/application/workspace/usecase/UpdateWorkspaceRequestStatusTests.java
  • src/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

@ysw789 ysw789 merged commit cba36f8 into dev Jun 17, 2026
3 checks passed
hodoon pushed a commit that referenced this pull request Jun 24, 2026
* 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: 빈 댓글 목록일 때 파일 조회 쿼리 스킵
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.

1 participant