From fc1d0968150be40f9649826ac6004017ab46370b Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Sun, 26 Jan 2025 05:40:24 +0900 Subject: [PATCH 1/7] =?UTF-8?q?CLAP-118=20feat:=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inbound/web/member/MemberController.java | 29 +++++++++++++++++++ .../web/member/RetrieveAllMemberResponse.java | 27 +++++++++++++++++ .../persistense/MemberPersistenceAdapter.java | 7 +++++ .../repository/member/MemberRepository.java | 3 ++ .../mapper/RetrieveAllMemberMapper.java | 28 ++++++++++++++++++ .../port/inbound/domain/MemberService.java | 8 ++++- .../management/FindAllMemberUsecase.java | 9 ++++++ .../port/outbound/member/LoadMemberPort.java | 3 ++ 8 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/member/MemberController.java create mode 100644 src/main/java/clap/server/adapter/inbound/web/member/RetrieveAllMemberResponse.java create mode 100644 src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java create mode 100644 src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java diff --git a/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java b/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java new file mode 100644 index 00000000..916ad50e --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java @@ -0,0 +1,29 @@ +package clap.server.adapter.inbound.web.member; + +import clap.server.application.mapper.RetrieveAllMemberMapper; +import clap.server.application.port.inbound.management.FindAllMemberUsecase; +import clap.server.domain.model.member.Member; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/members") +@RequiredArgsConstructor +public class MemberController { + private final FindAllMemberUsecase findAllMemberUsecase; + private final RetrieveAllMemberMapper retrieveAllMemberMapper; + + @Operation(summary = "전체 회원 조회 API", description = "모든 회원 정보를 반환합니다.") + @GetMapping + public ResponseEntity> getAllMembers() { + List members = findAllMemberUsecase.findAllMembers(); + List response = retrieveAllMemberMapper.toResponseList(members); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/clap/server/adapter/inbound/web/member/RetrieveAllMemberResponse.java b/src/main/java/clap/server/adapter/inbound/web/member/RetrieveAllMemberResponse.java new file mode 100644 index 00000000..21915116 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/member/RetrieveAllMemberResponse.java @@ -0,0 +1,27 @@ +package clap.server.adapter.inbound.web.member; + +import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; +import io.swagger.v3.oas.annotations.media.Schema; + +public record RetrieveAllMemberResponse( + @Schema(description = "회원 이름", example = "양시훈") + String name, + + @Schema(description = "회원 이메일", example = "sihun123@gmail.com") + String email, + + @Schema(description = "회원 닉네임, 로그인할 때 쓰입니다.", example = "leo.sh") + String nickname, + + @Schema(description = "승인 권한 여부", example = "true") + Boolean isReviewer, + + @Schema(description = "부서 ID", example = "1") + Long departmentId, + + @Schema(description = "회원 역할", example = "ROLE_USER") + MemberRole role, + + @Schema(description = "회원 직책", example = "개발자") + String departmentRole +) {} 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 6a142f5d..bfd5cfeb 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -86,5 +86,12 @@ public List findTasksByMemberIdAndStatus(Long memberId, List t .collect(Collectors.toList()); } + @Override + public List findAllMembers() { + List entities = memberRepository.findAll(); + return entities.stream() + .map(memberPersistenceMapper::toDomain) + .toList(); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java index 0bbec88e..d4a4b991 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java @@ -21,5 +21,8 @@ public interface MemberRepository extends JpaRepository { Optional findByNickname(String nickname); List findByIsReviewerTrue(); + + List findAll(); // 전체 회원 조회 + } diff --git a/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java b/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java new file mode 100644 index 00000000..b7cfe47a --- /dev/null +++ b/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java @@ -0,0 +1,28 @@ +package clap.server.application.mapper; + +import clap.server.adapter.inbound.web.member.RetrieveAllMemberResponse; +import clap.server.domain.model.member.Member; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class RetrieveAllMemberMapper { + public List toResponseList(List members) { + return members.stream() + .map(this::toResponse) + .toList(); + } + + public RetrieveAllMemberResponse toResponse(Member member) { + return new RetrieveAllMemberResponse( + member.getMemberInfo().getName(), + member.getMemberInfo().getEmail(), + member.getMemberInfo().getNickname(), + member.getMemberInfo().isReviewer(), + member.getMemberInfo().getDepartment().getDepartmentId(), + member.getMemberInfo().getRole(), + member.getMemberInfo().getDepartmentRole() + ); + } +} \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java index d8d3e8d8..de724330 100644 --- a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java +++ b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java @@ -1,5 +1,6 @@ package clap.server.application.port.inbound.domain; +import clap.server.application.port.inbound.management.FindAllMemberUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.domain.model.member.Member; import clap.server.domain.model.task.Task; @@ -13,7 +14,7 @@ @Service @RequiredArgsConstructor -public class MemberService { +public class MemberService implements FindAllMemberUsecase { private final LoadMemberPort loadMemberPort; public Member findById(Long memberId) { @@ -56,4 +57,9 @@ public List findActiveManagers() { public List findReviewers() { return loadMemberPort.findReviewers(); } + + @Override + public List findAllMembers() { + return loadMemberPort.findAllMembers(); + } } diff --git a/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java b/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java new file mode 100644 index 00000000..03152d78 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java @@ -0,0 +1,9 @@ +package clap.server.application.port.inbound.management; + +import clap.server.domain.model.member.Member; + +import java.util.List; + +public interface FindAllMemberUsecase { + List findAllMembers(); +} 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 1eb3e576..4d47a5fc 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 @@ -21,4 +21,7 @@ public interface LoadMemberPort { List findReviewers(); + List findAllMembers(); // 전체 회원 조회 + + } From 2155024fc28ceecbaced8e1eb7c5074fdebfaffd Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Wed, 29 Jan 2025 03:47:05 +0900 Subject: [PATCH 2/7] =?UTF-8?q?CLAP-118=20feat:=ED=8E=98=EC=9D=B4=EC=A7=95?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inbound/web/member/MemberController.java | 30 +++++++++++++++---- .../persistense/MemberPersistenceAdapter.java | 11 +++---- .../repository/member/MemberRepository.java | 2 -- .../port/inbound/domain/MemberService.java | 6 ++-- .../management/FindAllMemberUsecase.java | 4 ++- .../port/outbound/member/LoadMemberPort.java | 6 ++-- 6 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java b/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java index 916ad50e..cc814280 100644 --- a/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java @@ -4,14 +4,19 @@ import clap.server.application.port.inbound.management.FindAllMemberUsecase; import clap.server.domain.model.member.Member; 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 org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @RestController @RequestMapping("/api/members") @RequiredArgsConstructor @@ -19,11 +24,24 @@ public class MemberController { private final FindAllMemberUsecase findAllMemberUsecase; private final RetrieveAllMemberMapper retrieveAllMemberMapper; - @Operation(summary = "전체 회원 조회 API", description = "모든 회원 정보를 반환합니다.") + @Tag(name = "Admin") + @Secured({"ROLE_ADMIN"}) + @Operation( + summary = "전체 회원 조회 API", + description = "모든 회원 정보를 페이징 처리하여 반환합니다.", + parameters = { + @Parameter(name = "page", description = "조회할 페이지 번호 (1부터 시작, 기본값: 1)", example = "1"), + @Parameter(name = "size", description = "페이지 당 회원 수 (기본값: 20)", example = "20") + } + ) @GetMapping - public ResponseEntity> getAllMembers() { - List members = findAllMemberUsecase.findAllMembers(); - List response = retrieveAllMemberMapper.toResponseList(members); + public ResponseEntity> getAllMembers( + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "20") int size) { + + Pageable pageable = PageRequest.of(page, size); + Page members = findAllMemberUsecase.findAllMembers(pageable); + Page response = members.map(retrieveAllMemberMapper::toResponse); return ResponseEntity.ok(response); } } 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 bfd5cfeb..3b886af7 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -13,11 +13,14 @@ import clap.server.adapter.outbound.persistense.entity.task.TaskEntity; import clap.server.adapter.outbound.persistense.repository.task.TaskRepository; import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper; + import java.util.stream.Collectors; import java.util.List; import clap.server.domain.model.member.Member; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.Optional; @@ -87,11 +90,9 @@ public List findTasksByMemberIdAndStatus(Long memberId, List t } @Override - public List findAllMembers() { - List entities = memberRepository.findAll(); - return entities.stream() - .map(memberPersistenceMapper::toDomain) - .toList(); + public Page findAllMembers(Pageable pageable) { + Page entities = memberRepository.findAll(pageable); + return entities.map(memberPersistenceMapper::toDomain); } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java index d4a4b991..d4b150d3 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java @@ -22,7 +22,5 @@ public interface MemberRepository extends JpaRepository { List findByIsReviewerTrue(); - List findAll(); // 전체 회원 조회 - } diff --git a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java index de724330..aa09da7d 100644 --- a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java +++ b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java @@ -8,6 +8,8 @@ import clap.server.exception.ApplicationException; import clap.server.exception.code.MemberErrorCode; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.List; @@ -59,7 +61,7 @@ public List findReviewers() { } @Override - public List findAllMembers() { - return loadMemberPort.findAllMembers(); + public Page findAllMembers(Pageable pageable) { + return loadMemberPort.findAllMembers(pageable); } } diff --git a/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java b/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java index 03152d78..ec81ac4b 100644 --- a/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java @@ -1,9 +1,11 @@ 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; import java.util.List; public interface FindAllMemberUsecase { - List findAllMembers(); + Page findAllMembers(Pageable pageable); } 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 4d47a5fc..8df83cc8 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 @@ -3,6 +3,9 @@ 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 임포트 +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + import java.util.List; import java.util.Optional; @@ -21,7 +24,6 @@ public interface LoadMemberPort { List findReviewers(); - List findAllMembers(); // 전체 회원 조회 - + Page findAllMembers(Pageable pageable); } From d3c8b29e09a4b0fd2408b414b9c19b104a9f70c0 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Wed, 29 Jan 2025 04:30:01 +0900 Subject: [PATCH 3/7] =?UTF-8?q?CLAP-116=20feat:=ED=95=84=ED=84=B0=EB=A7=81?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/admin/FindMemberRequest.java | 23 +++++++++++++ .../inbound/web/member/MemberController.java | 27 ++++++++++------ .../persistense/MemberPersistenceAdapter.java | 8 +++++ .../repository/member/MemberRepository.java | 3 +- .../specification/MemberSpecification.java | 32 +++++++++++++++++++ .../port/inbound/domain/MemberService.java | 6 ++++ .../management/FindAllMemberUsecase.java | 4 ++- .../port/outbound/member/LoadMemberPort.java | 4 +++ 8 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/admin/FindMemberRequest.java create mode 100644 src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java 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 new file mode 100644 index 00000000..f94708ac --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/FindMemberRequest.java @@ -0,0 +1,23 @@ +package clap.server.adapter.inbound.web.dto.admin; + +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; + + @Schema(description = "회원 이메일", example = "sihun123@gmail.com") + private String email; + + @Schema(description = "회원 닉네임", example = "leo.sh") + private String nickname; + + @Schema(description = "부서 ID", example = "1") + private Long departmentId; + + @Schema(description = "회원 역할", example = "ROLE_USER") + private MemberRole role; +} diff --git a/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java b/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java index cc814280..e226f120 100644 --- a/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java @@ -1,5 +1,6 @@ package clap.server.adapter.inbound.web.member; +import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; import clap.server.application.mapper.RetrieveAllMemberMapper; import clap.server.application.port.inbound.management.FindAllMemberUsecase; import clap.server.domain.model.member.Member; @@ -12,10 +13,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/members") @@ -28,20 +26,29 @@ public class MemberController { @Secured({"ROLE_ADMIN"}) @Operation( summary = "전체 회원 조회 API", - description = "모든 회원 정보를 페이징 처리하여 반환합니다.", + description = "모든 회원 정보를 페이징 처리하여 반환하거나 조건에 맞는 회원 정보를 반환합니다.", parameters = { - @Parameter(name = "page", description = "조회할 페이지 번호 (1부터 시작, 기본값: 1)", example = "1"), + @Parameter(name = "page", description = "조회할 페이지 번호 (0부터 시작, 기본값: 0)", example = "0"), @Parameter(name = "size", description = "페이지 당 회원 수 (기본값: 20)", example = "20") } ) @GetMapping public ResponseEntity> getAllMembers( - @RequestParam(defaultValue = "1") int page, - @RequestParam(defaultValue = "20") int size) { + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size, + @ModelAttribute FindMemberRequest filterRequest) { Pageable pageable = PageRequest.of(page, size); - Page members = findAllMemberUsecase.findAllMembers(pageable); + Page members; + + if (filterRequest.getName() != null || filterRequest.getEmail() != null || filterRequest.getNickname() != null || + filterRequest.getDepartmentId() != null || filterRequest.getRole() != null) { + members = findAllMemberUsecase.findMembersWithFilter(pageable, filterRequest); + } else { + members = findAllMemberUsecase.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/outbound/persistense/MemberPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java index 3b886af7..3a71b13a 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -1,10 +1,12 @@ package clap.server.adapter.outbound.persistense; +import clap.server.adapter.inbound.web.dto.admin.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; import clap.server.adapter.outbound.persistense.mapper.MemberPersistenceMapper; import clap.server.adapter.outbound.persistense.repository.member.MemberRepository; +import clap.server.adapter.outbound.persistense.specification.MemberSpecification; import clap.server.application.port.outbound.member.CommandMemberPort; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.common.annotation.architecture.PersistenceAdapter; @@ -94,5 +96,11 @@ public Page findAllMembers(Pageable pageable) { Page entities = memberRepository.findAll(pageable); return entities.map(memberPersistenceMapper::toDomain); } + + @Override + public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { + Page entities = memberRepository.findAll(MemberSpecification.withFilter(filterRequest), pageable); + return entities.map(memberPersistenceMapper::toDomain); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java index d4b150d3..e6aaadab 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java @@ -4,13 +4,14 @@ import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; @Repository -public interface MemberRepository extends JpaRepository { +public interface MemberRepository extends JpaRepository, JpaSpecificationExecutor { List findByRoleAndStatus(MemberRole role, MemberStatus status); diff --git a/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java b/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java new file mode 100644 index 00000000..58dfc355 --- /dev/null +++ b/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java @@ -0,0 +1,32 @@ +package clap.server.adapter.outbound.persistense.specification; + +import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; +import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; +import org.springframework.data.jpa.domain.Specification; + +public class MemberSpecification { + + public static Specification withFilter(FindMemberRequest filterRequest) { + return (root, query, cb) -> { + var predicates = cb.conjunction(); + + if (filterRequest.getName() != null) { + predicates = cb.and(predicates, cb.like(root.get("name"), "%" + filterRequest.getName() + "%")); + } + if (filterRequest.getEmail() != null) { + predicates = cb.and(predicates, cb.like(root.get("email"), "%" + filterRequest.getEmail() + "%")); + } + if (filterRequest.getNickname() != null) { + predicates = cb.and(predicates, cb.like(root.get("nickname"), "%" + filterRequest.getNickname() + "%")); + } + if (filterRequest.getDepartmentId() != null) { + predicates = cb.and(predicates, cb.equal(root.get("departmentId"), filterRequest.getDepartmentId())); + } + if (filterRequest.getRole() != null) { + predicates = cb.and(predicates, cb.equal(root.get("role"), filterRequest.getRole())); + } + + return predicates; + }; + } +} diff --git a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java index aa09da7d..9dc8eefd 100644 --- a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java +++ b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java @@ -1,5 +1,6 @@ package clap.server.application.port.inbound.domain; +import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; import clap.server.application.port.inbound.management.FindAllMemberUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.domain.model.member.Member; @@ -64,4 +65,9 @@ public List findReviewers() { public Page findAllMembers(Pageable pageable) { return loadMemberPort.findAllMembers(pageable); } + + @Override + public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { + return loadMemberPort.findMembersWithFilter(pageable, filterRequest); + } } diff --git a/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java b/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java index ec81ac4b..be68c21d 100644 --- a/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java @@ -1,11 +1,13 @@ 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; -import java.util.List; public interface FindAllMemberUsecase { Page findAllMembers(Pageable pageable); + 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 8df83cc8..60749793 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,5 +1,6 @@ package clap.server.application.port.outbound.member; +import clap.server.adapter.inbound.web.dto.admin.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 임포트 @@ -26,4 +27,7 @@ public interface LoadMemberPort { Page findAllMembers(Pageable pageable); + Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); + + } From 2132093d5da834d966162854d764b25d099ef606 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Wed, 29 Jan 2025 04:37:52 +0900 Subject: [PATCH 4/7] =?UTF-8?q?CLAP-118=20fix:'=EC=82=AD=EC=A0=9C'?= =?UTF-8?q?=EC=83=81=ED=83=9C=EC=9D=98=20=ED=9A=8C=EC=9B=90=EC=9D=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EC=97=90=EC=84=9C=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../outbound/persistense/MemberPersistenceAdapter.java | 3 ++- .../persistense/specification/MemberSpecification.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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 3a71b13a..cbd1c79c 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -93,7 +93,7 @@ public List findTasksByMemberIdAndStatus(Long memberId, List t @Override public Page findAllMembers(Pageable pageable) { - Page entities = memberRepository.findAll(pageable); + Page entities = memberRepository.findAll(MemberSpecification.isNotDeleted(), pageable); return entities.map(memberPersistenceMapper::toDomain); } @@ -101,6 +101,7 @@ public Page findAllMembers(Pageable pageable) { public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { Page entities = memberRepository.findAll(MemberSpecification.withFilter(filterRequest), pageable); return entities.map(memberPersistenceMapper::toDomain); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java b/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java index 58dfc355..8d376c32 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java @@ -2,14 +2,24 @@ import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; +import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; import org.springframework.data.jpa.domain.Specification; public class MemberSpecification { + // DELETED 상태 제외 + public static Specification isNotDeleted() { + return (root, query, cb) -> cb.notEqual(root.get("status"), MemberStatus.DELETED); + } + public static Specification withFilter(FindMemberRequest filterRequest) { return (root, query, cb) -> { var predicates = cb.conjunction(); + // DELETED 상태가 아닌 회원만 기본으로 조회 + predicates = cb.and(predicates, isNotDeleted().toPredicate(root, query, cb)); + + if (filterRequest.getName() != null) { predicates = cb.and(predicates, cb.like(root.get("name"), "%" + filterRequest.getName() + "%")); } From 2f769f2866e075b1b5380fb4d1dc54949d7f2188 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Wed, 29 Jan 2025 19:28:01 +0900 Subject: [PATCH 5/7] CLAP-118 fix:Controller,dto Rename --- .../web/{member => dto/admin}/RetrieveAllMemberResponse.java | 2 +- .../{MemberController.java => FindMemberController.java} | 5 +++-- .../server/application/mapper/RetrieveAllMemberMapper.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) rename src/main/java/clap/server/adapter/inbound/web/{member => dto/admin}/RetrieveAllMemberResponse.java (94%) rename src/main/java/clap/server/adapter/inbound/web/member/{MemberController.java => FindMemberController.java} (94%) diff --git a/src/main/java/clap/server/adapter/inbound/web/member/RetrieveAllMemberResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/RetrieveAllMemberResponse.java similarity index 94% rename from src/main/java/clap/server/adapter/inbound/web/member/RetrieveAllMemberResponse.java rename to src/main/java/clap/server/adapter/inbound/web/dto/admin/RetrieveAllMemberResponse.java index 21915116..33c1e08f 100644 --- a/src/main/java/clap/server/adapter/inbound/web/member/RetrieveAllMemberResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/RetrieveAllMemberResponse.java @@ -1,4 +1,4 @@ -package clap.server.adapter.inbound.web.member; +package clap.server.adapter.inbound.web.dto.admin; 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/inbound/web/member/MemberController.java b/src/main/java/clap/server/adapter/inbound/web/member/FindMemberController.java similarity index 94% rename from src/main/java/clap/server/adapter/inbound/web/member/MemberController.java rename to src/main/java/clap/server/adapter/inbound/web/member/FindMemberController.java index e226f120..fedb0dda 100644 --- a/src/main/java/clap/server/adapter/inbound/web/member/MemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/member/FindMemberController.java @@ -1,6 +1,7 @@ package clap.server.adapter.inbound.web.member; import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; +import clap.server.adapter.inbound.web.dto.admin.RetrieveAllMemberResponse; import clap.server.application.mapper.RetrieveAllMemberMapper; import clap.server.application.port.inbound.management.FindAllMemberUsecase; import clap.server.domain.model.member.Member; @@ -18,11 +19,11 @@ @RestController @RequestMapping("/api/members") @RequiredArgsConstructor -public class MemberController { +public class FindMemberController { private final FindAllMemberUsecase findAllMemberUsecase; private final RetrieveAllMemberMapper retrieveAllMemberMapper; - @Tag(name = "Admin") + @Tag(name = "05. Admin") @Secured({"ROLE_ADMIN"}) @Operation( summary = "전체 회원 조회 API", diff --git a/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java b/src/main/java/clap/server/application/mapper/RetrieveAllMemberMapper.java index b7cfe47a..f48de77b 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.member.RetrieveAllMemberResponse; +import clap.server.adapter.inbound.web.dto.admin.RetrieveAllMemberResponse; import clap.server.domain.model.member.Member; import org.springframework.stereotype.Component; From fa14916024a85424bac8298d957e2e212b390c7a Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Wed, 29 Jan 2025 19:36:30 +0900 Subject: [PATCH 6/7] =?UTF-8?q?CLAP-118=20fix:Controller=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inbound/web/{member => admin}/FindMemberController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename src/main/java/clap/server/adapter/inbound/web/{member => admin}/FindMemberController.java (95%) diff --git a/src/main/java/clap/server/adapter/inbound/web/member/FindMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java similarity index 95% rename from src/main/java/clap/server/adapter/inbound/web/member/FindMemberController.java rename to src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java index fedb0dda..5b9bb56a 100644 --- a/src/main/java/clap/server/adapter/inbound/web/member/FindMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java @@ -1,4 +1,4 @@ -package clap.server.adapter.inbound.web.member; +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; @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/api/members") +@RequestMapping("/api/managements") @RequiredArgsConstructor public class FindMemberController { private final FindAllMemberUsecase findAllMemberUsecase; @@ -33,7 +33,7 @@ public class FindMemberController { @Parameter(name = "size", description = "페이지 당 회원 수 (기본값: 20)", example = "20") } ) - @GetMapping + @GetMapping("/members") public ResponseEntity> getAllMembers( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int size, From dda61102950e3c0f4a956bd3690c36be8876a76f Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Fri, 31 Jan 2025 18:44:00 +0900 Subject: [PATCH 7/7] =?UTF-8?q?CLAP-118=20fix:=ED=95=84=ED=84=B0=EB=A7=81?= =?UTF-8?q?=20=EB=B0=A9=EC=8B=9D=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/admin/FindMemberController.java | 11 ++-- .../persistense/MemberPersistenceAdapter.java | 63 +++++++++++++++++-- .../specification/MemberSpecification.java | 42 ------------- .../port/inbound/domain/MemberService.java | 16 +---- .../management/FindAllMembersUsecase.java | 10 +++ ...java => FindMembersWithFilterUsecase.java} | 7 +-- .../service/member/FindAllMembersService.java | 20 ++++++ .../member/FindMembersWithFilterService.java | 21 +++++++ 8 files changed, 118 insertions(+), 72 deletions(-) delete mode 100644 src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java create mode 100644 src/main/java/clap/server/application/port/inbound/management/FindAllMembersUsecase.java rename src/main/java/clap/server/application/port/inbound/management/{FindAllMemberUsecase.java => FindMembersWithFilterUsecase.java} (68%) create mode 100644 src/main/java/clap/server/application/service/member/FindAllMembersService.java create mode 100644 src/main/java/clap/server/application/service/member/FindMembersWithFilterService.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 5b9bb56a..28a18ec7 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 @@ -3,7 +3,8 @@ import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; import clap.server.adapter.inbound.web.dto.admin.RetrieveAllMemberResponse; import clap.server.application.mapper.RetrieveAllMemberMapper; -import clap.server.application.port.inbound.management.FindAllMemberUsecase; +import clap.server.application.port.inbound.management.FindAllMembersUsecase; +import clap.server.application.port.inbound.management.FindMembersWithFilterUsecase; import clap.server.domain.model.member.Member; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -20,7 +21,8 @@ @RequestMapping("/api/managements") @RequiredArgsConstructor public class FindMemberController { - private final FindAllMemberUsecase findAllMemberUsecase; + private final FindAllMembersUsecase findAllMembersUsecase; + private final FindMembersWithFilterUsecase findMembersWithFilterUsecase; private final RetrieveAllMemberMapper retrieveAllMemberMapper; @Tag(name = "05. Admin") @@ -44,11 +46,12 @@ public ResponseEntity> getAllMembers( if (filterRequest.getName() != null || filterRequest.getEmail() != null || filterRequest.getNickname() != null || filterRequest.getDepartmentId() != null || filterRequest.getRole() != null) { - members = findAllMemberUsecase.findMembersWithFilter(pageable, filterRequest); + members = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest); } else { - members = findAllMemberUsecase.findAllMembers(pageable); + members = findAllMembersUsecase.findAllMembers(pageable); } + Page response = members.map(retrieveAllMemberMapper::toResponse); return ResponseEntity.ok(response); } 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 cbd1c79c..39630c88 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -6,7 +6,6 @@ import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; import clap.server.adapter.outbound.persistense.mapper.MemberPersistenceMapper; import clap.server.adapter.outbound.persistense.repository.member.MemberRepository; -import clap.server.adapter.outbound.persistense.specification.MemberSpecification; import clap.server.application.port.outbound.member.CommandMemberPort; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.common.annotation.architecture.PersistenceAdapter; @@ -20,12 +19,17 @@ import java.util.List; import clap.server.domain.model.member.Member; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import java.util.Optional; +import static clap.server.adapter.outbound.persistense.entity.member.QMemberEntity.memberEntity; + @PersistenceAdapter @RequiredArgsConstructor public class MemberPersistenceAdapter implements LoadMemberPort, CommandMemberPort { @@ -33,7 +37,7 @@ public class MemberPersistenceAdapter implements LoadMemberPort, CommandMemberPo private final MemberPersistenceMapper memberPersistenceMapper; private final TaskRepository taskRepository; private final TaskPersistenceMapper taskPersistenceMapper; - + private final JPAQueryFactory jpaQueryFactory; @Override public Optional findById(final Long id) { @@ -93,15 +97,62 @@ public List findTasksByMemberIdAndStatus(Long memberId, List t @Override public Page findAllMembers(Pageable pageable) { - Page entities = memberRepository.findAll(MemberSpecification.isNotDeleted(), pageable); - return entities.map(memberPersistenceMapper::toDomain); + return executeQueryWithPageable(pageable, new BooleanBuilder().and(memberEntity.status.ne(MemberStatus.DELETED))); } @Override public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { - Page entities = memberRepository.findAll(MemberSpecification.withFilter(filterRequest), pageable); - return entities.map(memberPersistenceMapper::toDomain); + BooleanBuilder whereClause = createMemberFilter(filterRequest); + return executeQueryWithPageable(pageable, whereClause); + } + // 공통 쿼리 처리 + private Page executeQueryWithPageable(Pageable pageable, BooleanBuilder whereClause) { + List entities = jpaQueryFactory + .selectFrom(memberEntity) + .where(whereClause) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + long total = jpaQueryFactory + .select(memberEntity.count()) + .from(memberEntity) + .where(whereClause) + .fetchOne(); + + return new PageImpl<>( + entities.stream() + .map(memberPersistenceMapper::toDomain) + .toList(), + pageable, + total + ); + } + + // 필터 조건 생성 + 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.getEmail() != null) { + whereClause.and(memberEntity.email.containsIgnoreCase(filterRequest.getEmail())); + } + if (filterRequest.getNickname() != null) { + whereClause.and(memberEntity.nickname.containsIgnoreCase(filterRequest.getNickname())); + } + if (filterRequest.getDepartmentId() != null) { + whereClause.and(memberEntity.department.departmentId.eq(filterRequest.getDepartmentId())); + } + if (filterRequest.getRole() != null) { + whereClause.and(memberEntity.role.eq(filterRequest.getRole())); + } + + return whereClause; } } + diff --git a/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java b/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java deleted file mode 100644 index 8d376c32..00000000 --- a/src/main/java/clap/server/adapter/outbound/persistense/specification/MemberSpecification.java +++ /dev/null @@ -1,42 +0,0 @@ -package clap.server.adapter.outbound.persistense.specification; - -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; -import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; -import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; -import org.springframework.data.jpa.domain.Specification; - -public class MemberSpecification { - - // DELETED 상태 제외 - public static Specification isNotDeleted() { - return (root, query, cb) -> cb.notEqual(root.get("status"), MemberStatus.DELETED); - } - - public static Specification withFilter(FindMemberRequest filterRequest) { - return (root, query, cb) -> { - var predicates = cb.conjunction(); - - // DELETED 상태가 아닌 회원만 기본으로 조회 - predicates = cb.and(predicates, isNotDeleted().toPredicate(root, query, cb)); - - - if (filterRequest.getName() != null) { - predicates = cb.and(predicates, cb.like(root.get("name"), "%" + filterRequest.getName() + "%")); - } - if (filterRequest.getEmail() != null) { - predicates = cb.and(predicates, cb.like(root.get("email"), "%" + filterRequest.getEmail() + "%")); - } - if (filterRequest.getNickname() != null) { - predicates = cb.and(predicates, cb.like(root.get("nickname"), "%" + filterRequest.getNickname() + "%")); - } - if (filterRequest.getDepartmentId() != null) { - predicates = cb.and(predicates, cb.equal(root.get("departmentId"), filterRequest.getDepartmentId())); - } - if (filterRequest.getRole() != null) { - predicates = cb.and(predicates, cb.equal(root.get("role"), filterRequest.getRole())); - } - - return predicates; - }; - } -} diff --git a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java index 9dc8eefd..6030f267 100644 --- a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java +++ b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java @@ -1,23 +1,18 @@ package clap.server.application.port.inbound.domain; -import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; -import clap.server.application.port.inbound.management.FindAllMemberUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.domain.model.member.Member; -import clap.server.domain.model.task.Task; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.exception.ApplicationException; import clap.server.exception.code.MemberErrorCode; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.List; @Service @RequiredArgsConstructor -public class MemberService implements FindAllMemberUsecase { +public class MemberService { private final LoadMemberPort loadMemberPort; public Member findById(Long memberId) { @@ -61,13 +56,4 @@ public List findReviewers() { return loadMemberPort.findReviewers(); } - @Override - public Page findAllMembers(Pageable pageable) { - return loadMemberPort.findAllMembers(pageable); - } - - @Override - public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { - return loadMemberPort.findMembersWithFilter(pageable, filterRequest); - } } 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 new file mode 100644 index 00000000..c60dc381 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/management/FindAllMembersUsecase.java @@ -0,0 +1,10 @@ +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/FindAllMemberUsecase.java b/src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java similarity index 68% rename from src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java rename to src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java index be68c21d..5ebcd2f7 100644 --- a/src/main/java/clap/server/application/port/inbound/management/FindAllMemberUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/management/FindMembersWithFilterUsecase.java @@ -5,9 +5,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; - -public interface FindAllMemberUsecase { - Page findAllMembers(Pageable pageable); - Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); // 조건부 필터링 조회 - +public interface FindMembersWithFilterUsecase { + Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); } diff --git a/src/main/java/clap/server/application/service/member/FindAllMembersService.java b/src/main/java/clap/server/application/service/member/FindAllMembersService.java new file mode 100644 index 00000000..4467bd84 --- /dev/null +++ b/src/main/java/clap/server/application/service/member/FindAllMembersService.java @@ -0,0 +1,20 @@ +package clap.server.application.service.member; + +import clap.server.application.port.inbound.management.FindAllMembersUsecase; +import clap.server.application.port.outbound.member.LoadMemberPort; +import clap.server.domain.model.member.Member; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class FindAllMembersService implements FindAllMembersUsecase { + private final LoadMemberPort loadMemberPort; + + @Override + public Page findAllMembers(Pageable pageable) { + return loadMemberPort.findAllMembers(pageable); + } +} diff --git a/src/main/java/clap/server/application/service/member/FindMembersWithFilterService.java b/src/main/java/clap/server/application/service/member/FindMembersWithFilterService.java new file mode 100644 index 00000000..c13176e7 --- /dev/null +++ b/src/main/java/clap/server/application/service/member/FindMembersWithFilterService.java @@ -0,0 +1,21 @@ +package clap.server.application.service.member; + +import clap.server.adapter.inbound.web.dto.admin.FindMemberRequest; +import clap.server.application.port.inbound.management.FindMembersWithFilterUsecase; +import clap.server.application.port.outbound.member.LoadMemberPort; +import clap.server.domain.model.member.Member; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class FindMembersWithFilterService implements FindMembersWithFilterUsecase { + private final LoadMemberPort loadMemberPort; + + @Override + public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { + return loadMemberPort.findMembersWithFilter(pageable, filterRequest); + } +}