From 8b424385263b35ded2f1207d50bb9ec705ac56b8 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Tue, 4 Feb 2025 00:36:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?CLAP-243=20refactor:PageResponse=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20=EB=B0=8F=20dto=20mapping=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=EB=8B=A8=EC=9C=BC=EB=A1=9C=20=EC=9C=84?= =?UTF-8?q?=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/admin/FindMemberController.java | 25 ++++++------------- .../dto/admin/request/FindMemberRequest.java | 8 +++++- .../response/RetrieveAllMemberResponse.java | 2 +- .../persistense/MemberPersistenceAdapter.java | 3 +-- .../member/MemberCustomRepository.java | 2 +- .../member/MemberCustomRepositoryImpl.java | 12 ++++----- .../mapper/RetrieveAllMemberMapper.java | 2 +- .../inbound/admin/FindAllMembersUsecase.java | 8 +++--- .../admin/FindMembersWithFilterUsecase.java | 9 ++++--- .../management/FindAllMembersUsecase.java | 10 -------- .../FindMembersWithFilterUsecase.java | 10 -------- .../port/outbound/member/LoadMemberPort.java | 2 +- .../service/admin/FindAllMembersService.java | 12 +++++++-- .../admin/FindMembersWithFilterService.java | 15 ++++++++--- 14 files changed, 57 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/clap/server/application/port/inbound/management/FindAllMembersUsecase.java delete mode 100644 src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java 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 94f3607b..003002e3 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 @@ -1,7 +1,8 @@ package clap.server.adapter.inbound.web.admin; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; -import clap.server.adapter.inbound.web.dto.admin.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.common.PageResponse; import clap.server.application.mapper.RetrieveAllMemberMapper; import clap.server.application.port.inbound.admin.FindAllMembersUsecase; import clap.server.application.port.inbound.admin.FindMembersWithFilterUsecase; @@ -11,6 +12,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -23,9 +25,7 @@ @RequestMapping("/api/managements") @RequiredArgsConstructor public class FindMemberController { - private final FindAllMembersUsecase findAllMembersUsecase; private final FindMembersWithFilterUsecase findMembersWithFilterUsecase; - private final RetrieveAllMemberMapper retrieveAllMemberMapper; @Tag(name = "05. Admin") @Secured({"ROLE_ADMIN"}) @@ -38,26 +38,17 @@ public class FindMemberController { } ) @GetMapping("/members") - public ResponseEntity> getAllMembers( + public ResponseEntity> getAllMembers( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, - @RequestBody FindMemberRequest filterRequest) { + @ModelAttribute @Valid FindMemberRequest filterRequest) { 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.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); + PageResponse response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest); return ResponseEntity.ok(response); } -} +} \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java index c7e6f906..4f9df1a1 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java @@ -1,21 +1,27 @@ -package clap.server.adapter.inbound.web.dto.admin; +package clap.server.adapter.inbound.web.dto.admin.request; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; public record FindMemberRequest( + @NotNull @Schema(description = "회원 이름", example = "양시훈") String name, + @NotNull @Schema(description = "회원 이메일", example = "sihun123@gmail.com") String email, + @NotNull @Schema(description = "회원 닉네임", example = "leo.sh") String nickName, + @NotNull @Schema(description = "부서 이름", example = "1") String departmentName, + @NotNull @Schema(description = "회원 역할", example = "ROLE_USER") MemberRole role ) {} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/RetrieveAllMemberResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/RetrieveAllMemberResponse.java index 3f488886..985e9620 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/RetrieveAllMemberResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/RetrieveAllMemberResponse.java @@ -1,4 +1,4 @@ -package clap.server.adapter.inbound.web.dto.admin; +package clap.server.adapter.inbound.web.dto.admin.response; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import io.swagger.v3.oas.annotations.media.Schema; 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 7cac7770..8d507516 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -1,6 +1,6 @@ package clap.server.adapter.outbound.persistense; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; @@ -103,7 +103,6 @@ public Page findAllMembers(Pageable pageable) { @Override public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { return memberRepository.findMembersWithFilter(pageable, filterRequest).map(memberPersistenceMapper::toDomain); - } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java index f6eff057..218020e6 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java @@ -1,6 +1,6 @@ package clap.server.adapter.outbound.persistense.repository.member; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java index f9ed9a79..1d5f6e6a 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java @@ -1,6 +1,6 @@ package clap.server.adapter.outbound.persistense.repository.member; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; import com.querydsl.core.BooleanBuilder; @@ -46,17 +46,17 @@ private BooleanBuilder createMemberFilter(FindMemberRequest filterRequest) { BooleanBuilder whereClause = new BooleanBuilder(); whereClause.and(memberEntity.status.ne(MemberStatus.DELETED)); - if (filterRequest.name() != null) { + if (!filterRequest.name().isBlank()) { whereClause.and(memberEntity.name.containsIgnoreCase(filterRequest.name())); } - if (filterRequest.email() != null) { + if (!filterRequest.email().isBlank()) { whereClause.and(memberEntity.email.containsIgnoreCase(filterRequest.email())); } - if (filterRequest.nickName() != null) { + if (!filterRequest.nickName().isBlank()) { whereClause.and(memberEntity.nickname.containsIgnoreCase(filterRequest.nickName())); } - if (filterRequest.departmentName() != null) { - whereClause.and(memberEntity.department.name.eq(filterRequest.departmentName())); + if (!filterRequest.departmentName().isBlank()) { + whereClause.and(memberEntity.department.name.contains(filterRequest.departmentName())); } if (filterRequest.role() != null) { whereClause.and(memberEntity.role.eq(filterRequest.role())); diff --git a/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java b/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java index 3d50fc71..5e031ac3 100644 --- a/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java +++ b/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java @@ -1,6 +1,6 @@ package clap.server.application.mapper; -import clap.server.adapter.inbound.web.dto.admin.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; import clap.server.domain.model.member.Member; import org.springframework.stereotype.Component; diff --git a/src/main/java/clap/server/application/port/inbound/admin/FindAllMembersUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/FindAllMembersUsecase.java index b06a30a9..b6ed4511 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/FindAllMembersUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/FindAllMembersUsecase.java @@ -1,9 +1,9 @@ package clap.server.application.port.inbound.admin; -import clap.server.domain.model.member.Member; -import org.springframework.data.domain.Page; +import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.common.PageResponse; import org.springframework.data.domain.Pageable; public interface FindAllMembersUsecase { - Page findAllMembers(Pageable pageable); -} \ No newline at end of file + PageResponse findAllMembers(Pageable pageable); +} diff --git a/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java index 4f263b51..93888eeb 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java @@ -1,10 +1,11 @@ package clap.server.application.port.inbound.admin; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; -import clap.server.domain.model.member.Member; +import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.common.PageResponse; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; public interface FindMembersWithFilterUsecase { - Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); -} + PageResponse findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); +} \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/inbound/management/FindAllMembersUsecase.java b/src/main/java/clap/server/application/port/inbound/management/FindAllMembersUsecase.java deleted file mode 100644 index c60dc381..00000000 --- a/src/main/java/clap/server/application/port/inbound/management/FindAllMembersUsecase.java +++ /dev/null @@ -1,10 +0,0 @@ -package clap.server.application.port.inbound.management; - -import clap.server.domain.model.member.Member; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; - - -public interface FindAllMembersUsecase { - Page findAllMembers(Pageable pageable); -} diff --git a/src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java b/src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java deleted file mode 100644 index 5ebcd2f7..00000000 --- a/src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java +++ /dev/null @@ -1,10 +0,0 @@ -package clap.server.application.port.inbound.management; - -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; -import clap.server.domain.model.member.Member; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; - -public interface FindMembersWithFilterUsecase { - Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); -} diff --git a/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java b/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java index b5f1cfe9..6faeaf4a 100644 --- a/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java +++ b/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java @@ -1,6 +1,6 @@ package clap.server.application.port.outbound.member; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; import clap.server.domain.model.member.Member; import clap.server.domain.model.task.Task; // Task 클래스 임포트 확인 import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; // TaskStatus 임포트 diff --git a/src/main/java/clap/server/application/service/admin/FindAllMembersService.java b/src/main/java/clap/server/application/service/admin/FindAllMembersService.java index 55874fb3..e8119aa3 100644 --- a/src/main/java/clap/server/application/service/admin/FindAllMembersService.java +++ b/src/main/java/clap/server/application/service/admin/FindAllMembersService.java @@ -1,5 +1,8 @@ package clap.server.application.service.admin; +import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.common.PageResponse; +import clap.server.application.mapper.RetrieveAllMemberMapper; import clap.server.application.port.inbound.admin.FindAllMembersUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.domain.model.member.Member; @@ -7,14 +10,19 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class FindAllMembersService implements FindAllMembersUsecase { private final LoadMemberPort loadMemberPort; + private final RetrieveAllMemberMapper retrieveAllMemberMapper; + + @Transactional(readOnly = true) @Override - public Page findAllMembers(Pageable pageable) { - return loadMemberPort.findAllMembers(pageable); + public PageResponse findAllMembers(Pageable pageable) { + Page members = loadMemberPort.findAllMembers(pageable); + return PageResponse.from(members.map(retrieveAllMemberMapper::toResponse)); } } diff --git a/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java b/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java index 529ce8ec..35da56de 100644 --- a/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java +++ b/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java @@ -1,6 +1,10 @@ package clap.server.application.service.admin; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; + +import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.common.PageResponse; +import clap.server.application.mapper.RetrieveAllMemberMapper; import clap.server.application.port.inbound.admin.FindMembersWithFilterUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.domain.model.member.Member; @@ -8,14 +12,19 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class FindMembersWithFilterService implements FindMembersWithFilterUsecase { private final LoadMemberPort loadMemberPort; + private final RetrieveAllMemberMapper retrieveAllMemberMapper; + + @Transactional(readOnly = true) @Override - public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { - return loadMemberPort.findMembersWithFilter(pageable, filterRequest); + public PageResponse findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { + Page members = loadMemberPort.findMembersWithFilter(pageable, filterRequest); + return PageResponse.from(members.map(retrieveAllMemberMapper::toResponse)); } } From 8aa7051a101b86c64b00776c6d1fe0ff7420670c Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Tue, 4 Feb 2025 10:15:44 +0900 Subject: [PATCH 2/2] =?UTF-8?q?CLAP-243=20fix:nickName=20=EC=9D=B4?= =?UTF-8?q?=EC=A4=91=EA=B2=80=EC=A6=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/inbound/web/admin/FindMemberController.java | 4 ---- 1 file changed, 4 deletions(-) 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 003002e3..4e1d65b0 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 @@ -43,10 +43,6 @@ public ResponseEntity> getAllMembers( @RequestParam(defaultValue = "20") int pageSize, @ModelAttribute @Valid FindMemberRequest filterRequest) { - if (filterRequest.name() != null && filterRequest.name().trim().isEmpty()) { - throw ApplicationException.from(MemberErrorCode.NAME_CANNOT_BE_EMPTY); - } - Pageable pageable = PageRequest.of(page, pageSize); PageResponse response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest); return ResponseEntity.ok(response);