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

import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;

@Schema(description = "작업 상태 변경 요청")
public record UpdateTaskStateRequest(

@Schema(description = "변경하고 싶은 작업 상태", example = "완료")
@NotNull
TaskStatus taskStatus
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import clap.server.adapter.inbound.web.dto.task.*;
import clap.server.application.port.inbound.task.ApprovalTaskUsecase;
import clap.server.application.port.inbound.task.CreateTaskUsecase;
import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase;
import clap.server.application.port.inbound.task.UpdateTaskUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
Expand All @@ -30,6 +31,7 @@ public class ManagementTaskController {

private final CreateTaskUsecase createTaskUsecase;
private final UpdateTaskUsecase updateTaskUsecase;
private final UpdateTaskStatusUsecase updateTaskStatusUsecase;
private final ApprovalTaskUsecase approvalTaskUsecase;

@Operation(summary = "작업 요청 생성")
Expand All @@ -54,6 +56,17 @@ public ResponseEntity<UpdateTaskResponse> updateTask(
return ResponseEntity.ok(updateTaskUsecase.updateTask(userInfo.getUserId(), taskId, updateTaskRequest, attachments));
}

@Operation(summary = "작업 상태 변경")
@Secured({"ROLE_MANGER"})
@PatchMapping("/state/{taskId}")
public ResponseEntity<UpdateTaskResponse> updateTaskState(
@PathVariable @NotNull Long taskId,
@AuthenticationPrincipal SecurityUserDetails userInfo,
@RequestBody UpdateTaskStateRequest updateTaskStateRequest) {

return ResponseEntity.ok(updateTaskStatusUsecase.updateTaskState(userInfo.getUserId(), taskId, updateTaskStateRequest));
}

@Operation(summary = "작업 승인")
@Secured({"ROLE_MANAGER"})
@PostMapping("/approval/{taskId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskStateRequest;
import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
import clap.server.application.mapper.AttachmentMapper;
import clap.server.application.mapper.TaskMapper;
import clap.server.application.port.inbound.domain.CategoryService;
import clap.server.application.port.inbound.domain.MemberService;
import clap.server.application.port.inbound.domain.TaskService;
import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase;
import clap.server.application.port.inbound.task.UpdateTaskUsecase;
import clap.server.application.port.outbound.task.CommandAttachmentPort;
import clap.server.application.port.outbound.task.CommandTaskPort;
Expand All @@ -34,7 +36,7 @@
@ApplicationService
@RequiredArgsConstructor
@Slf4j
public class UpdateTaskService implements UpdateTaskUsecase {
public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase {

private final MemberService memberService;
private final CategoryService categoryService;
Expand Down Expand Up @@ -62,6 +64,18 @@ public UpdateTaskResponse updateTask(Long requesterId, Long taskId, UpdateTaskRe
return TaskMapper.toUpdateTaskResponse(updatedTask);
}

@Override
@Transactional
public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStateRequest updateTaskStateRequest) {
memberService.findActiveMember(memberId);
Task task = taskService.findById(taskId);
task.updateTaskStatus(updateTaskStateRequest.taskStatus());
Task updateTask = commandTaskPort.save(task);
return TaskMapper.toUpdateTaskResponse(updateTask);

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

private void updateAttachments(List<Long> attachmentIdsToDelete, List<MultipartFile> files, Task task) {
validateAttachments(attachmentIdsToDelete, task);
commandAttachmentPort.deleteByIds(attachmentIdsToDelete);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package clap.server.application.port.inbound.task;

import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskStateRequest;

public interface UpdateTaskStatusUsecase {
UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStateRequest updateTaskStateRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskStateRequest;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/clap/server/domain/model/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class Task extends BaseTime {
private Category category;
private Member requester;
private TaskStatus taskStatus;
private int processorOrder;
private long processorOrder;
private Member processor;
private Label label;
private Member reviewer;
Expand All @@ -50,6 +50,16 @@ public void updateTask(Category category, String title, String description) {
this.taskCode = toTaskCode(category);
}

public void setInitialProcessorOrder() {
if(this.processor == null) {
this.processorOrder = this.taskId * 128L;
}
}

public void updateTaskStatus(TaskStatus status) {
this.taskStatus = status;
}

public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) {
this.reviewer = reviewer;
this.processor = processor;
Expand Down
Loading