Skip to content

Commit ce3b769

Browse files
committed
CLAP-119 Feat: 작업 승인 처리
1 parent 0408482 commit ce3b769

File tree

21 files changed

+232
-43
lines changed

21 files changed

+232
-43
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package clap.server.adapter.inbound.web.dto.task;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
import java.time.LocalDateTime;
6+
7+
public record ApprovalTaskRequest(
8+
@NotNull
9+
Long taskId,
10+
@NotNull
11+
Long mainCategoryId,
12+
@NotNull
13+
Long categoryId,
14+
@NotNull
15+
Long processorId,
16+
@NotNull
17+
LocalDateTime dueDate,
18+
@NotNull
19+
Long labelId
20+
21+
) {
22+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package clap.server.adapter.inbound.web.dto.task;
2+
3+
import clap.server.adapter.outbound.persistense.entity.task.constant.LabelType;
4+
5+
import java.time.LocalDateTime;
6+
7+
public record ApprovalTaskResponse(
8+
Long taskId,
9+
String processorName,
10+
String reviewerName,
11+
LocalDateTime deadLine,
12+
LabelType labelName
13+
) {
14+
}

src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public record FilterTaskListRequest(
3232
@NotNull
3333
List<TaskStatus> taskStatus,
3434

35-
@Schema(description = "정렬 기준", implementation = OrderRequest.class)
35+
@Schema(description = "정렬 기준", implementation = OrderTaskRequest.class)
3636
@NotNull
37-
OrderRequest orderRequest
37+
OrderTaskRequest orderRequest
3838
) {
3939
}

src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java renamed to src/main/java/clap/server/adapter/inbound/web/dto/task/OrderTaskRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.swagger.v3.oas.annotations.media.Schema;
44

5-
public record OrderRequest(
5+
public record OrderTaskRequest(
66
@Schema(description = "정렬 기준", example = "REQUESTED_AT")
77
String sortBy,
88

src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class FindTaskController {
2727
private final FindTaskListUsecase taskListUsecase;
2828

2929
@Operation(summary = "사용자 요청 작업 목록 조회")
30-
@Secured({"ROLE_USER"})
30+
@Secured({"ROLE_USER", "ROLE_MANAGER"})
3131
@GetMapping("/requests")
3232
public ResponseEntity<Page<FilterTaskListResponse>> findTasksRequestedByUser(
3333
@RequestParam(defaultValue = "0") int page,

src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package clap.server.adapter.inbound.web.task;
22

33
import clap.server.adapter.inbound.security.SecurityUserDetails;
4-
import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest;
5-
import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse;
6-
import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest;
7-
import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse;
4+
import clap.server.adapter.inbound.web.dto.task.*;
5+
import clap.server.application.port.inbound.task.ApprovalTaskUsecase;
86
import clap.server.application.port.inbound.task.CreateTaskUsecase;
97
import clap.server.application.port.inbound.task.UpdateTaskUsecase;
108
import clap.server.common.annotation.architecture.WebAdapter;
@@ -13,6 +11,7 @@
1311
import jakarta.validation.Valid;
1412
import lombok.RequiredArgsConstructor;
1513
import org.springframework.http.ResponseEntity;
14+
import org.springframework.security.access.annotation.Secured;
1615
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1716
import org.springframework.web.bind.annotation.*;
1817

@@ -26,6 +25,7 @@ public class ManagementTaskController {
2625

2726
private final CreateTaskUsecase createTaskUsecase;
2827
private final UpdateTaskUsecase updateTaskUsecase;
28+
private final ApprovalTaskUsecase approvalTaskUsecase;
2929

3030
@Operation(summary = "작업 요청 생성")
3131
@PostMapping
@@ -42,4 +42,13 @@ public ResponseEntity<UpdateTaskResponse> updateTask(
4242
@AuthenticationPrincipal SecurityUserDetails userInfo){
4343
return ResponseEntity.ok(updateTaskUsecase.updateTask(userInfo.getUserId(), updateTaskRequest));
4444
}
45+
46+
@Operation(summary = "작업 승인")
47+
@Secured({"ROLE_MANAGER"})
48+
@PostMapping("/approval")
49+
public ResponseEntity<ApprovalTaskResponse> approvalTask(
50+
@RequestBody @Valid ApprovalTaskRequest approvalTaskRequest,
51+
@AuthenticationPrincipal SecurityUserDetails userInfo){
52+
return ResponseEntity.ok(approvalTaskUsecase.approvalTaskByReviewer(userInfo.getUserId(), approvalTaskRequest));
53+
}
4554
}

src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,5 @@ public List<Task> findTasksByMemberIdAndStatus(Long memberId, List<TaskStatus> t
8585
.map(taskPersistenceMapper::toDomain)
8686
.collect(Collectors.toList());
8787
}
88-
8988
}
9089

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package clap.server.adapter.outbound.persistense.repository;
2+
3+
import clap.server.adapter.outbound.persistense.entity.task.LabelEntity;
4+
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
5+
import clap.server.adapter.outbound.persistense.mapper.LabelPersistenceMapper;
6+
import clap.server.adapter.outbound.persistense.repository.task.LabelRepository;
7+
import clap.server.application.port.outbound.task.LoadLabelPort;
8+
import clap.server.common.annotation.architecture.PersistenceAdapter;
9+
import clap.server.domain.model.task.Label;
10+
import lombok.RequiredArgsConstructor;
11+
12+
import java.util.Optional;
13+
14+
@PersistenceAdapter
15+
@RequiredArgsConstructor
16+
public class LabelPersistenceAdapter implements LoadLabelPort {
17+
18+
private final LabelRepository labelRepository;
19+
private final LabelPersistenceMapper labelPersistenceMapper;
20+
21+
@Override
22+
public Optional<Label> findById(Long id) {
23+
Optional<LabelEntity> labelEntity = labelRepository.findById(id);
24+
return labelEntity.map(labelPersistenceMapper::toDomain);
25+
}
26+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package clap.server.application.Task;
2+
3+
import clap.server.adapter.inbound.web.dto.task.ApprovalTaskRequest;
4+
import clap.server.adapter.inbound.web.dto.task.ApprovalTaskResponse;
5+
import clap.server.application.mapper.TaskMapper;
6+
import clap.server.application.port.inbound.domain.CategoryService;
7+
import clap.server.application.port.inbound.domain.LabelService;
8+
import clap.server.application.port.inbound.domain.MemberService;
9+
import clap.server.application.port.inbound.domain.TaskService;
10+
import clap.server.application.port.inbound.task.ApprovalTaskUsecase;
11+
import clap.server.application.port.outbound.task.CommandTaskPort;
12+
import clap.server.common.annotation.architecture.ApplicationService;
13+
import clap.server.domain.model.member.Member;
14+
import clap.server.domain.model.task.Category;
15+
import clap.server.domain.model.task.Label;
16+
import clap.server.domain.model.task.Task;
17+
import clap.server.exception.ApplicationException;
18+
import clap.server.exception.code.MemberErrorCode;
19+
import clap.server.exception.code.TaskErrorCode;
20+
import lombok.RequiredArgsConstructor;
21+
import org.springframework.transaction.annotation.Transactional;
22+
23+
@ApplicationService
24+
@RequiredArgsConstructor
25+
public class ApprovalTaskService implements ApprovalTaskUsecase {
26+
27+
private final MemberService memberService;
28+
private final TaskService taskService;
29+
private final CategoryService categoryService;
30+
private final LabelService labelService;
31+
private final CommandTaskPort commandTaskPort;
32+
33+
@Override
34+
@Transactional
35+
public ApprovalTaskResponse approvalTaskByReviewer(Long reviewerId, ApprovalTaskRequest approvalTaskRequest) {
36+
Member reviewer = memberService.findActiveMember(reviewerId);
37+
if (!reviewer.isReviewer()) {
38+
throw new ApplicationException(MemberErrorCode.NOT_A_REVIEWER);
39+
}
40+
Task task = taskService.findById(approvalTaskRequest.taskId());
41+
Member processor = memberService.findById(approvalTaskRequest.processorId());
42+
Category mainCategory = categoryService.findById(approvalTaskRequest.mainCategoryId());
43+
Category category = categoryService.findById(approvalTaskRequest.categoryId());
44+
Label label = labelService.findById(approvalTaskRequest.labelId());
45+
46+
task.approveTask(reviewer, processor, approvalTaskRequest.dueDate(),mainCategory, category, label);
47+
return TaskMapper.toApprovalTaskResponse(commandTaskPort.save(task));
48+
}
49+
}

src/main/java/clap/server/application/Task/CreateTaskService.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest;
44
import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse;
55

6-
import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType;
76
import clap.server.application.mapper.TaskMapper;
87
import clap.server.application.port.inbound.domain.CategoryService;
98
import clap.server.application.port.inbound.domain.MemberService;
@@ -13,13 +12,11 @@
1312

1413
import clap.server.common.annotation.architecture.ApplicationService;
1514
import clap.server.domain.model.member.Member;
16-
import clap.server.domain.model.notification.Notification;
1715
import clap.server.domain.model.task.Attachment;
1816
import clap.server.domain.model.task.Category;
1917
import clap.server.domain.model.task.Task;
2018
import lombok.RequiredArgsConstructor;
2119

22-
import org.springframework.context.ApplicationEventPublisher;
2320
import org.springframework.transaction.annotation.Transactional;
2421

2522
import java.util.List;

0 commit comments

Comments
 (0)