diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java index 28a18ec7..0c487daa 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java @@ -6,6 +6,8 @@ import clap.server.application.port.inbound.management.FindAllMembersUsecase; import clap.server.application.port.inbound.management.FindMembersWithFilterUsecase; import clap.server.domain.model.member.Member; +import clap.server.exception.ApplicationException; +import clap.server.exception.code.MemberErrorCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -32,27 +34,30 @@ public class FindMemberController { description = "모든 회원 정보를 페이징 처리하여 반환하거나 조건에 맞는 회원 정보를 반환합니다.", parameters = { @Parameter(name = "page", description = "조회할 페이지 번호 (0부터 시작, 기본값: 0)", example = "0"), - @Parameter(name = "size", description = "페이지 당 회원 수 (기본값: 20)", example = "20") + @Parameter(name = "pageSize", description = "페이지 당 회원 수 (기본값: 20)", example = "20") } ) @GetMapping("/members") public ResponseEntity> getAllMembers( @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20") int size, - @ModelAttribute FindMemberRequest filterRequest) { + @RequestParam(defaultValue = "20") int pageSize, + @RequestBody FindMemberRequest filterRequest) { - Pageable pageable = PageRequest.of(page, size); + if (filterRequest.name() != null && filterRequest.name().trim().isEmpty()) { + throw ApplicationException.from(MemberErrorCode.NAME_CANNOT_BE_EMPTY); + } + + Pageable pageable = PageRequest.of(page, pageSize); Page members; - if (filterRequest.getName() != null || filterRequest.getEmail() != null || filterRequest.getNickname() != null || - filterRequest.getDepartmentId() != null || filterRequest.getRole() != null) { + if (filterRequest.name() != null || filterRequest.email() != null || filterRequest.nickName() != null || + filterRequest.departmentName() != null || filterRequest.role() != null) { members = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest); } else { members = findAllMembersUsecase.findAllMembers(pageable); } - Page response = members.map(retrieveAllMemberMapper::toResponse); return ResponseEntity.ok(response); } -} \ No newline at end of file +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/FindMemberRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/FindMemberRequest.java index f94708ac..c7e6f906 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/FindMemberRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/FindMemberRequest.java @@ -2,22 +2,20 @@ import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -@Data -public class FindMemberRequest { - @Schema(description = "회원 이름", example = "양시훈") - private String name; +public record FindMemberRequest( + @Schema(description = "회원 이름", example = "양시훈") + String name, - @Schema(description = "회원 이메일", example = "sihun123@gmail.com") - private String email; + @Schema(description = "회원 이메일", example = "sihun123@gmail.com") + String email, - @Schema(description = "회원 닉네임", example = "leo.sh") - private String nickname; + @Schema(description = "회원 닉네임", example = "leo.sh") + String nickName, - @Schema(description = "부서 ID", example = "1") - private Long departmentId; + @Schema(description = "부서 이름", example = "1") + String departmentName, - @Schema(description = "회원 역할", example = "ROLE_USER") - private MemberRole role; -} + @Schema(description = "회원 역할", example = "ROLE_USER") + MemberRole role +) {} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/RetrieveAllMemberResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/RetrieveAllMemberResponse.java index 33c1e08f..3f488886 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/RetrieveAllMemberResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/RetrieveAllMemberResponse.java @@ -16,8 +16,8 @@ public record RetrieveAllMemberResponse( @Schema(description = "승인 권한 여부", example = "true") Boolean isReviewer, - @Schema(description = "부서 ID", example = "1") - Long departmentId, + @Schema(description = "부서 이름", example = "개발팀") + String departmentName, @Schema(description = "회원 역할", example = "ROLE_USER") MemberRole role, diff --git a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java index a71a91bf..38718363 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -120,20 +120,20 @@ private BooleanBuilder createMemberFilter(FindMemberRequest filterRequest) { BooleanBuilder whereClause = new BooleanBuilder(); whereClause.and(memberEntity.status.ne(MemberStatus.DELETED)); - if (filterRequest.getName() != null) { - whereClause.and(memberEntity.name.containsIgnoreCase(filterRequest.getName())); + if (filterRequest.name() != null) { + whereClause.and(memberEntity.name.containsIgnoreCase(filterRequest.name())); } - if (filterRequest.getEmail() != null) { - whereClause.and(memberEntity.email.containsIgnoreCase(filterRequest.getEmail())); + if (filterRequest.email() != null) { + whereClause.and(memberEntity.email.containsIgnoreCase(filterRequest.email())); } - if (filterRequest.getNickname() != null) { - whereClause.and(memberEntity.nickname.containsIgnoreCase(filterRequest.getNickname())); + if (filterRequest.nickName() != null) { + whereClause.and(memberEntity.nickname.containsIgnoreCase(filterRequest.nickName())); } - if (filterRequest.getDepartmentId() != null) { - whereClause.and(memberEntity.department.departmentId.eq(filterRequest.getDepartmentId())); + if (filterRequest.departmentName() != null) { + whereClause.and(memberEntity.department.name.containsIgnoreCase(filterRequest.departmentName())); } - if (filterRequest.getRole() != null) { - whereClause.and(memberEntity.role.eq(filterRequest.getRole())); + if (filterRequest.role() != null) { + whereClause.and(memberEntity.role.eq(filterRequest.role())); } return whereClause; diff --git a/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java b/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java index f48de77b..3d50fc71 100644 --- a/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java +++ b/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java @@ -20,7 +20,7 @@ public RetrieveAllMemberResponse toResponse(Member member) { member.getMemberInfo().getEmail(), member.getMemberInfo().getNickname(), member.getMemberInfo().isReviewer(), - member.getMemberInfo().getDepartment().getDepartmentId(), + member.getMemberInfo().getDepartment().getName(), member.getMemberInfo().getRole(), member.getMemberInfo().getDepartmentRole() ); diff --git a/src/main/java/clap/server/exception/code/MemberErrorCode.java b/src/main/java/clap/server/exception/code/MemberErrorCode.java index 72bc2e65..3cc8bd8d 100644 --- a/src/main/java/clap/server/exception/code/MemberErrorCode.java +++ b/src/main/java/clap/server/exception/code/MemberErrorCode.java @@ -14,7 +14,9 @@ public enum MemberErrorCode implements BaseErrorCode { PASSWORD_VERIFY_FAILED(HttpStatus.BAD_REQUEST, "MEMBER_006", "비밀번호 검증에 실패하였습니다"), INVALID_CSV_FORMAT(HttpStatus.BAD_REQUEST, "MEMBER_007", "CSV 파일 형식이 잘못되었습니다."), CSV_PARSING_ERROR(HttpStatus.BAD_REQUEST, "MEMBER_008", "CSV 데이터 파싱 중 오류가 발생했습니다."), - MEMBER_REGISTRATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "MEMBER_009", "회원 등록 중 오류가 발생했습니다.") + MEMBER_REGISTRATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "MEMBER_009", "회원 등록 중 오류가 발생했습니다."), + NAME_CANNOT_BE_EMPTY(HttpStatus.BAD_REQUEST, "MEMBER_010", "이름은 공백일 수 없습니다.") + ; private final HttpStatus httpStatus;