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

import clap.server.domain.model.member.Member;

public record UpdateTaskProcessorRequest(
Long processorId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
@Schema(description = "작업 상태 변경 요청")
public record UpdateTaskStatusRequest(

@Schema(description = "변경하고 싶은 작업 상태", example = "완료")
@Schema(description = "변경하고 싶은 작업 상태", example = "COMPLETED")
@NotNull
TaskStatus taskStatus
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class ChangeTaskController {
private final ApprovalTaskUsecase approvalTaskUsecase;

@Operation(summary = "작업 상태 변경")
@Secured({"ROLE_MANGER"})
@Secured("ROLE_MANAGER")
@PatchMapping("/state/{taskId}")
public ResponseEntity<UpdateTaskResponse> updateTaskState(
@PathVariable @NotNull Long taskId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package clap.server.adapter.outbound.persistense;

import clap.server.application.port.outbound.task.LoadCommentPort;
import clap.server.application.port.outbound.taskhistory.LoadCommentPort;
import clap.server.domain.model.task.Comment;

import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
import clap.server.adapter.outbound.persistense.entity.task.TaskHistoryEntity;
import clap.server.adapter.outbound.persistense.mapper.TaskHistoryPersistenceMapper;
import clap.server.adapter.outbound.persistense.repository.task.TaskHistoryRepository;
import clap.server.application.port.outbound.task.LoadTaskHistoryPort;
import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort;
import clap.server.application.port.outbound.taskhistory.LoadTaskHistoryPort;
import clap.server.common.annotation.architecture.PersistenceAdapter;

import clap.server.domain.model.task.TaskHistory;
Expand All @@ -15,7 +16,7 @@

@PersistenceAdapter
@RequiredArgsConstructor
public class TaskHistoryPersistenceAdapter implements LoadTaskHistoryPort {
public class TaskHistoryPersistenceAdapter implements LoadTaskHistoryPort, CommandTaskHistoryPort {
private final TaskHistoryRepository taskHistoryRepository;
private final TaskHistoryPersistenceMapper taskHistoryPersistenceMapper;

Expand All @@ -26,4 +27,11 @@ public List<TaskHistory> findAllTaskHistoriesByTaskId(Long taskId) {
.map(taskHistoryPersistenceMapper::toDomain)
.toList();
}

@Override
public TaskHistory save(TaskHistory taskHistory) {
TaskHistoryEntity taskHistoryEntity = taskHistoryPersistenceMapper.toEntity(taskHistory);
TaskHistoryEntity savedTaskHistoryEntity = taskHistoryRepository.save(taskHistoryEntity);
return taskHistoryPersistenceMapper.toDomain(savedTaskHistoryEntity);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,10 @@ public class TaskModificationInfo {
@JoinColumn(name = "task_id")
private TaskEntity task;

@Column(name = "modified_field")
private String modifiedField; //TODO: 속성 필요성 검토

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modified_member_id")
private MemberEntity modifiedMember;

@Column(name = "new_value")
private String newValue; //TODO: 속성 필요성 검토
@JoinColumn(name = "modified_status")
private String modifiedStatus;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,6 @@ public enum TaskStatus {

private final String description;

@JsonCreator
public static TaskStatus fromDescription(String description) {
for (TaskStatus status : TaskStatus.values()) {
if (status.getDescription().equals(description)) {
return status;
}
}
throw new IllegalArgumentException("Unknown description: " + description);
}

public static List<TaskStatus> getTaskBoardStatusList() {
return List.of(
TaskStatus.IN_PROGRESS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List<TaskHistory
);
case STATUS_SWITCHED -> new FindTaskHistoryResponse.Details(
new FindTaskHistoryResponse.TaskDetails(
taskHistory.getTaskModificationInfo().getTask().getTaskStatus().getDescription()
taskHistory.getTaskModificationInfo().getModifiedStatus()
),
null,
null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package clap.server.application.port.outbound.task;
package clap.server.application.port.outbound.taskhistory;

import clap.server.domain.model.task.Comment;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package clap.server.application.port.outbound.taskhistory;

import clap.server.domain.model.task.TaskHistory;

public interface CommandTaskHistoryPort {
TaskHistory save(TaskHistory taskHistory);

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package clap.server.application.port.outbound.task;
package clap.server.application.port.outbound.taskhistory;

import clap.server.domain.model.task.Comment;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package clap.server.application.port.outbound.task;
package clap.server.application.port.outbound.taskhistory;


import clap.server.domain.model.task.TaskHistory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,21 @@
import clap.server.adapter.inbound.web.dto.task.ApprovalTaskRequest;
import clap.server.adapter.inbound.web.dto.task.ApprovalTaskResponse;
import clap.server.adapter.inbound.web.dto.task.FindApprovalFormResponse;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType;
import clap.server.application.mapper.TaskMapper;
import clap.server.application.port.inbound.domain.CategoryService;
import clap.server.application.port.inbound.domain.LabelService;
import clap.server.application.port.inbound.domain.MemberService;
import clap.server.application.port.inbound.domain.TaskService;
import clap.server.application.port.inbound.task.ApprovalTaskUsecase;
import clap.server.application.port.outbound.task.CommandTaskPort;
import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort;
import clap.server.common.annotation.architecture.ApplicationService;
import clap.server.domain.model.member.Member;
import clap.server.domain.model.task.Category;
import clap.server.domain.model.task.Label;
import clap.server.domain.model.task.Task;
import clap.server.domain.model.task.TaskHistory;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -28,6 +31,7 @@ public class ApprovalTaskService implements ApprovalTaskUsecase {
private final CategoryService categoryService;
private final LabelService labelService;
private final CommandTaskPort commandTaskPort;
private final CommandTaskHistoryPort commandTaskHistoryPort;

@Override
@Transactional
Expand All @@ -39,6 +43,8 @@ public ApprovalTaskResponse approvalTaskByReviewer(Long reviewerId, Long taskId,
Label label = labelService.findById(approvalTaskRequest.labelId());

task.approveTask(reviewer, processor, approvalTaskRequest.dueDate(), category, label);
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_ASSIGNED, task, null, processor,null);
commandTaskHistoryPort.save(taskHistory);
return TaskMapper.toApprovalTaskResponse(commandTaskPort.save(task));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import clap.server.application.port.inbound.task.FindTaskHistoriesUsecase;
import clap.server.application.port.outbound.task.LoadAttachmentPort;

import clap.server.application.port.outbound.task.LoadTaskHistoryPort;
import clap.server.application.port.outbound.taskhistory.LoadTaskHistoryPort;
import clap.server.application.port.outbound.task.LoadTaskPort;
import clap.server.common.annotation.architecture.ApplicationService;
import clap.server.domain.model.task.Attachment;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import clap.server.adapter.inbound.web.dto.task.*;
import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType;
import clap.server.application.mapper.AttachmentMapper;
import clap.server.application.mapper.TaskMapper;
import clap.server.application.port.inbound.domain.CategoryService;
Expand All @@ -15,13 +16,11 @@
import clap.server.application.port.outbound.task.CommandAttachmentPort;
import clap.server.application.port.outbound.task.CommandTaskPort;
import clap.server.application.port.outbound.task.LoadAttachmentPort;
import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort;
import clap.server.common.annotation.architecture.ApplicationService;
import clap.server.common.constants.FilePathConstants;
import clap.server.domain.model.member.Member;
import clap.server.domain.model.task.Attachment;
import clap.server.domain.model.task.Category;
import clap.server.domain.model.task.Label;
import clap.server.domain.model.task.Task;
import clap.server.domain.model.task.*;
import clap.server.exception.ApplicationException;
import clap.server.exception.code.TaskErrorCode;
import lombok.RequiredArgsConstructor;
Expand All @@ -45,6 +44,7 @@ public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUse
private final LoadAttachmentPort loadAttachmentPort;
private final LabelService labelService;
private final CommandAttachmentPort commandAttachmentPort;
private final CommandTaskHistoryPort commandTaskHistoryPort;
private final S3UploadAdapter s3UploadAdapter;

@Override
Expand All @@ -69,36 +69,35 @@ public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTask
memberService.findActiveMember(memberId);
Task task = taskService.findById(taskId);
task.updateTaskStatus(updateTaskStatusRequest.taskStatus());
Task updateTask = commandTaskPort.save(task);
return TaskMapper.toUpdateTaskResponse(updateTask);
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.STATUS_SWITCHED, task, task.getTaskStatus().getDescription(), null, null);
commandTaskHistoryPort.save(taskHistory);
return TaskMapper.toUpdateTaskResponse(commandTaskPort.save(task));

// TODO : 알림 생성 로직 및 푸시 알림 로직 추가
}

@Transactional
@Override
public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTaskProcessorRequest request) {
Member reviewer = memberService.findReviewer(userId);
memberService.findReviewer(userId);
Member processor = memberService.findById(request.processorId());

Task task = taskService.findById(taskId);
task.updateProcessor(processor);
Task updateTask = commandTaskPort.save(task);
return TaskMapper.toUpdateTaskResponse(updateTask);
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_CHANGED, task, null, processor, null);
commandTaskHistoryPort.save(taskHistory);
return TaskMapper.toUpdateTaskResponse(commandTaskPort.save(task));

// TODO : 알림 생성 로직 및 푸시 알림 로직 추가
}

@Transactional
@Override
public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request) {
Member reviewer = memberService.findReviewer(userId);
memberService.findReviewer(userId);
Task task = taskService.findById(taskId);
Label label = labelService.findById(request.labelId());

task.updateLabel(label);
Task updatetask = commandTaskPort.save(task);
return TaskMapper.toUpdateTaskResponse(updatetask);
return TaskMapper.toUpdateTaskResponse(commandTaskPort.save(task));
}

private void updateAttachments(List<Long> attachmentIdsToDelete, List<MultipartFile> files, Task task) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/clap/server/domain/model/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ public void updateLabel(Label label) {
}

public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) {
validateTaskRequested();
this.reviewer = reviewer;
this.processor = processor;
this.dueDate = dueDate;
Expand Down
35 changes: 19 additions & 16 deletions src/main/java/clap/server/domain/model/task/TaskHistory.java
Original file line number Diff line number Diff line change
@@ -1,15 +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;
import lombok.NoArgsConstructor;

import lombok.*;
import lombok.experimental.SuperBuilder;

@Getter
Expand All @@ -22,20 +18,27 @@ public class TaskHistory extends BaseTime {
private Comment comment;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public static class TaskModificationInfo {
private Task task;
private String modifiedField;
private Member modifiedMember;
private String newValue;
private String modifiedStatus;
}

@Builder
public TaskModificationInfo(Task task, String modifiedField, Member modifiedMember, String newValue) {
this.task = task;
this.modifiedField = modifiedField;
this.modifiedMember = modifiedMember;
this.newValue = newValue;
}
public static TaskHistory createTaskHistory(TaskHistoryType type, Task task, String statusDescription, Member member, Comment comment) {
return TaskHistory.builder()
.type(type)
.taskModificationInfo(
TaskModificationInfo.builder()
.task(task)
.modifiedMember(member)
.modifiedStatus(statusDescription)
.build()
)
.comment(comment)
.build();
}
}