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

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

public record UpdateTaskProcessorRequest(
Long processorId
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import jakarta.validation.constraints.NotNull;

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

@Schema(description = "변경하고 싶은 작업 상태", example = "완료")
@NotNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import clap.server.adapter.inbound.security.SecurityUserDetails;
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.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest;
import clap.server.application.port.inbound.task.*;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -32,6 +30,7 @@ public class ManagementTaskController {
private final CreateTaskUsecase createTaskUsecase;
private final UpdateTaskUsecase updateTaskUsecase;
private final UpdateTaskStatusUsecase updateTaskStatusUsecase;
private final UpdateTaskProcessorUsecase updateTaskProcessorUsecase;
private final ApprovalTaskUsecase approvalTaskUsecase;

@Operation(summary = "작업 요청 생성")
Expand Down Expand Up @@ -62,9 +61,19 @@ public ResponseEntity<UpdateTaskResponse> updateTask(
public ResponseEntity<UpdateTaskResponse> updateTaskState(
@PathVariable @NotNull Long taskId,
@AuthenticationPrincipal SecurityUserDetails userInfo,
@RequestBody UpdateTaskStateRequest updateTaskStateRequest) {
@RequestBody UpdateTaskStatusRequest updateTaskStatusRequest) {

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

@Operation(summary = "작업 처리자 변경")
@Secured({"ROLE_MANAGER"})
@PatchMapping("/processor/{taskId}")
public ResponseEntity<UpdateTaskResponse> updateTaskProcessor(
@PathVariable Long taskId,
@AuthenticationPrincipal SecurityUserDetails userInfo,
@RequestBody UpdateTaskProcessorRequest updateTaskProcessorRequest) {
return ResponseEntity.ok(updateTaskProcessorUsecase.updateTaskProcessor(taskId, userInfo.getUserId(), updateTaskProcessorRequest));
}

@Operation(summary = "작업 승인")
Expand Down
28 changes: 23 additions & 5 deletions src/main/java/clap/server/application/Task/UpdateTaskService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +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.inbound.web.dto.task.UpdateTaskStatusRequest;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest;
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.UpdateTaskProcessorUsecase;
import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase;
import clap.server.application.port.inbound.task.UpdateTaskUsecase;
import clap.server.application.port.outbound.task.CommandAttachmentPort;
Expand All @@ -23,6 +24,7 @@
import clap.server.domain.model.task.Task;

import clap.server.exception.ApplicationException;
import clap.server.exception.code.MemberErrorCode;
import clap.server.exception.code.TaskErrorCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -36,7 +38,7 @@
@ApplicationService
@RequiredArgsConstructor
@Slf4j
public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase {
public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase {

private final MemberService memberService;
private final CategoryService categoryService;
Expand Down Expand Up @@ -68,10 +70,26 @@ public UpdateTaskResponse updateTask(Long requesterId, Long taskId, UpdateTaskRe

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

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

@Transactional
@Override
public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTaskProcessorRequest request) {
Member reviewer = memberService.findActiveMember(userId);
Member processor = memberService.findById(request.processorId());
if (!reviewer.isReviewer()) {
throw new ApplicationException(MemberErrorCode.NOT_A_REVIEWER);
}
Task task = taskService.findById(taskId);
task.updateProcessor(processor);
Task updateTask = commandTaskPort.save(task);
return TaskMapper.toUpdateTaskResponse(updateTask);

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.UpdateTaskProcessorRequest;

public interface UpdateTaskProcessorUsecase {
UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTaskProcessorRequest request);
}
Original file line number Diff line number Diff line change
@@ -1,8 +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;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskStatusRequest;

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

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
4 changes: 4 additions & 0 deletions src/main/java/clap/server/domain/model/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ public void updateTaskStatus(TaskStatus status) {
this.taskStatus = status;
}

public void updateProcessor(Member processor) {
this.processor = processor;
}

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