Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package clap.server.adapter.inbound.web.dto.task;



import java.time.LocalDateTime;

public record FilterPendingApprovalResponse(
Long taskId,
String taskCode,
LocalDateTime requestedAt,
String mainCategoryName,
String categoryName,
String title,
String requesterName
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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개월)")
Expand All @@ -26,7 +24,7 @@ public record FilterTaskListRequest(
@NotNull
String title,

@Schema(description = "사용자 닉네임", example = "atom.park")
@Schema(description = "요청자/처리자 닉네임", example = "atom.park")
@NotNull
String nickName,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import java.time.LocalDateTime;

public record FindTaskListResponse(
public record FilterTaskListResponse(
Long taskId,
String taskCode,
LocalDateTime requestedAt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
package clap.server.adapter.inbound.web.task;

import clap.server.adapter.inbound.security.SecurityUserDetails;
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.*;
import clap.server.application.port.inbound.task.FindTaskDetailsUsecase;
import clap.server.application.port.inbound.task.FindTaskListUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
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;
Expand All @@ -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
Expand All @@ -34,20 +29,31 @@ public class FindTaskController {
@Operation(summary = "사용자 요청 작업 목록 조회")
@Secured({"ROLE_USER"})
@GetMapping("/requests")
public ResponseEntity<Page<FindTaskListResponse>> getRequestedTaskList(
public ResponseEntity<Page<FilterTaskListResponse>> 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<List<FindTaskDetailsResponse>> getRequestedTaskDetails(
public ResponseEntity<FindTaskDetailsResponse> findRequestedTaskDetails(
@PathVariable Long taskId,
@AuthenticationPrincipal SecurityUserDetails userInfo){
return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(userInfo.getUserId(), taskId));
}
@Operation(summary = "승인대기 중인 요청 목록 조회")
@Secured({"ROLE_MANAGER"})
@GetMapping("/requests/pending")
public ResponseEntity<Page<FilterPendingApprovalResponse>> 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.findPendingApprovalTasks(userInfo.getUserId(), pageable, filterTaskListRequest));
}
}
Original file line number Diff line number Diff line change
@@ -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.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;
Expand Down Expand Up @@ -38,10 +39,17 @@ public Optional<Task> findById(Long id) {
}

@Override
public Page<FindTaskListResponse> findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
Page<Task> taskList = taskRepository.findRequestedTaskList(requesterId, pageable, findTaskListRequest)
public Page<FilterTaskListResponse> findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
Page<Task> taskList = taskRepository.findTasksRequestedByUser(requesterId, pageable, filterTaskListRequest)
.map(taskPersistenceMapper::toDomain);
return taskList.map(TaskMapper::toFindTaskListResponse);
return taskList.map(TaskMapper::toFilterTaskListResponse);
}

@Override
public Page<FilterPendingApprovalResponse> findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
Page<Task> taskList = taskRepository.findPendingApprovalTasks(pageable, filterTaskListRequest)
.map(taskPersistenceMapper::toDomain);
return taskList.map(TaskMapper::toFilterPendingApprovalTasksResponse);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@

public interface TaskCustomRepository {

Page<TaskEntity> findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
Page<TaskEntity> findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
Page<TaskEntity> findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,39 +26,48 @@ public class TaskCustomRepositoryImpl implements TaskCustomRepository {
private final JPAQueryFactory queryFactory;

@Override
public Page<TaskEntity> findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
BooleanBuilder whereClause = new BooleanBuilder();
public Page<TaskEntity> 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));

List<Long> categoryIds = findTaskListRequest.categoryIds();
List<Long> mainCategoryIds = findTaskListRequest.mainCategoryIds();
String title = findTaskListRequest.title();
String nickName = findTaskListRequest.nickName();
List<TaskStatus> taskStatuses = findTaskListRequest.taskStatus();
Integer termHours = findTaskListRequest.term();
String sortBy = findTaskListRequest.orderRequest().sortBy();
String sortDirection = findTaskListRequest.orderRequest().sortDirection();
return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection());
}

if (termHours != null) {
LocalDateTime fromDate = LocalDateTime.now().minusHours(termHours);
whereClause.and(taskEntity.createdAt.after(fromDate));
@Override
public Page<TaskEntity> findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
BooleanBuilder whereClause = createFilter(filterTaskListRequest);
if (!filterTaskListRequest.nickName().isEmpty()) {
whereClause.and(taskEntity.requester.nickname.eq(filterTaskListRequest.nickName()));
}
if (!categoryIds.isEmpty()) {
whereClause.and(taskEntity.category.categoryId.in(categoryIds));
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));
}
if (!mainCategoryIds.isEmpty()) {
whereClause.and(taskEntity.category.mainCategory.categoryId.in(mainCategoryIds));
if (!request.categoryIds().isEmpty()) {
whereClause.and(taskEntity.category.categoryId.in(request.categoryIds()));
}
if (!title.isEmpty()) {
whereClause.and(taskEntity.title.containsIgnoreCase(title));
if (!request.mainCategoryIds().isEmpty()) {
whereClause.and(taskEntity.category.mainCategory.categoryId.in(request.mainCategoryIds()));
}
if (!nickName.isEmpty()) {
whereClause.and(taskEntity.processor.nickname.eq(nickName));
if (!request.title().isEmpty()) {
whereClause.and(taskEntity.title.containsIgnoreCase(request.title()));
}
if (!taskStatuses.isEmpty()) {
whereClause.and(taskEntity.taskStatus.in(taskStatuses));
if (!request.taskStatus().isEmpty()) {
whereClause.and(taskEntity.taskStatus.in(request.taskStatus()));
}
return whereClause;
}

private Page<TaskEntity> getTasksPage(Pageable pageable, BooleanBuilder whereClause, String sortBy, String sortDirection) {
OrderSpecifier<?> orderSpecifier = getOrderSpecifier(sortBy, sortDirection);

List<TaskEntity> result = queryFactory
Expand All @@ -68,7 +77,7 @@ public Page<TaskEntity> findRequestedTaskList(Long requesterId, Pageable pageabl
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
int total = queryFactory
long total = queryFactory
.selectFrom(taskEntity)
.where(whereClause)
.fetch().size();
Expand All @@ -85,4 +94,4 @@ private OrderSpecifier<?> getOrderSpecifier(String sortBy, String sortDirection)
? new OrderSpecifier<>(ASC, sortColumn)
: new OrderSpecifier<>(DESC, sortColumn);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ public class FindTaskDetailsService implements FindTaskDetailsUsecase {
private final LoadAttachmentPort loadAttachmentPort;

@Override
public List<FindTaskDetailsResponse> 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<Attachment> attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNull(taskId);
return TaskMapper.toFindTaskDetailResponses(task, attachments);
return TaskMapper.toFindTaskDetailResponse(task, attachments);
}
}
Original file line number Diff line number Diff line change
@@ -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.FilterPendingApprovalResponse;
import clap.server.application.port.inbound.domain.MemberService;

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


@Override
public Page<FindTaskListResponse> findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
public Page<FilterTaskListResponse> 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<FilterPendingApprovalResponse> findPendingApprovalTasks(Long managerId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
memberService.findActiveMember(managerId);
return loadTaskPort.findPendingApprovalTasks(pageable, filterTaskListRequest);
}
}
24 changes: 16 additions & 8 deletions src/main/java/clap/server/application/mapper/TaskMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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(),
Expand All @@ -38,7 +36,19 @@ public static FindTaskListResponse toFindTaskListResponse(Task task) {
);
}

public static List<FindTaskDetailsResponse> toFindTaskDetailResponses(Task task, List<Attachment> attachments){
public static FilterPendingApprovalResponse toFilterPendingApprovalTasksResponse(Task task) {
return new FilterPendingApprovalResponse(
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<Attachment> attachments){

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

FindTaskDetailsResponse response = new FindTaskDetailsResponse(
return new FindTaskDetailsResponse(
task.getTaskId(),
task.getTaskCode(),
task.getCreatedAt(),
Expand All @@ -66,7 +76,5 @@ public static List<FindTaskDetailsResponse> toFindTaskDetailResponses(Task task,
task.getDescription(),
attachmentResponses
);

return List.of(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
import java.util.List;

public interface FindTaskDetailsUsecase {
List<FindTaskDetailsResponse> findRequestedTaskDetails(Long memberId, Long taskId);
FindTaskDetailsResponse findRequestedTaskDetails(Long memberId, Long taskId);
}
Original file line number Diff line number Diff line change
@@ -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.FilterPendingApprovalResponse;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface FindTaskListUsecase {
Page<FindTaskListResponse> findRequestedTaskList(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
Page<FilterTaskListResponse> findTasksRequestedByUser(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest);

Page<FilterPendingApprovalResponse> findPendingApprovalTasks(Long userId, Pageable pageable, FilterTaskListRequest filterTaskListRequest);
}
Original file line number Diff line number Diff line change
@@ -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.FilterPendingApprovalResponse;
import clap.server.domain.model.task.Task;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand All @@ -15,6 +16,8 @@ public interface LoadTaskPort {

List<Task> findYesterdayTaskByDate(LocalDateTime now);

Page<FindTaskListResponse> findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
Page<FilterTaskListResponse> findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);

Page<FilterPendingApprovalResponse> findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest);

}
4 changes: 0 additions & 4 deletions src/test/java/clap/server/task/FindTaskDetailsUsecase.java

This file was deleted.

Loading
Loading