Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
ea3a12d
feat: 업장 등록 신청 API 구현
juny0955 Mar 19, 2026
31e7359
feat: 유저 파일관련 API 추가
juny0955 Mar 21, 2026
2a82ddf
feat: 업장 등록 API 파일 추가
juny0955 Mar 21, 2026
6f123a4
refactor: 업장 등록 신청 대표자 성명 제거
juny0955 Mar 21, 2026
ac0aa73
feat: 승인/반려 사유 댓글 등록 API
juny0955 Mar 21, 2026
3e3ca2c
fix: WorkspaceReason statue Enumerated String 추가
juny0955 Mar 21, 2026
7dafd0e
refactor: 코멘트 API 경로 수정
juny0955 Mar 21, 2026
8f7270f
feat: 댓글 조회 API
juny0955 Mar 21, 2026
0467a46
refactor: 메서드명 변경
juny0955 Mar 21, 2026
c79501d
refactor: 댓글 길이 제한 추가
juny0955 Mar 21, 2026
7338e12
fix: validation max -> size 변경
juny0955 Mar 30, 2026
fe16fab
refactor: api 응답 스키마 추가
juny0955 Mar 30, 2026
cb625c8
feat: 업장 등록 요청 수정
juny0955 Mar 30, 2026
f7cc325
feat: 업장 생성 사유 댓글 API 수정
juny0955 Mar 30, 2026
fed2dce
feat: 업장 등록 신청 목록 조회 API 구현
juny0955 Mar 30, 2026
3ac5315
refactor: API 스펙 및 클래스, 메서드명 변경
juny0955 Mar 30, 2026
beeb374
refactor: API 엔드포인트 변경
juny0955 Mar 30, 2026
ce19e8b
feat: 업장 등록 신청 상세 조회 API 구현
juny0955 Mar 30, 2026
a07dc3c
refactor: 응답 DTO validation 제거
juny0955 Mar 30, 2026
3d4135b
fix: WorkspaceRequest table명 변경
juny0955 Mar 30, 2026
dd7fed7
feat: 업장등록요청 상세조회 응답 파일 추가
juny0955 Apr 2, 2026
b05d767
feat: 업장 등록 신청 승인 API
juny0955 Apr 2, 2026
1c05b05
feat: 업장 등록 신청 승인 API 수정
juny0955 Apr 2, 2026
17f3a12
feat: 업장 등록 신청 반려 사유 API
juny0955 Apr 2, 2026
d3403a1
feat: 반려 사유 댓글 Owner 추가
juny0955 Apr 2, 2026
035cdc5
feat 어드민 반려 사유 댓글 작성 API
juny0955 Apr 2, 2026
17f6364
refactor: resource 추가
juny0955 Apr 2, 2026
d89d80b
fix: dto 변경
juny0955 Apr 2, 2026
3ac4441
feat: 어드민 업장 등록 신청 목록 조회 API
juny0955 Apr 3, 2026
461f870
feat: 어드민 업장 등록 신청 상세 조회 API
juny0955 Apr 3, 2026
ef1a29e
feat: 유저 반려 사유 목록 조회 API
juny0955 Apr 3, 2026
cc794d5
fix: WorkspaceReasonComment 수정
juny0955 Apr 3, 2026
cfb4a8d
feat: 어드민 반려 사유 코멘트 목록 조회 API
juny0955 Apr 3, 2026
0b759c8
fix: validation 수정
juny0955 Apr 7, 2026
4bf0176
fix: AdminCreateWorkspaceReasonComment 예외응답 수정
juny0955 Apr 7, 2026
24c6c50
fix: CreateWorkspaceReasonComment 예외응답 수정
juny0955 Apr 7, 2026
217effc
fix: WorkspaceReasonComment 연관관계 수정
juny0955 Apr 7, 2026
8a684ea
feat: spec 추가
juny0955 Apr 7, 2026
da69520
feat: ApproveWorkspaceRequest ManagerUser 중복 생성 안되게 수정
juny0955 Apr 7, 2026
32f1369
feat: 업장 등록 요청 상세 응답 파일 ID -> URL 변경
juny0955 Apr 7, 2026
a1bf9b4
fix: 어드민 업장 등록 목록 조회 Offset 페이징 수정
juny0955 Apr 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,4 @@ src/main/generated/
CLAUDE.md
/.ai/
.mcp.json
.omc
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.controller;

import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminCreateWorkspaceReasonCommentRequestDto;
import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminWorkspaceReasonCommentResponseDto;
import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse;
import com.dreamteam.alter.application.aop.AdminActionContext;
import com.dreamteam.alter.domain.user.context.AdminActor;
import com.dreamteam.alter.domain.workspace.port.inbound.AdminCreateWorkspaceReasonCommentUseCase;
import com.dreamteam.alter.domain.workspace.port.inbound.GetAdminWorkspaceReasonCommentListUseCase;

import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/admin/workspace-requests/{workspaceRequestId}/reasons/{reasonId}/comments")
@PreAuthorize("hasAnyRole('ADMIN')")
@RequiredArgsConstructor
public class AdminWorkspaceReasonCommentController implements AdminWorkspaceReasonCommentControllerSpec {

@Resource(name = "getAdminWorkspaceReasonCommentList")
private final GetAdminWorkspaceReasonCommentListUseCase getAdminWorkspaceReasonCommentList;

@Resource(name = "adminCreateWorkspaceReasonComment")
private final AdminCreateWorkspaceReasonCommentUseCase adminCreateWorkspaceReasonComment;

@Override
@GetMapping
public ResponseEntity<CommonApiResponse<List<AdminWorkspaceReasonCommentResponseDto>>> getCommentList(
@PathVariable Long workspaceRequestId,
@PathVariable Long reasonId
) {
return ResponseEntity.ok(CommonApiResponse.of(getAdminWorkspaceReasonCommentList.execute(workspaceRequestId, reasonId)));
}

@Override
@PostMapping
public ResponseEntity<CommonApiResponse<Void>> createComment(
@PathVariable Long workspaceRequestId,
@PathVariable Long reasonId,
@RequestBody @Valid AdminCreateWorkspaceReasonCommentRequestDto request
) {
AdminActor actor = AdminActionContext.getInstance().getActor();
adminCreateWorkspaceReasonComment.execute(actor, workspaceRequestId, reasonId, request.getComment());
return ResponseEntity.ok(CommonApiResponse.empty());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.controller;

import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminCreateWorkspaceReasonCommentRequestDto;
import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminWorkspaceReasonCommentResponseDto;
import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse;
import com.dreamteam.alter.adapter.inbound.general.workspace.dto.WorkspaceReasonCommentResponseDto;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;

@Tag(name = "ADMIN - 업장 등록 신청 반려 사유 코멘트 API")
public interface AdminWorkspaceReasonCommentControllerSpec {

@Operation(summary = "업장 등록 신청 반려 사유 코멘트 목록 조회", description = "관리자가 업장 등록 신청의 반려 사유에 달린 코멘트 목록을 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "코멘트 목록 조회 성공"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 업장 등록 신청 또는 반려 사유")
})
ResponseEntity<CommonApiResponse<List<AdminWorkspaceReasonCommentResponseDto>>> getCommentList(
@Parameter(description = "업장 등록 신청 ID", example = "1") @PathVariable Long workspaceRequestId,
@Parameter(description = "반려 사유 ID", example = "1") @PathVariable Long reasonId
);

@Operation(summary = "업장 등록 신청 반려 사유 코멘트 등록", description = "관리자가 업장 등록 신청의 반려 사유에 코멘트를 등록합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "코멘트 등록 성공"),
@ApiResponse(responseCode = "400", description = "잘못된 요청"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 업장 등록 신청 또는 반려 사유")
})
ResponseEntity<CommonApiResponse<Void>> createComment(
@Parameter(description = "업장 등록 신청 ID", example = "1") @PathVariable Long workspaceRequestId,
@Parameter(description = "반려 사유 ID", example = "1") @PathVariable Long reasonId,
@Valid @RequestBody AdminCreateWorkspaceReasonCommentRequestDto request
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.CreateWorkspaceReasonDto;
import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse;
import com.dreamteam.alter.domain.workspace.port.inbound.CreateWorkspaceReasonUseCase;

import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/admin/workspace-requests/{workspaceRequestId}/reasons")
@PreAuthorize("hasAnyRole('ADMIN')")
@RequiredArgsConstructor
public class AdminWorkspaceReasonController implements AdminWorkspaceReasonControllerSpec{

@Resource(name = "createWorkspaceReason")
private final CreateWorkspaceReasonUseCase createWorkspaceReason;

@Override
@PostMapping
public ResponseEntity<CommonApiResponse<Void>> createReason(
@PathVariable Long workspaceRequestId,
@RequestBody @Valid CreateWorkspaceReasonDto request
) {
createWorkspaceReason.execute(workspaceRequestId, request.getReason());
return ResponseEntity.ok(CommonApiResponse.empty());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.CreateWorkspaceReasonDto;
import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;

@Tag(name = "ADMIN - 업장 등록 신청 반려 사유 API")
public interface AdminWorkspaceReasonControllerSpec {

@Operation(summary = "업장 등록 신청 반려 사유 등록", description = "관리자가 업장 등록 신청에 대한 반려 사유를 등록합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "반려 사유 등록 성공"),
@ApiResponse(responseCode = "400", description = "잘못된 요청"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 업장 등록 신청")
})
ResponseEntity<CommonApiResponse<Void>> createReason(
@Parameter(description = "업장 등록 신청 ID", example = "1") @PathVariable Long workspaceRequestId,
@Valid @RequestBody CreateWorkspaceReasonDto request
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminWorkspaceRequestListResponseDto;
import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminWorkspaceRequestResponseDto;
import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse;
import com.dreamteam.alter.adapter.inbound.common.dto.PageRequestDto;
import com.dreamteam.alter.adapter.inbound.common.dto.PaginatedResponseDto;
import com.dreamteam.alter.domain.workspace.port.inbound.ApproveWorkspaceRequestUseCase;
import com.dreamteam.alter.domain.workspace.port.inbound.GetAdminWorkspaceRequestListUseCase;
import com.dreamteam.alter.domain.workspace.port.inbound.GetAdminWorkspaceRequestUseCase;

import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/admin/workspace-requests")
@PreAuthorize("hasAnyRole('ADMIN')")
@RequiredArgsConstructor
public class AdminWorkspaceRequestController implements AdminWorkspaceRequestControllerSpec {

@Resource(name = "getAdminWorkspaceRequestList")
private final GetAdminWorkspaceRequestListUseCase getAdminWorkspaceRequestList;

@Resource(name = "getAdminWorkspaceRequest")
private final GetAdminWorkspaceRequestUseCase getAdminWorkspaceRequest;

@Resource(name = "approveWorkspaceRequest")
private final ApproveWorkspaceRequestUseCase approveWorkspaceRequest;

@Override
@GetMapping
public ResponseEntity<CommonApiResponse<PaginatedResponseDto<AdminWorkspaceRequestListResponseDto>>> getWorkspaceRequestList(
PageRequestDto request
) {
return ResponseEntity.ok(CommonApiResponse.of(getAdminWorkspaceRequestList.execute(request)));
}

@Override
@GetMapping("/{workspaceRequestId}")
public ResponseEntity<CommonApiResponse<AdminWorkspaceRequestResponseDto>> getWorkspaceRequest(
@PathVariable Long workspaceRequestId
) {
return ResponseEntity.ok(CommonApiResponse.of(getAdminWorkspaceRequest.execute(workspaceRequestId)));
}

@Override
@PostMapping("/{workspaceRequestId}/approve")
public ResponseEntity<CommonApiResponse<Void>> approve(@PathVariable Long workspaceRequestId) {
approveWorkspaceRequest.execute(workspaceRequestId);
return ResponseEntity.ok(CommonApiResponse.empty());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.controller;

import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminWorkspaceRequestListResponseDto;
import com.dreamteam.alter.adapter.inbound.admin.workspace.dto.AdminWorkspaceRequestResponseDto;
import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse;
import com.dreamteam.alter.adapter.inbound.common.dto.PageRequestDto;
import com.dreamteam.alter.adapter.inbound.common.dto.PaginatedResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;

@Tag(name = "ADMIN - 업장 등록 신청 관리 API")
public interface AdminWorkspaceRequestControllerSpec {

@Operation(summary = "업장 등록 신청 목록 조회", description = "관리자가 업장 등록 신청 목록을 페이징으로 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "업장 등록 신청 목록 조회 성공")
})
ResponseEntity<CommonApiResponse<PaginatedResponseDto<AdminWorkspaceRequestListResponseDto>>> getWorkspaceRequestList(
PageRequestDto request
);

@Operation(summary = "업장 등록 신청 상세 조회", description = "관리자가 업장 등록 신청 상세 정보를 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "업장 등록 신청 상세 조회 성공"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 업장 등록 신청")
})
ResponseEntity<CommonApiResponse<AdminWorkspaceRequestResponseDto>> getWorkspaceRequest(
@Parameter(description = "업장 등록 신청 ID", example = "1") @PathVariable Long workspaceRequestId
);

@Operation(summary = "업장 등록 신청 승인", description = "관리자가 업장 등록 신청을 승인합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "업장 등록 신청 승인 성공"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 업장 등록 신청")
})
ResponseEntity<CommonApiResponse<Void>> approve(
@Parameter(description = "업장 등록 신청 ID", example = "1") @PathVariable Long workspaceRequestId
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "어드민 - 반려 사유 댓글 등록 DTO")
public class AdminCreateWorkspaceReasonCommentRequestDto {

@Schema(description = "댓글 내용", example = "자료 보완하세요")
@Size(max = 255)
@NotBlank
private String comment;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.dreamteam.alter.adapter.inbound.admin.workspace.dto;

import java.time.LocalDateTime;

import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.WorkspaceReasonCommentListResponse;
import com.dreamteam.alter.domain.workspace.type.CommentOwner;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(access = AccessLevel.PRIVATE)
@Schema(description = "어드민 - 업장 등록 요청 반려 댓글 조회 DTO")
public class AdminWorkspaceReasonCommentResponseDto {

@Schema(description = "댓글 ID", example = "1")
private Long id;

@Schema(description = "업장 등록 요청 반려사유 ID", example = "1")
private Long workspaceReasonId;

@Schema(description = "작성 유저 ID", example = "1")
private Long userId;

@Schema(description = "댓글 작성자 구분", example = "USER")
private CommentOwner commentOwner;

@Schema(description = "댓글 내용", example = "자료 누락")
private String comment;

@Schema(description = "댓글 생성시각", example = "2026-03-01T10:00:00")
private LocalDateTime createdAt;

public static AdminWorkspaceReasonCommentResponseDto from(WorkspaceReasonCommentListResponse entity) {
return AdminWorkspaceReasonCommentResponseDto.builder()
.id(entity.getId())
.workspaceReasonId(entity.getWorkspaceReasonId())
.userId(entity.getUserId())
.commentOwner(entity.getCommentOwner())
.comment(entity.getComment())
.createdAt(entity.getCreatedAt())
.build();
}
}

Loading
Loading