Skip to content

Commit e87de86

Browse files
committed
CLAP-59 Feat: 승인 대기 중인 작업 목록 조회
1 parent 7b7c1a7 commit e87de86

File tree

13 files changed

+130
-27
lines changed

13 files changed

+130
-27
lines changed

src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskListResponse.java renamed to src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import java.time.LocalDateTime;
66

7-
public record FindTaskListResponse(
7+
public record FilterTaskListResponse(
88
Long taskId,
99
String taskCode,
1010
LocalDateTime requestedAt,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package clap.server.adapter.inbound.web.dto.task;
2+
3+
4+
5+
import java.time.LocalDateTime;
6+
7+
public record FilterTaskStatusRequestedListResponse(
8+
Long taskId,
9+
String taskCode,
10+
LocalDateTime requestedAt,
11+
String mainCategoryName,
12+
String categoryName,
13+
String title,
14+
String requesterName
15+
) {
16+
}

src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import io.swagger.v3.oas.annotations.media.Schema;
44

55
public record OrderRequest(
6-
@Schema(description = "정렬 기준 (REQUESTED_AT/FINISHED_AT)", example = "REQUESTED_AT")
6+
@Schema(description = "정렬 기준", example = "REQUESTED_AT")
77
String sortBy,
88

99
@Schema(description = "정렬 방향 (ASC/DESC)", example = "ASC")

src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package clap.server.adapter.inbound.web.task;
22

33
import clap.server.adapter.inbound.security.SecurityUserDetails;
4+
import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse;
45
import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse;
56
import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest;
6-
import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse;
7+
import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse;
78
import clap.server.application.port.inbound.task.FindTaskDetailsUsecase;
89
import clap.server.application.port.inbound.task.FindTaskListUsecase;
910
import clap.server.common.annotation.architecture.WebAdapter;
1011
import io.swagger.v3.oas.annotations.Operation;
1112
import io.swagger.v3.oas.annotations.tags.Tag;
1213
import lombok.RequiredArgsConstructor;
1314

14-
import lombok.extern.slf4j.Slf4j;
1515
import org.springframework.data.domain.Page;
1616
import org.springframework.data.domain.PageRequest;
1717
import org.springframework.data.domain.Pageable;
@@ -34,7 +34,7 @@ public class FindTaskController {
3434
@Operation(summary = "사용자 요청 작업 목록 조회")
3535
@Secured({"ROLE_USER"})
3636
@GetMapping("/requests")
37-
public ResponseEntity<Page<FindTaskListResponse>> getRequestedTaskList(
37+
public ResponseEntity<Page<FilterTaskListResponse>> getRequestedTaskList(
3838
@RequestParam(defaultValue = "0") int page,
3939
@RequestParam(defaultValue = "20") int pageSize,
4040
@ModelAttribute FilterTaskListRequest filterTaskListRequest,
@@ -45,9 +45,20 @@ public ResponseEntity<Page<FindTaskListResponse>> getRequestedTaskList(
4545
@Operation(summary = "요청한 작업 상세 조회")
4646
@Secured({"ROLE_USER", "ROLE_MANAGER"})
4747
@GetMapping("/requests/details/{taskId}")
48-
public ResponseEntity<List<FindTaskDetailsResponse>> getRequestedTaskDetails(
48+
public ResponseEntity<FindTaskDetailsResponse> getRequestedTaskDetails(
4949
@PathVariable Long taskId,
5050
@AuthenticationPrincipal SecurityUserDetails userInfo){
5151
return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(userInfo.getUserId(), taskId));
5252
}
53+
@Operation(summary = "승인대기 중인 요청 목록 조회")
54+
@Secured({"ROLE_MANAGER"})
55+
@GetMapping("/requests/pending")
56+
public ResponseEntity<Page<FilterTaskStatusRequestedListResponse>> getApprovalPendingTasks(
57+
@RequestParam(defaultValue = "0") int page,
58+
@RequestParam(defaultValue = "20") int pageSize,
59+
@ModelAttribute FilterTaskListRequest filterTaskListRequest,
60+
@AuthenticationPrincipal SecurityUserDetails userInfo){
61+
Pageable pageable = PageRequest.of(page, pageSize);
62+
return ResponseEntity.ok(taskListUsecase.findTaskListByTaskStatusRequested(userInfo.getUserId(), pageable, filterTaskListRequest));
63+
}
5364
}

src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package clap.server.adapter.outbound.persistense;
22

33
import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest;
4-
import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse;
4+
import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse;
5+
import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse;
56
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
67
import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper;
78
import clap.server.adapter.outbound.persistense.repository.task.TaskRepository;
@@ -38,10 +39,17 @@ public Optional<Task> findById(Long id) {
3839
}
3940

4041
@Override
41-
public Page<FindTaskListResponse> findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
42-
Page<Task> taskList = taskRepository.findRequestedTaskList(requesterId, pageable, findTaskListRequest)
42+
public Page<FilterTaskListResponse> findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
43+
Page<Task> taskList = taskRepository.findRequestedTaskList(requesterId, pageable, filterTaskListRequest)
4344
.map(taskPersistenceMapper::toDomain);
44-
return taskList.map(TaskMapper::toFindTaskListResponse);
45+
return taskList.map(TaskMapper::toFilterTaskListResponse);
46+
}
47+
48+
@Override
49+
public Page<FilterTaskStatusRequestedListResponse> findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
50+
Page<Task> taskList = taskRepository.findAllByTaskStatusRequested(pageable, filterTaskListRequest)
51+
.map(taskPersistenceMapper::toDomain);
52+
return taskList.map(TaskMapper::toFilterTaskStatusRequestedListResponse);
4553
}
4654

4755
@Override

src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
public interface TaskCustomRepository {
99

1010
Page<TaskEntity> findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
11+
Page<TaskEntity> findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest findTaskListRequest);
1112
}

src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,52 @@ public Page<TaskEntity> findRequestedTaskList(Long requesterId, Pageable pageabl
7575
return new PageImpl<>(result, pageable, total);
7676
}
7777

78+
@Override
79+
public Page<TaskEntity> findAllByTaskStatusRequested(Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
80+
BooleanBuilder whereClause = new BooleanBuilder();
81+
82+
List<Long> categoryIds = filterTaskListRequest.categoryIds();
83+
List<Long> mainCategoryIds = filterTaskListRequest.mainCategoryIds();
84+
String title = filterTaskListRequest.title();
85+
String nickName = filterTaskListRequest.nickName();
86+
87+
Integer termHours = filterTaskListRequest.term();
88+
String sortBy = filterTaskListRequest.orderRequest().sortBy();
89+
String sortDirection = filterTaskListRequest.orderRequest().sortDirection();
90+
91+
if (termHours != null) {
92+
LocalDateTime fromDate = LocalDateTime.now().minusHours(termHours);
93+
whereClause.and(taskEntity.createdAt.after(fromDate));
94+
}
95+
if (!categoryIds.isEmpty()) {
96+
whereClause.and(taskEntity.category.categoryId.in(categoryIds));
97+
}
98+
if (!mainCategoryIds.isEmpty()) {
99+
whereClause.and(taskEntity.category.mainCategory.categoryId.in(mainCategoryIds));
100+
}
101+
if (!title.isEmpty()) {
102+
whereClause.and(taskEntity.title.containsIgnoreCase(title));
103+
}
104+
if (!nickName.isEmpty()) {
105+
whereClause.and(taskEntity.requester.nickname.eq(nickName));
106+
}
107+
108+
OrderSpecifier<?> orderSpecifier = getOrderSpecifier(sortBy, sortDirection);
109+
110+
List<TaskEntity> result = queryFactory
111+
.selectFrom(taskEntity)
112+
.where(whereClause)
113+
.orderBy(orderSpecifier)
114+
.offset(pageable.getOffset())
115+
.limit(pageable.getPageSize())
116+
.fetch();
117+
int total = queryFactory
118+
.selectFrom(taskEntity)
119+
.where(whereClause)
120+
.fetch().size();
121+
return new PageImpl<>(result, pageable, total);
122+
}
123+
78124
private OrderSpecifier<?> getOrderSpecifier(String sortBy, String sortDirection) {
79125
DateTimePath<LocalDateTime> sortColumn = switch (sortBy) {
80126
case "REQUESTED_AT" -> taskEntity.updatedAt;

src/main/java/clap/server/application/Task/FindTaskDetailsService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ public class FindTaskDetailsService implements FindTaskDetailsUsecase {
2828
private final LoadAttachmentPort loadAttachmentPort;
2929

3030
@Override
31-
public List<FindTaskDetailsResponse> findRequestedTaskDetails(final Long requesterId, final Long taskId) {
31+
public FindTaskDetailsResponse findRequestedTaskDetails(final Long requesterId, final Long taskId) {
3232
memberService.findActiveMember(requesterId);
3333
Task task = loadTaskPort.findById(taskId)
3434
.orElseThrow(()-> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND));
3535
List<Attachment> attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNull(taskId);
36-
return TaskMapper.toFindTaskDetailResponses(task, attachments);
36+
return TaskMapper.toFindTaskDetailResponse(task, attachments);
3737
}
3838
}

src/main/java/clap/server/application/Task/FindTaskListService.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package clap.server.application.Task;
22

33
import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest;
4-
import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse;
4+
import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse;
55

6+
import clap.server.adapter.inbound.web.dto.task.FilterTaskStatusRequestedListResponse;
67
import clap.server.application.port.inbound.domain.MemberService;
78

89
import clap.server.application.port.inbound.task.FindTaskListUsecase;
@@ -28,8 +29,14 @@ public class FindTaskListService implements FindTaskListUsecase {
2829

2930

3031
@Override
31-
public Page<FindTaskListResponse> findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
32+
public Page<FilterTaskListResponse> findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
3233
Member requester = memberService.findActiveMember(requesterId);
3334
return loadTaskPort.findAllByRequesterId(requester.getMemberId(), pageable, findTaskListRequest);
3435
}
36+
37+
@Override
38+
public Page<FilterTaskStatusRequestedListResponse> findTaskListByTaskStatusRequested(Long managerId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
39+
memberService.findActiveMember(managerId);
40+
return loadTaskPort.findAllByTaskStatusRequested(pageable, filterTaskListRequest);
41+
}
3542
}

src/main/java/clap/server/application/mapper/TaskMapper.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import clap.server.domain.model.task.Attachment;
77

88
import clap.server.domain.model.task.Task;
9-
import lombok.extern.slf4j.Slf4j;
109

11-
import java.time.LocalDateTime;
1210
import java.util.List;
1311
import java.util.stream.Collectors;
1412

@@ -24,8 +22,8 @@ public static UpdateTaskResponse toUpdateTaskResponse(Task task) {
2422
return new UpdateTaskResponse(task.getTaskId(), task.getCategory().getCategoryId(), task.getTitle());
2523
}
2624

27-
public static FindTaskListResponse toFindTaskListResponse(Task task) {
28-
return new FindTaskListResponse(
25+
public static FilterTaskListResponse toFilterTaskListResponse(Task task) {
26+
return new FilterTaskListResponse(
2927
task.getTaskId(),
3028
task.getTaskCode(),
3129
task.getUpdatedAt(),
@@ -38,7 +36,19 @@ public static FindTaskListResponse toFindTaskListResponse(Task task) {
3836
);
3937
}
4038

41-
public static List<FindTaskDetailsResponse> toFindTaskDetailResponses(Task task, List<Attachment> attachments){
39+
public static FilterTaskStatusRequestedListResponse toFilterTaskStatusRequestedListResponse(Task task) {
40+
return new FilterTaskStatusRequestedListResponse(
41+
task.getTaskId(),
42+
task.getTaskCode(),
43+
task.getUpdatedAt(),
44+
task.getCategory().getMainCategory().getName(),
45+
task.getCategory().getName(),
46+
task.getTitle(),
47+
task.getRequester().getMemberInfo().getNickname()
48+
);
49+
}
50+
51+
public static FindTaskDetailsResponse toFindTaskDetailResponse(Task task, List<Attachment> attachments){
4252

4353
List<AttachmentResponse> attachmentResponses = attachments.stream()
4454
.map(attachment -> new AttachmentResponse(
@@ -50,7 +60,7 @@ public static List<FindTaskDetailsResponse> toFindTaskDetailResponses(Task task,
5060
))
5161
.collect(Collectors.toList());
5262

53-
FindTaskDetailsResponse response = new FindTaskDetailsResponse(
63+
return new FindTaskDetailsResponse(
5464
task.getTaskId(),
5565
task.getTaskCode(),
5666
task.getCreatedAt(),
@@ -66,7 +76,5 @@ public static List<FindTaskDetailsResponse> toFindTaskDetailResponses(Task task,
6676
task.getDescription(),
6777
attachmentResponses
6878
);
69-
70-
return List.of(response);
7179
}
7280
}

0 commit comments

Comments
 (0)