From e87de86846d4f85b252cfb7b716c1a63d6d0ea32 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Fri, 24 Jan 2025 19:49:11 +0900 Subject: [PATCH 1/4] =?UTF-8?q?CLAP-59=20Feat:=20=EC=8A=B9=EC=9D=B8=20?= =?UTF-8?q?=EB=8C=80=EA=B8=B0=20=EC=A4=91=EC=9D=B8=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ponse.java => FilterTaskListResponse.java} | 2 +- ...FilterTaskStatusRequestedListResponse.java | 16 +++++++ .../inbound/web/dto/task/OrderRequest.java | 2 +- .../inbound/web/task/FindTaskController.java | 19 ++++++-- .../persistense/TaskPersistenceAdapter.java | 16 +++++-- .../repository/task/TaskCustomRepository.java | 1 + .../task/TaskCustomRepositoryImpl.java | 46 +++++++++++++++++++ .../Task/FindTaskDetailsService.java | 4 +- .../application/Task/FindTaskListService.java | 11 ++++- .../server/application/mapper/TaskMapper.java | 24 ++++++---- .../inbound/task/FindTaskDetailsUsecase.java | 2 +- .../inbound/task/FindTaskListUsecase.java | 7 ++- .../port/outbound/task/LoadTaskPort.java | 7 ++- 13 files changed, 130 insertions(+), 27 deletions(-) rename src/main/java/clap/server/adapter/inbound/web/dto/task/{FindTaskListResponse.java => FilterTaskListResponse.java} (91%) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskStatusRequestedListResponse.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskListResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListResponse.java similarity index 91% rename from src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskListResponse.java rename to src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListResponse.java index 152624dd..649cb249 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskListResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListResponse.java @@ -4,7 +4,7 @@ import java.time.LocalDateTime; -public record FindTaskListResponse( +public record FilterTaskListResponse( Long taskId, String taskCode, LocalDateTime requestedAt, diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskStatusRequestedListResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskStatusRequestedListResponse.java new file mode 100644 index 00000000..d8517cd8 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskStatusRequestedListResponse.java @@ -0,0 +1,16 @@ +package clap.server.adapter.inbound.web.dto.task; + + + +import java.time.LocalDateTime; + +public record FilterTaskStatusRequestedListResponse( + Long taskId, + String taskCode, + LocalDateTime requestedAt, + String mainCategoryName, + String categoryName, + String title, + String requesterName +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java index 4c6a3e31..c756d06e 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java @@ -3,7 +3,7 @@ import io.swagger.v3.oas.annotations.media.Schema; public record OrderRequest( - @Schema(description = "정렬 기준 (REQUESTED_AT/FINISHED_AT)", example = "REQUESTED_AT") + @Schema(description = "정렬 기준", example = "REQUESTED_AT") String sortBy, @Schema(description = "정렬 방향 (ASC/DESC)", example = "ASC") diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java index 339cb5cd..e7929e2e 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java @@ -1,9 +1,10 @@ package clap.server.adapter.inbound.web.task; import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; import clap.server.application.port.inbound.task.FindTaskDetailsUsecase; import clap.server.application.port.inbound.task.FindTaskListUsecase; import clap.server.common.annotation.architecture.WebAdapter; @@ -11,7 +12,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -34,7 +34,7 @@ public class FindTaskController { @Operation(summary = "사용자 요청 작업 목록 조회") @Secured({"ROLE_USER"}) @GetMapping("/requests") - public ResponseEntity> getRequestedTaskList( + public ResponseEntity> getRequestedTaskList( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, @ModelAttribute FilterTaskListRequest filterTaskListRequest, @@ -45,9 +45,20 @@ public ResponseEntity> getRequestedTaskList( @Operation(summary = "요청한 작업 상세 조회") @Secured({"ROLE_USER", "ROLE_MANAGER"}) @GetMapping("/requests/details/{taskId}") - public ResponseEntity> getRequestedTaskDetails( + public ResponseEntity getRequestedTaskDetails( @PathVariable Long taskId, @AuthenticationPrincipal SecurityUserDetails userInfo){ return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(userInfo.getUserId(), taskId)); } + @Operation(summary = "승인대기 중인 요청 목록 조회") + @Secured({"ROLE_MANAGER"}) + @GetMapping("/requests/pending") + public ResponseEntity> getApprovalPendingTasks( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int pageSize, + @ModelAttribute FilterTaskListRequest filterTaskListRequest, + @AuthenticationPrincipal SecurityUserDetails userInfo){ + Pageable pageable = PageRequest.of(page, pageSize); + return ResponseEntity.ok(taskListUsecase.findTaskListByTaskStatusRequested(userInfo.getUserId(), pageable, filterTaskListRequest)); + } } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java index c8128d32..ba6b7e79 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java @@ -1,7 +1,8 @@ package clap.server.adapter.outbound.persistense; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; import clap.server.adapter.outbound.persistense.entity.task.TaskEntity; import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper; import clap.server.adapter.outbound.persistense.repository.task.TaskRepository; @@ -38,10 +39,17 @@ public Optional findById(Long id) { } @Override - public Page findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { - Page taskList = taskRepository.findRequestedTaskList(requesterId, pageable, findTaskListRequest) + public Page findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + Page taskList = taskRepository.findRequestedTaskList(requesterId, pageable, filterTaskListRequest) .map(taskPersistenceMapper::toDomain); - return taskList.map(TaskMapper::toFindTaskListResponse); + return taskList.map(TaskMapper::toFilterTaskListResponse); + } + + @Override + public Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + Page taskList = taskRepository.findAllByTaskStatusRequested(pageable, filterTaskListRequest) + .map(taskPersistenceMapper::toDomain); + return taskList.map(TaskMapper::toFilterTaskStatusRequestedListResponse); } @Override diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java index dd7028c5..496ac95a 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java @@ -8,4 +8,5 @@ public interface TaskCustomRepository { Page findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest findTaskListRequest); } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java index be184f6f..9d34336d 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java @@ -75,6 +75,52 @@ public Page findRequestedTaskList(Long requesterId, Pageable pageabl return new PageImpl<>(result, pageable, total); } + @Override + public Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + BooleanBuilder whereClause = new BooleanBuilder(); + + List categoryIds = filterTaskListRequest.categoryIds(); + List mainCategoryIds = filterTaskListRequest.mainCategoryIds(); + String title = filterTaskListRequest.title(); + String nickName = filterTaskListRequest.nickName(); + + Integer termHours = filterTaskListRequest.term(); + String sortBy = filterTaskListRequest.orderRequest().sortBy(); + String sortDirection = filterTaskListRequest.orderRequest().sortDirection(); + + if (termHours != null) { + LocalDateTime fromDate = LocalDateTime.now().minusHours(termHours); + whereClause.and(taskEntity.createdAt.after(fromDate)); + } + if (!categoryIds.isEmpty()) { + whereClause.and(taskEntity.category.categoryId.in(categoryIds)); + } + if (!mainCategoryIds.isEmpty()) { + whereClause.and(taskEntity.category.mainCategory.categoryId.in(mainCategoryIds)); + } + if (!title.isEmpty()) { + whereClause.and(taskEntity.title.containsIgnoreCase(title)); + } + if (!nickName.isEmpty()) { + whereClause.and(taskEntity.requester.nickname.eq(nickName)); + } + + OrderSpecifier orderSpecifier = getOrderSpecifier(sortBy, sortDirection); + + List result = queryFactory + .selectFrom(taskEntity) + .where(whereClause) + .orderBy(orderSpecifier) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + int total = queryFactory + .selectFrom(taskEntity) + .where(whereClause) + .fetch().size(); + return new PageImpl<>(result, pageable, total); + } + private OrderSpecifier getOrderSpecifier(String sortBy, String sortDirection) { DateTimePath sortColumn = switch (sortBy) { case "REQUESTED_AT" -> taskEntity.updatedAt; diff --git a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java b/src/main/java/clap/server/application/Task/FindTaskDetailsService.java index c48dc7b9..2920f46d 100644 --- a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java +++ b/src/main/java/clap/server/application/Task/FindTaskDetailsService.java @@ -28,11 +28,11 @@ public class FindTaskDetailsService implements FindTaskDetailsUsecase { private final LoadAttachmentPort loadAttachmentPort; @Override - public List findRequestedTaskDetails(final Long requesterId, final Long taskId) { + public FindTaskDetailsResponse findRequestedTaskDetails(final Long requesterId, final Long taskId) { memberService.findActiveMember(requesterId); Task task = loadTaskPort.findById(taskId) .orElseThrow(()-> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND)); List attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNull(taskId); - return TaskMapper.toFindTaskDetailResponses(task, attachments); + return TaskMapper.toFindTaskDetailResponse(task, attachments); } } diff --git a/src/main/java/clap/server/application/Task/FindTaskListService.java b/src/main/java/clap/server/application/Task/FindTaskListService.java index bb8d9183..ecf40b6b 100644 --- a/src/main/java/clap/server/application/Task/FindTaskListService.java +++ b/src/main/java/clap/server/application/Task/FindTaskListService.java @@ -1,8 +1,9 @@ package clap.server.application.Task; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.task.FindTaskListUsecase; @@ -28,8 +29,14 @@ public class FindTaskListService implements FindTaskListUsecase { @Override - public Page findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { + public Page findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { Member requester = memberService.findActiveMember(requesterId); return loadTaskPort.findAllByRequesterId(requester.getMemberId(), pageable, findTaskListRequest); } + + @Override + public Page findTaskListByTaskStatusRequested(Long managerId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + memberService.findActiveMember(managerId); + return loadTaskPort.findAllByTaskStatusRequested(pageable, filterTaskListRequest); + } } diff --git a/src/main/java/clap/server/application/mapper/TaskMapper.java b/src/main/java/clap/server/application/mapper/TaskMapper.java index 752c8833..9fe30189 100644 --- a/src/main/java/clap/server/application/mapper/TaskMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskMapper.java @@ -6,9 +6,7 @@ import clap.server.domain.model.task.Attachment; import clap.server.domain.model.task.Task; -import lombok.extern.slf4j.Slf4j; -import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -24,8 +22,8 @@ public static UpdateTaskResponse toUpdateTaskResponse(Task task) { return new UpdateTaskResponse(task.getTaskId(), task.getCategory().getCategoryId(), task.getTitle()); } - public static FindTaskListResponse toFindTaskListResponse(Task task) { - return new FindTaskListResponse( + public static FilterTaskListResponse toFilterTaskListResponse(Task task) { + return new FilterTaskListResponse( task.getTaskId(), task.getTaskCode(), task.getUpdatedAt(), @@ -38,7 +36,19 @@ public static FindTaskListResponse toFindTaskListResponse(Task task) { ); } - public static List toFindTaskDetailResponses(Task task, List attachments){ + public static FilterTaskStatusRequestedListResponse toFilterTaskStatusRequestedListResponse(Task task) { + return new FilterTaskStatusRequestedListResponse( + task.getTaskId(), + task.getTaskCode(), + task.getUpdatedAt(), + task.getCategory().getMainCategory().getName(), + task.getCategory().getName(), + task.getTitle(), + task.getRequester().getMemberInfo().getNickname() + ); + } + + public static FindTaskDetailsResponse toFindTaskDetailResponse(Task task, List attachments){ List attachmentResponses = attachments.stream() .map(attachment -> new AttachmentResponse( @@ -50,7 +60,7 @@ public static List toFindTaskDetailResponses(Task task, )) .collect(Collectors.toList()); - FindTaskDetailsResponse response = new FindTaskDetailsResponse( + return new FindTaskDetailsResponse( task.getTaskId(), task.getTaskCode(), task.getCreatedAt(), @@ -66,7 +76,5 @@ public static List toFindTaskDetailResponses(Task task, task.getDescription(), attachmentResponses ); - - return List.of(response); } } diff --git a/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java b/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java index 0006c376..009eca07 100644 --- a/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java @@ -5,5 +5,5 @@ import java.util.List; public interface FindTaskDetailsUsecase { - List findRequestedTaskDetails(Long memberId, Long taskId); + FindTaskDetailsResponse findRequestedTaskDetails(Long memberId, Long taskId); } diff --git a/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java b/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java index 8d85fdbf..91d2c54d 100644 --- a/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java @@ -1,10 +1,13 @@ package clap.server.application.port.inbound.task; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; public interface FindTaskListUsecase { - Page findRequestedTaskList(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findRequestedTaskList(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + + Page findTaskListByTaskStatusRequested(Long userId, Pageable pageable, FilterTaskListRequest filterTaskListRequest); } diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java b/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java index 9e8cb996..93bafe86 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java @@ -1,7 +1,8 @@ package clap.server.application.port.outbound.task; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; import clap.server.domain.model.task.Task; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -15,6 +16,8 @@ public interface LoadTaskPort { List findYesterdayTaskByDate(LocalDateTime now); - Page findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + + Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest); } \ No newline at end of file From d571f1df6860b28babf543d082dfee3f8aa6224c Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Fri, 24 Jan 2025 23:22:49 +0900 Subject: [PATCH 2/4] =?UTF-8?q?CLAP-59=20Fix:=20=EC=8A=B9=EC=9D=B8?= =?UTF-8?q?=EB=8C=80=EA=B8=B0=EC=9A=94=EC=B2=AD=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=AA=85=EC=B9=AD=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ava => FilterPendingApprovalResponse.java} | 2 +- .../web/dto/task/FilterTaskListRequest.java | 2 - .../inbound/web/task/FindTaskController.java | 17 ++-- .../persistense/TaskPersistenceAdapter.java | 12 +-- .../repository/task/TaskCustomRepository.java | 4 +- .../task/TaskCustomRepositoryImpl.java | 96 ++++++------------- .../application/Task/FindTaskListService.java | 10 +- .../server/application/mapper/TaskMapper.java | 4 +- .../inbound/task/FindTaskListUsecase.java | 6 +- .../port/outbound/task/LoadTaskPort.java | 6 +- 10 files changed, 56 insertions(+), 103 deletions(-) rename src/main/java/clap/server/adapter/inbound/web/dto/task/{FilterTaskStatusRequestedListResponse.java => FilterPendingApprovalResponse.java} (84%) diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskStatusRequestedListResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterPendingApprovalResponse.java similarity index 84% rename from src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskStatusRequestedListResponse.java rename to src/main/java/clap/server/adapter/inbound/web/dto/task/FilterPendingApprovalResponse.java index d8517cd8..0ab86e16 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskStatusRequestedListResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterPendingApprovalResponse.java @@ -4,7 +4,7 @@ import java.time.LocalDateTime; -public record FilterTaskStatusRequestedListResponse( +public record FilterPendingApprovalResponse( Long taskId, String taskCode, LocalDateTime requestedAt, diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java index 3e858ed9..794e5d29 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java @@ -4,11 +4,9 @@ import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; -import org.springframework.beans.factory.annotation.Value; import java.util.List; -@Schema(description = "작업 필터링 요청") public record FilterTaskListRequest( @Schema(description = "검색 기간 (단위: 시간)", example = "1, 24, 168, 730, 2190 (1시간, 24시간, 1주일, 1개월, 3개월)") diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java index e7929e2e..f58dcdbb 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java @@ -1,10 +1,7 @@ package clap.server.adapter.inbound.web.task; import clap.server.adapter.inbound.security.SecurityUserDetails; -import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; -import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; -import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; +import clap.server.adapter.inbound.web.dto.task.*; import clap.server.application.port.inbound.task.FindTaskDetailsUsecase; import clap.server.application.port.inbound.task.FindTaskListUsecase; import clap.server.common.annotation.architecture.WebAdapter; @@ -20,8 +17,6 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Tag(name = "작업 조회") @WebAdapter @RestController @@ -34,18 +29,18 @@ public class FindTaskController { @Operation(summary = "사용자 요청 작업 목록 조회") @Secured({"ROLE_USER"}) @GetMapping("/requests") - public ResponseEntity> getRequestedTaskList( + public ResponseEntity> findTasksRequestedByUser( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, @ModelAttribute FilterTaskListRequest filterTaskListRequest, @AuthenticationPrincipal SecurityUserDetails userInfo){ Pageable pageable = PageRequest.of(page, pageSize); - return ResponseEntity.ok(taskListUsecase.findRequestedTaskList(userInfo.getUserId(), pageable, filterTaskListRequest)); + return ResponseEntity.ok(taskListUsecase.findTasksRequestedByUser(userInfo.getUserId(), pageable, filterTaskListRequest)); } @Operation(summary = "요청한 작업 상세 조회") @Secured({"ROLE_USER", "ROLE_MANAGER"}) @GetMapping("/requests/details/{taskId}") - public ResponseEntity getRequestedTaskDetails( + public ResponseEntity findRequestedTaskDetails( @PathVariable Long taskId, @AuthenticationPrincipal SecurityUserDetails userInfo){ return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(userInfo.getUserId(), taskId)); @@ -53,12 +48,12 @@ public ResponseEntity getRequestedTaskDetails( @Operation(summary = "승인대기 중인 요청 목록 조회") @Secured({"ROLE_MANAGER"}) @GetMapping("/requests/pending") - public ResponseEntity> getApprovalPendingTasks( + public ResponseEntity> findPendingApprovalTasks( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, @ModelAttribute FilterTaskListRequest filterTaskListRequest, @AuthenticationPrincipal SecurityUserDetails userInfo){ Pageable pageable = PageRequest.of(page, pageSize); - return ResponseEntity.ok(taskListUsecase.findTaskListByTaskStatusRequested(userInfo.getUserId(), pageable, filterTaskListRequest)); + return ResponseEntity.ok(taskListUsecase.findPendingApprovalTasks(userInfo.getUserId(), pageable, filterTaskListRequest)); } } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java index ba6b7e79..2274fba1 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java @@ -2,7 +2,7 @@ import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; -import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; import clap.server.adapter.outbound.persistense.entity.task.TaskEntity; import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper; import clap.server.adapter.outbound.persistense.repository.task.TaskRepository; @@ -39,17 +39,17 @@ public Optional findById(Long id) { } @Override - public Page findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { - Page taskList = taskRepository.findRequestedTaskList(requesterId, pageable, filterTaskListRequest) + public Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + Page taskList = taskRepository.findTasksRequestedByUser(requesterId, pageable, filterTaskListRequest) .map(taskPersistenceMapper::toDomain); return taskList.map(TaskMapper::toFilterTaskListResponse); } @Override - public Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { - Page taskList = taskRepository.findAllByTaskStatusRequested(pageable, filterTaskListRequest) + public Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + Page taskList = taskRepository.findPendingApprovalTasks(pageable, filterTaskListRequest) .map(taskPersistenceMapper::toDomain); - return taskList.map(TaskMapper::toFilterTaskStatusRequestedListResponse); + return taskList.map(TaskMapper::toFilterPendingApprovalTasksResponse); } @Override diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java index 496ac95a..e0385877 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java @@ -7,6 +7,6 @@ public interface TaskCustomRepository { - Page findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); - Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest); } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java index 9d34336d..c8064709 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java @@ -26,85 +26,45 @@ public class TaskCustomRepositoryImpl implements TaskCustomRepository { private final JPAQueryFactory queryFactory; @Override - public Page findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { - BooleanBuilder whereClause = new BooleanBuilder(); + public Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { + BooleanBuilder whereClause = createFilter(findTaskListRequest); whereClause.and(taskEntity.requester.memberId.eq(requesterId)); - - List categoryIds = findTaskListRequest.categoryIds(); - List mainCategoryIds = findTaskListRequest.mainCategoryIds(); - String title = findTaskListRequest.title(); - String nickName = findTaskListRequest.nickName(); - List taskStatuses = findTaskListRequest.taskStatus(); - Integer termHours = findTaskListRequest.term(); - String sortBy = findTaskListRequest.orderRequest().sortBy(); - String sortDirection = findTaskListRequest.orderRequest().sortDirection(); - - if (termHours != null) { - LocalDateTime fromDate = LocalDateTime.now().minusHours(termHours); - whereClause.and(taskEntity.createdAt.after(fromDate)); - } - if (!categoryIds.isEmpty()) { - whereClause.and(taskEntity.category.categoryId.in(categoryIds)); - } - if (!mainCategoryIds.isEmpty()) { - whereClause.and(taskEntity.category.mainCategory.categoryId.in(mainCategoryIds)); - } - if (!title.isEmpty()) { - whereClause.and(taskEntity.title.containsIgnoreCase(title)); - } - if (!nickName.isEmpty()) { - whereClause.and(taskEntity.processor.nickname.eq(nickName)); - } - if (!taskStatuses.isEmpty()) { - whereClause.and(taskEntity.taskStatus.in(taskStatuses)); - } - - OrderSpecifier orderSpecifier = getOrderSpecifier(sortBy, sortDirection); - - List result = queryFactory - .selectFrom(taskEntity) - .where(whereClause) - .orderBy(orderSpecifier) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) - .fetch(); - int total = queryFactory - .selectFrom(taskEntity) - .where(whereClause) - .fetch().size(); - return new PageImpl<>(result, pageable, total); + return getTasksPage(pageable, whereClause, findTaskListRequest.orderRequest().sortBy(), findTaskListRequest.orderRequest().sortDirection()); } @Override - public Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { - BooleanBuilder whereClause = new BooleanBuilder(); - - List categoryIds = filterTaskListRequest.categoryIds(); - List mainCategoryIds = filterTaskListRequest.mainCategoryIds(); - String title = filterTaskListRequest.title(); - String nickName = filterTaskListRequest.nickName(); + public Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + BooleanBuilder whereClause = createFilter(filterTaskListRequest); + whereClause.and(taskEntity.taskStatus.eq(TaskStatus.REQUESTED)); + return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection()); + } - Integer termHours = filterTaskListRequest.term(); - String sortBy = filterTaskListRequest.orderRequest().sortBy(); - String sortDirection = filterTaskListRequest.orderRequest().sortDirection(); + private BooleanBuilder createFilter(FilterTaskListRequest request) { + BooleanBuilder whereClause = new BooleanBuilder(); - if (termHours != null) { - LocalDateTime fromDate = LocalDateTime.now().minusHours(termHours); + if (request.term() != null) { + LocalDateTime fromDate = LocalDateTime.now().minusHours(request.term()); whereClause.and(taskEntity.createdAt.after(fromDate)); } - if (!categoryIds.isEmpty()) { - whereClause.and(taskEntity.category.categoryId.in(categoryIds)); + if (!request.categoryIds().isEmpty()) { + whereClause.and(taskEntity.category.categoryId.in(request.categoryIds())); + } + if (!request.mainCategoryIds().isEmpty()) { + whereClause.and(taskEntity.category.mainCategory.categoryId.in(request.mainCategoryIds())); } - if (!mainCategoryIds.isEmpty()) { - whereClause.and(taskEntity.category.mainCategory.categoryId.in(mainCategoryIds)); + if (!request.title().isEmpty()) { + whereClause.and(taskEntity.title.containsIgnoreCase(request.title())); } - if (!title.isEmpty()) { - whereClause.and(taskEntity.title.containsIgnoreCase(title)); + if (!request.nickName().isEmpty()) { + whereClause.and(taskEntity.processor.nickname.eq(request.nickName())); } - if (!nickName.isEmpty()) { - whereClause.and(taskEntity.requester.nickname.eq(nickName)); + if (!request.taskStatus().isEmpty()) { + whereClause.and(taskEntity.taskStatus.in(request.taskStatus())); } + return whereClause; + } + private Page getTasksPage(Pageable pageable, BooleanBuilder whereClause, String sortBy, String sortDirection) { OrderSpecifier orderSpecifier = getOrderSpecifier(sortBy, sortDirection); List result = queryFactory @@ -114,7 +74,7 @@ public Page findAllByTaskStatusRequested(Pageable pageable, FilterTa .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - int total = queryFactory + long total = queryFactory .selectFrom(taskEntity) .where(whereClause) .fetch().size(); @@ -131,4 +91,4 @@ private OrderSpecifier getOrderSpecifier(String sortBy, String sortDirection) ? new OrderSpecifier<>(ASC, sortColumn) : new OrderSpecifier<>(DESC, sortColumn); } -} +} \ No newline at end of file diff --git a/src/main/java/clap/server/application/Task/FindTaskListService.java b/src/main/java/clap/server/application/Task/FindTaskListService.java index ecf40b6b..57570230 100644 --- a/src/main/java/clap/server/application/Task/FindTaskListService.java +++ b/src/main/java/clap/server/application/Task/FindTaskListService.java @@ -3,7 +3,7 @@ import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; -import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.task.FindTaskListUsecase; @@ -29,14 +29,14 @@ public class FindTaskListService implements FindTaskListUsecase { @Override - public Page findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { + public Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { Member requester = memberService.findActiveMember(requesterId); - return loadTaskPort.findAllByRequesterId(requester.getMemberId(), pageable, findTaskListRequest); + return loadTaskPort.findTasksRequestedByUser(requester.getMemberId(), pageable, findTaskListRequest); } @Override - public Page findTaskListByTaskStatusRequested(Long managerId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + public Page findPendingApprovalTasks(Long managerId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { memberService.findActiveMember(managerId); - return loadTaskPort.findAllByTaskStatusRequested(pageable, filterTaskListRequest); + return loadTaskPort.findPendingApprovalTasks(pageable, filterTaskListRequest); } } diff --git a/src/main/java/clap/server/application/mapper/TaskMapper.java b/src/main/java/clap/server/application/mapper/TaskMapper.java index 9fe30189..7fce4e8f 100644 --- a/src/main/java/clap/server/application/mapper/TaskMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskMapper.java @@ -36,8 +36,8 @@ public static FilterTaskListResponse toFilterTaskListResponse(Task task) { ); } - public static FilterTaskStatusRequestedListResponse toFilterTaskStatusRequestedListResponse(Task task) { - return new FilterTaskStatusRequestedListResponse( + public static FilterPendingApprovalResponse toFilterPendingApprovalTasksResponse(Task task) { + return new FilterPendingApprovalResponse( task.getTaskId(), task.getTaskCode(), task.getUpdatedAt(), diff --git a/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java b/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java index 91d2c54d..7aed8dce 100644 --- a/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java @@ -2,12 +2,12 @@ import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; -import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; public interface FindTaskListUsecase { - Page findRequestedTaskList(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findTasksRequestedByUser(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest); - Page findTaskListByTaskStatusRequested(Long userId, Pageable pageable, FilterTaskListRequest filterTaskListRequest); + Page findPendingApprovalTasks(Long userId, Pageable pageable, FilterTaskListRequest filterTaskListRequest); } diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java b/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java index 93bafe86..50042219 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java @@ -2,7 +2,7 @@ import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse; -import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse; +import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; import clap.server.domain.model.task.Task; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -16,8 +16,8 @@ public interface LoadTaskPort { List findYesterdayTaskByDate(LocalDateTime now); - Page findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); - Page findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest); + Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest); } \ No newline at end of file From 77c0d24b23aab669bbe95b4ebca308470154772a Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Sat, 25 Jan 2025 09:54:05 +0900 Subject: [PATCH 3/4] =?UTF-8?q?CLAP-59=20Add:=20=EC=8A=B9=EC=9D=B8?= =?UTF-8?q?=EB=8C=80=EA=B8=B0=EB=AA=A9=EB=A1=9D=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/task/FindTaskDetailsUsecase.java | 4 - .../server/task/FindTaskListServiceTest.java | 97 +++++++++++++++++++ 2 files changed, 97 insertions(+), 4 deletions(-) delete mode 100644 src/test/java/clap/server/task/FindTaskDetailsUsecase.java create mode 100644 src/test/java/clap/server/task/FindTaskListServiceTest.java diff --git a/src/test/java/clap/server/task/FindTaskDetailsUsecase.java b/src/test/java/clap/server/task/FindTaskDetailsUsecase.java deleted file mode 100644 index 6fc35e9d..00000000 --- a/src/test/java/clap/server/task/FindTaskDetailsUsecase.java +++ /dev/null @@ -1,4 +0,0 @@ -package clap.server.task; - -public class FindTaskDetailsUsecase { -} diff --git a/src/test/java/clap/server/task/FindTaskListServiceTest.java b/src/test/java/clap/server/task/FindTaskListServiceTest.java new file mode 100644 index 00000000..695cf439 --- /dev/null +++ b/src/test/java/clap/server/task/FindTaskListServiceTest.java @@ -0,0 +1,97 @@ +package clap.server.task; + +import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; +import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; +import clap.server.adapter.inbound.web.dto.task.OrderRequest; + +import clap.server.application.Task.FindTaskListService; +import clap.server.application.port.inbound.domain.MemberService; +import clap.server.application.port.outbound.task.LoadTaskPort; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.*; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class FindTaskListServiceTest { + + @Mock + private MemberService memberService; + @Mock + private LoadTaskPort loadTaskPort; + @InjectMocks + private FindTaskListService findTaskListService; + + private FilterTaskListRequest filterTaskListRequest; + private Pageable pageable; + private Page expectedResponse; + + @BeforeEach + void setUp() { + pageable = PageRequest.of(0, 20); + filterTaskListRequest = new FilterTaskListRequest( + null, List.of(2L), List.of(1L), "작업 제목", "", List.of(), new OrderRequest("REQUESTED_AT", "DESC") + ); + + FilterPendingApprovalResponse response = new FilterPendingApprovalResponse( + 1L, "TC001", LocalDateTime.of(2025, 1, 24, 12, 30), + "메인 카테고리", "서브 카테고리", "작업 제목", "atom.park" + ); + + FilterPendingApprovalResponse response2 = new FilterPendingApprovalResponse( + 2L, "TC002", LocalDateTime.of(2025, 1, 15, 14, 30), + "메인 카테고리2", "서브 카테고리2", "다른 작업 제목", "john.doe" + ); + expectedResponse = new PageImpl<>(List.of(response, response2), pageable, 1); + } + + @Test + @DisplayName("승인대기 중인 작업요청목록 조회") + void findPendingApprovalTasks_ReturnFilteredTasks() { + // given + Long managerId = 1L; + when(loadTaskPort.findPendingApprovalTasks(pageable, filterTaskListRequest)) + .thenReturn(expectedResponse); + + // when + Page result = findTaskListService.findPendingApprovalTasks(managerId, pageable, filterTaskListRequest); + + // then + assertThat(result).isNotNull(); + assertThat(result.getTotalElements()).isEqualTo(2); + + assertThat(result.getContent()).hasSize(2) + .extracting(FilterPendingApprovalResponse::taskId) + .containsExactly(1L, 2L); + + assertThat(result.getContent().get(0)) + .extracting(FilterPendingApprovalResponse::taskId, FilterPendingApprovalResponse::taskCode, + FilterPendingApprovalResponse::requestedAt, FilterPendingApprovalResponse::mainCategoryName, + FilterPendingApprovalResponse::categoryName, FilterPendingApprovalResponse::title, + FilterPendingApprovalResponse::requesterName) + .containsExactly(1L, "TC001", LocalDateTime.of(2025, 1, 24, 12, 30), + "메인 카테고리", "서브 카테고리", "작업 제목", "atom.park"); + + assertThat(result.getContent().get(1)) + .extracting(FilterPendingApprovalResponse::taskId, FilterPendingApprovalResponse::taskCode, + FilterPendingApprovalResponse::requestedAt, FilterPendingApprovalResponse::mainCategoryName, + FilterPendingApprovalResponse::categoryName, FilterPendingApprovalResponse::title, + FilterPendingApprovalResponse::requesterName) + .containsExactly(2L, "TC002", LocalDateTime.of(2025, 1, 15, 14, 30), + "메인 카테고리2", "서브 카테고리2", "다른 작업 제목", "john.doe"); + + verify(loadTaskPort).findPendingApprovalTasks(pageable, filterTaskListRequest); + } +} From 490ae511f2a83ec7d405aa5be94914390c0566a8 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Sat, 25 Jan 2025 14:57:00 +0900 Subject: [PATCH 4/4] =?UTF-8?q?CLAP-59=20Fix:=20=EC=8A=B9=EC=9D=B8?= =?UTF-8?q?=EB=8C=80=EA=B8=B0=EC=A4=91=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EB=A7=81=20=EC=8B=9C=20requestor=EC=99=80=20?= =?UTF-8?q?processor=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/task/FilterTaskListRequest.java | 2 +- .../task/TaskCustomRepositoryImpl.java | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java index 794e5d29..6b361be3 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java @@ -24,7 +24,7 @@ public record FilterTaskListRequest( @NotNull String title, - @Schema(description = "사용자 닉네임", example = "atom.park") + @Schema(description = "요청자/처리자 닉네임", example = "atom.park") @NotNull String nickName, diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java index c8064709..12b632f3 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java @@ -26,22 +26,28 @@ public class TaskCustomRepositoryImpl implements TaskCustomRepository { private final JPAQueryFactory queryFactory; @Override - public Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { - BooleanBuilder whereClause = createFilter(findTaskListRequest); + public Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + BooleanBuilder whereClause = createFilter(filterTaskListRequest); + if (!filterTaskListRequest.nickName().isEmpty()) { + whereClause.and(taskEntity.processor.nickname.eq(filterTaskListRequest.nickName())); + } whereClause.and(taskEntity.requester.memberId.eq(requesterId)); - return getTasksPage(pageable, whereClause, findTaskListRequest.orderRequest().sortBy(), findTaskListRequest.orderRequest().sortDirection()); + + return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection()); } @Override public Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { BooleanBuilder whereClause = createFilter(filterTaskListRequest); + if (!filterTaskListRequest.nickName().isEmpty()) { + whereClause.and(taskEntity.requester.nickname.eq(filterTaskListRequest.nickName())); + } whereClause.and(taskEntity.taskStatus.eq(TaskStatus.REQUESTED)); return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection()); } private BooleanBuilder createFilter(FilterTaskListRequest request) { BooleanBuilder whereClause = new BooleanBuilder(); - if (request.term() != null) { LocalDateTime fromDate = LocalDateTime.now().minusHours(request.term()); whereClause.and(taskEntity.createdAt.after(fromDate)); @@ -55,9 +61,6 @@ private BooleanBuilder createFilter(FilterTaskListRequest request) { if (!request.title().isEmpty()) { whereClause.and(taskEntity.title.containsIgnoreCase(request.title())); } - if (!request.nickName().isEmpty()) { - whereClause.and(taskEntity.processor.nickname.eq(request.nickName())); - } if (!request.taskStatus().isEmpty()) { whereClause.and(taskEntity.taskStatus.in(request.taskStatus())); }