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 2a7c9837..77a0ff52 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 @@ -2,17 +2,13 @@ import clap.server.adapter.inbound.web.dto.admin.request.FindMemberRequest; import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; -import clap.server.application.mapper.RetrieveAllMemberMapper; -import clap.server.application.port.inbound.admin.FindAllMembersUsecase; +import clap.server.adapter.inbound.web.dto.common.PageResponse; import clap.server.application.port.inbound.admin.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; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; +import jakarta.validation.Valid; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; @@ -23,9 +19,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 +32,13 @@ public class FindMemberController { } ) @GetMapping("/members") - public ResponseEntity> getAllMembers( + public ResponseEntity> getAllMembers( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, - @RequestBody FindMemberRequest filterRequest) { - - if (filterRequest.name() != null && filterRequest.name().trim().isEmpty()) { - throw ApplicationException.from(MemberErrorCode.NAME_CANNOT_BE_EMPTY); - } + @ModelAttribute @Valid FindMemberRequest filterRequest) { 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 4e557441..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 @@ -2,20 +2,26 @@ 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/outbound/persistense/MemberPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java index d0faa99d..8d507516 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -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/MemberCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java index 785677d1..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 @@ -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/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 526bdfcd..8950e39f 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.request.FindMemberRequest; -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 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 index 37034aa8..e69de29b 100644 --- a/src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java @@ -1,10 +0,0 @@ -package clap.server.application.port.inbound.management; - -import clap.server.adapter.inbound.web.dto.admin.request.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/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 0beca493..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.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)); } }