-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathUpdateTaskService.java
More file actions
96 lines (77 loc) · 4.51 KB
/
UpdateTaskService.java
File metadata and controls
96 lines (77 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package clap.server.application.service.task;
import clap.server.adapter.inbound.web.dto.task.request.UpdateTaskProcessorRequest;
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
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.outbound.taskhistory.CommandTaskHistoryPort;
import clap.server.application.service.webhook.SendNotificationService;
import clap.server.common.annotation.architecture.ApplicationService;
import clap.server.domain.model.member.Member;
import clap.server.domain.model.task.Task;
import clap.server.domain.model.task.TaskHistory;
import clap.server.exception.ApplicationException;
import clap.server.exception.code.TaskErrorCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import static clap.server.domain.policy.task.TaskPolicyConstants.REMAINING_TASK_STATUS;
import static clap.server.domain.policy.task.TaskPolicyConstants.TASK_UPDATABLE_STATUS;
@ApplicationService
@RequiredArgsConstructor
@Slf4j
public class UpdateTaskService implements UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase {
private final MemberService memberService;
private final TaskService taskService;
private final SendNotificationService sendNotificationService;
private final UpdateProcessorTaskCountService updateProcessorTaskCountService;
private final CommandTaskHistoryPort commandTaskHistoryPort;
@Override
@Transactional
public void updateTaskStatus(Long memberId, Long taskId, TaskStatus targetTaskStatus) {
memberService.findActiveMember(memberId);
Task task = taskService.findById(taskId);
if (!TASK_UPDATABLE_STATUS.contains(targetTaskStatus)) {
throw new ApplicationException(TaskErrorCode.TASK_STATUS_NOT_ALLOWED);
}
if (!task.getTaskStatus().equals(targetTaskStatus)) {
updateProcessorTaskCountService.handleTaskStatusChange(task.getProcessor(), task.getTaskStatus(), targetTaskStatus);
task.updateTaskStatus(targetTaskStatus);
Task updatedTask = taskService.upsert(task);
saveTaskHistory(TaskHistory.createTaskHistory(TaskHistoryType.STATUS_SWITCHED, task, targetTaskStatus.getDescription(), null, null));
List<Member> receivers = List.of(task.getRequester());
publishNotification(receivers, updatedTask, NotificationType.STATUS_SWITCHED, targetTaskStatus.getDescription());
}
}
@Transactional
@Override
public void updateTaskProcessor(Long taskId, Long memberId, UpdateTaskProcessorRequest request) {
memberService.findActiveMember(memberId);
Task task = taskService.findById(taskId);
Member processor = memberService.findActiveMember(request.processorId());
if (REMAINING_TASK_STATUS.contains(task.getTaskStatus())) {
updateProcessorTaskCountService.handleProcessorChange(task.getProcessor(), processor, task.getTaskStatus());
}
task.updateProcessor(processor);
Task updatedTask = taskService.upsert(task);
saveTaskHistory(TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_CHANGED, task, null, processor, null));
List<Member> receivers = List.of(updatedTask.getRequester());
publishNotification(receivers, updatedTask, NotificationType.PROCESSOR_CHANGED, processor.getNickname());
}
private void saveTaskHistory(TaskHistory taskHistory) {
commandTaskHistoryPort.save(taskHistory);
}
private void publishNotification(List<Member> receivers, Task task, NotificationType notificationType, String message) {
receivers.forEach(receiver -> {
boolean isManager = receiver.getMemberInfo().getRole() == MemberRole.ROLE_MANAGER;
sendNotificationService.sendPushNotification(receiver, notificationType,
task, message, null, null, isManager);
});
sendNotificationService.sendAgitNotification(notificationType, task, message, null);
}
}