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,19 @@
package clap.server.adapter.inbound.web.dto.task;

import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;

import java.time.LocalDateTime;

public record FilterAllTasksResponse(
Long taskId,
String taskCode,
LocalDateTime requestedAt,
String mainCategoryName,
String categoryName,
String title,
String processorName,
String requesterName,
TaskStatus taskStatus,
LocalDateTime finishedAt
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import java.time.LocalDateTime;

public record FilterTaskListResponse(
public record FilterRequestedTasksResponse(
Long taskId,
String taskCode,
LocalDateTime requestedAt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class FindTaskController {
@Operation(summary = "사용자 요청 작업 목록 조회")
@Secured({"ROLE_USER", "ROLE_MANAGER"})
@GetMapping("/requests")
public ResponseEntity<Page<FilterTaskListResponse>> findTasksRequestedByUser(
public ResponseEntity<Page<FilterRequestedTasksResponse>> findTasksRequestedByUser(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int pageSize,
@ModelAttribute FilterTaskListRequest filterTaskListRequest,
Expand Down Expand Up @@ -58,4 +58,16 @@ public ResponseEntity<Page<FilterPendingApprovalResponse>> findPendingApprovalTa
Pageable pageable = PageRequest.of(page, pageSize);
return ResponseEntity.ok(taskListUsecase.findPendingApprovalTasks(userInfo.getUserId(), pageable, filterTaskListRequest));
}

@Operation(summary = "전체 작업 목록 조회")
@Secured("ROLE_MANAGER")
@GetMapping
public ResponseEntity<Page<FilterAllTasksResponse>> findAllTasks(
@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.findAllTasks(userInfo.getUserId(), pageable, filterTaskListRequest));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package clap.server.adapter.outbound.persistense;


import clap.server.application.port.outbound.task.LoadTaskHistoryPort;
import clap.server.common.annotation.architecture.PersistenceAdapter;

import lombok.RequiredArgsConstructor;






@PersistenceAdapter
@RequiredArgsConstructor
public class TaskHistoryPersistenceAdapter implements LoadTaskHistoryPort {

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package clap.server.adapter.outbound.persistense;

import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse;
import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse;
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.FilterRequestedTasksResponse;
import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse;
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper;
Expand Down Expand Up @@ -43,10 +44,10 @@ public Optional<Task> findById(Long id) {
}

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

@Override
Expand All @@ -68,4 +69,10 @@ public List<Task> findYesterdayTaskByDate(LocalDateTime now) {
.stream().map(taskPersistenceMapper::toDomain).toList();
}

@Override
public Page<FilterAllTasksResponse> findAllTasks (Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
Page<Task> taskList = taskRepository.findAllTasks(pageable, filterTaskListRequest)
.map(taskPersistenceMapper::toDomain);
return taskList.map(TaskMapper::toFilterAllTasksResponse);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,6 @@ public class TaskEntity extends BaseTimeEntity {
@Column
private LocalDateTime dueDate;

@Column
private LocalDateTime completedAt;

@Column
private LocalDateTime finishedAt;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@

import clap.server.adapter.outbound.persistense.entity.member.MemberEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Embeddable
@AllArgsConstructor
@Builder
public class TaskModificationInfo {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "task_id")
Expand All @@ -18,7 +22,7 @@ public class TaskModificationInfo {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modified_member_id") //처리자가 바뀌는 경우
private MemberEntity member;
private MemberEntity modifiedMember;

@Column(name = "new_value")
private String newValue; //상태가 바뀌는 경우
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package clap.server.adapter.outbound.persistense.mapper;

import clap.server.adapter.outbound.persistense.entity.task.TaskHistoryEntity;
import clap.server.adapter.outbound.persistense.entity.task.TaskModificationInfo;
import clap.server.adapter.outbound.persistense.mapper.common.PersistenceMapper;
import clap.server.domain.model.task.TaskHistory;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

@Mapper(componentModel = "spring", uses = {CommentPersistenceMapper.class, TaskPersistenceMapper.class, MemberPersistenceMapper.class})
public interface TaskHistoryPersistenceMapper extends PersistenceMapper<TaskHistoryEntity, TaskHistory> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ public interface TaskCustomRepository {

Page<TaskEntity> findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
Page<TaskEntity> findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest);
Page<TaskEntity> findAllTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,18 @@ public Page<TaskEntity> findPendingApprovalTasks(Pageable pageable, FilterTaskLi
return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection());
}

@Override
public Page<TaskEntity> findAllTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
BooleanBuilder whereClause = createFilter(filterTaskListRequest);
if (!filterTaskListRequest.nickName().isEmpty()) {
whereClause.and(
taskEntity.requester.nickname.eq(filterTaskListRequest.nickName())
.or(taskEntity.processor.nickname.eq(filterTaskListRequest.nickName()))
);
}
return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection());
}

private BooleanBuilder createFilter(FilterTaskListRequest request) {
BooleanBuilder whereClause = new BooleanBuilder();
if (request.term() != null) {
Expand Down Expand Up @@ -87,7 +99,7 @@ private Page<TaskEntity> getTasksPage(Pageable pageable, BooleanBuilder whereCla
private OrderSpecifier<?> getOrderSpecifier(String sortBy, String sortDirection) {
DateTimePath<LocalDateTime> sortColumn = switch (sortBy) {
case "REQUESTED_AT" -> taskEntity.updatedAt;
case "FINISHED_AT" -> taskEntity.completedAt;
case "FINISHED_AT" -> taskEntity.finishedAt;
default -> taskEntity.updatedAt;
};
return "ASC".equalsIgnoreCase(sortDirection)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ List<TaskEntity> findYesterdayTaskByUpdatedAtIsBetween(
@Query("SELECT t FROM TaskEntity t " +
"WHERE t.processor.memberId = :processorId " +
"AND t.taskStatus IN :taskStatus " +
"AND (t.taskStatus != 'COMPLETED' OR t.completedAt >= :untilDate)")
"AND (t.taskStatus != 'COMPLETED' OR t.finishedAt >= :untilDate)")
Slice<TaskEntity> findTasksWithTaskStatusAndCompletedAt(
@Param("processorId") Long processorId,
@Param("taskStatus") List<TaskStatus> taskStatus,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package clap.server.application.Task;

import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse;
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.FilterRequestedTasksResponse;

import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse;
import clap.server.application.port.inbound.domain.MemberService;
Expand Down Expand Up @@ -29,7 +30,7 @@ public class FindTaskListService implements FindTaskListUsecase {


@Override
public Page<FilterTaskListResponse> findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
public Page<FilterRequestedTasksResponse> findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
Member requester = memberService.findActiveMember(requesterId);
return loadTaskPort.findTasksRequestedByUser(requester.getMemberId(), pageable, findTaskListRequest);
}
Expand All @@ -39,4 +40,10 @@ public Page<FilterPendingApprovalResponse> findPendingApprovalTasks(Long manager
memberService.findActiveMember(managerId);
return loadTaskPort.findPendingApprovalTasks(pageable, filterTaskListRequest);
}

@Override
public Page<FilterAllTasksResponse> findAllTasks(Long managerId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
memberService.findActiveMember(managerId);
return loadTaskPort.findAllTasks(pageable, filterTaskListRequest);
}
}
19 changes: 17 additions & 2 deletions src/main/java/clap/server/application/mapper/TaskMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public static UpdateTaskResponse toUpdateTaskResponse(Task task) {
return new UpdateTaskResponse(task.getTaskId(), task.getCategory().getCategoryId(), task.getTitle());
}

public static FilterTaskListResponse toFilterTaskListResponse(Task task) {
return new FilterTaskListResponse(
public static FilterRequestedTasksResponse toFilterRequestedTasksResponse(Task task) {
return new FilterRequestedTasksResponse(
task.getTaskId(),
task.getTaskCode(),
task.getUpdatedAt(),
Expand Down Expand Up @@ -94,6 +94,21 @@ public static ApprovalTaskResponse toApprovalTaskResponse(Task approvedTask) {
);
}

public static FilterAllTasksResponse toFilterAllTasksResponse(Task task) {
return new FilterAllTasksResponse(
task.getTaskId(),
task.getTaskCode(),
task.getUpdatedAt(),
task.getCategory().getMainCategory().getName(),
task.getCategory().getName(),
task.getTitle(),
task.getRequester().getMemberInfo().getNickname(),
task.getProcessor() != null ? task.getProcessor().getMemberInfo().getNickname() : "",
task.getTaskStatus(),
task.getFinishedAt() != null ? task.getFinishedAt() : null
);
}

public static TaskBoardResponse toSliceTaskItemResponse(Slice<Task> tasks) {
Map<TaskStatus, List<TaskItemResponse>> tasksByStatus =tasks.getContent().stream()
.map(TaskMapper::toTaskItemResponse)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package clap.server.application.port.inbound.task;

import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse;
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.FilterRequestedTasksResponse;
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<FilterTaskListResponse> findTasksRequestedByUser(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
Page<FilterRequestedTasksResponse> findTasksRequestedByUser(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest);

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

Page<FilterAllTasksResponse> findAllTasks(Long userId, Pageable pageable, FilterTaskListRequest filterTaskListRequest);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package clap.server.application.port.outbound.task;



public interface LoadTaskHistoryPort {
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package clap.server.application.port.outbound.task;

import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse;
import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse;
import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest;
import clap.server.adapter.inbound.web.dto.task.FilterTaskListResponse;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
import clap.server.adapter.inbound.web.dto.task.FilterRequestedTasksResponse;
import clap.server.domain.model.task.Task;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand All @@ -18,9 +19,11 @@ public interface LoadTaskPort {

List<Task> findYesterdayTaskByDate(LocalDateTime now);

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

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

Page<FilterAllTasksResponse> findAllTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest);

Slice<Task> findByProcessorAndStatus(Long processorId, List<TaskStatus> statuses, LocalDateTime untilDate, Pageable pageable);
}
16 changes: 10 additions & 6 deletions src/main/java/clap/server/domain/model/task/TaskHistory.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package clap.server.domain.model.task;

import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType;
import clap.server.domain.model.common.BaseTime;
import clap.server.domain.model.member.Member;
import clap.server.domain.model.member.MemberInfo;
import co.elastic.clients.elasticsearch.inference.TaskType;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -12,24 +16,24 @@
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TaskHistory extends BaseTime {
private Long historyId;
private Long taskHistoryId;
private TaskHistoryType type;
private TaskModificationInfo taskModificationInfo;
private Comment comment;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public static class TaskModificationInfo {
private Long taskId;
private Task task;
private String modifiedField;
private Long modifiedMemberId;
private Member modifiedMember;
private String newValue;

@Builder
public TaskModificationInfo(Long taskId, String modifiedField, Long modifiedMemberId, String newValue) {
this.taskId = taskId;
public TaskModificationInfo(Task task, String modifiedField, Member modifiedMember, String newValue) {
this.task = task;
this.modifiedField = modifiedField;
this.modifiedMemberId = modifiedMemberId;
this.modifiedMember = modifiedMember;
this.newValue = newValue;
}
}
Expand Down
Loading