Skip to content
Closed
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
Expand Up @@ -8,6 +8,7 @@
import clap.server.application.port.inbound.task.FilterTaskBoardUsecase;
import clap.server.application.port.inbound.task.UpdateTaskBoardUsecase;
import clap.server.application.port.inbound.task.GetTaskBoardUsecase;
import clap.server.application.port.inbound.task.UpdateTaskOrderAndStatusUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand Down Expand Up @@ -35,15 +36,16 @@ public class TaskBoardController {
private final GetTaskBoardUsecase getTaskBoardUsecase;
private final FilterTaskBoardUsecase filterTaskBoardUsecase;
private final UpdateTaskBoardUsecase updateTaskBoardUsecase;
private final UpdateTaskOrderAndStatusUsecase updateTaskOrderAndStatus;

@Operation(summary = "작업 보드 조회 API")
@Secured({"ROLE_MANAGER"})
@PostMapping
@GetMapping
public ResponseEntity<TaskBoardResponse> getTaskBoard(@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int pageSize,
@Parameter(description = "완료 일자 조회 기준, yyyy-mm-dd 형식으로 입력합니다.") @RequestParam(required = false)
@Parameter(description = "작업 완료 일자 조회 기준, yyyy-mm-dd 형식으로 입력합니다.") @RequestParam(required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate untilDate,
@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "필터링 조회 request") @RequestBody(required = false) FilterTaskBoardRequest request,
@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "필터링 조회 request") @ModelAttribute FilterTaskBoardRequest request,
@AuthenticationPrincipal SecurityUserDetails userInfo) {
Pageable pageable = PageRequest.of(page, pageSize);
if (request != null) {
Expand All @@ -62,7 +64,7 @@ public void updateTaskBoard(@Parameter(description = "전환될 작업의 상태
if (status == null) {
updateTaskBoardUsecase.updateTaskOrder(userInfo.getUserId(), request);
} else {
updateTaskBoardUsecase.updateTaskOrderAndStatus(userInfo.getUserId(), request, status);
updateTaskOrderAndStatus.updateTaskOrderAndStatus(userInfo.getUserId(), request, status);
}
}

Expand Down
12 changes: 0 additions & 12 deletions src/main/java/clap/server/application/mapper/AttachmentMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,6 @@ public static List<Attachment> toTaskAttachments(Task task, List<MultipartFile>
.toList();
}

public static List<Attachment> toCommentAttachments(Task task, Comment comment, List<MultipartFile> files, List<String> fileUrls) {
return IntStream.range(0, files.size())
.mapToObj(i -> createCommentAttachment(
task,
comment,
files.get(i).getOriginalFilename(),
fileUrls.get(i),
files.get(i).getSize()
))
.toList();
}


public static List<AttachmentResponse> toAttachmentResponseList(List<Attachment> attachments) {
return attachments.stream()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package clap.server.application.port.inbound.task;

import clap.server.adapter.inbound.web.dto.task.request.UpdateTaskOrderRequest;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;

public interface UpdateTaskBoardUsecase {
void updateTaskOrder(Long processorId, UpdateTaskOrderRequest request);
void updateTaskOrderAndStatus(Long processorId, UpdateTaskOrderRequest request, TaskStatus status);
}
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.request.UpdateTaskOrderRequest;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;

public interface UpdateTaskOrderAndStatusUsecase {
void updateTaskOrderAndStatus(Long processorId, UpdateTaskOrderRequest request, TaskStatus status);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
import clap.server.domain.model.member.Member;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.function.Function;

@RequiredArgsConstructor
@Component
@Service
@Slf4j
class ManageTokenService {
private final JwtProvider accessTokenProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
package clap.server.application.service.comment;

import clap.server.adapter.inbound.web.dto.task.PostAndEditCommentRequest;
import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter;
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.application.mapper.AttachmentMapper;
import clap.server.application.port.inbound.comment.PostCommentUsecase;
import clap.server.application.port.inbound.domain.MemberService;
import clap.server.application.port.inbound.domain.TaskService;
import clap.server.application.port.outbound.s3.S3UploadPort;
import clap.server.application.port.outbound.task.CommandAttachmentPort;
import clap.server.application.port.outbound.task.CommandCommentPort;
import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort;
import clap.server.application.service.webhook.SendPushNotificationService;
import clap.server.application.service.webhook.SendNotificationService;
import clap.server.common.annotation.architecture.ApplicationService;
import clap.server.common.constants.FilePathConstants;
import clap.server.domain.model.member.Member;
Expand All @@ -24,21 +23,17 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;


@ApplicationService
@RequiredArgsConstructor
public class PostCommentService implements PostCommentUsecase {

private final MemberService memberService;
private final TaskService taskService;
private final CommandCommentPort commandCommentPort;
private final S3UploadAdapter s3UploadAdapter;
private final S3UploadPort s3UploadPort;
private final CommandAttachmentPort commandAttachmentPort;
private final CommandTaskHistoryPort commandTaskHistoryPort;
private final SendPushNotificationService sendPushNotificationService;
private final SendNotificationService sendNotificationService;

@Transactional
@Override
Expand All @@ -57,8 +52,7 @@ public void save(Long userId, Long taskId, PostAndEditCommentRequest request) {

if (member.getMemberInfo().getRole() == MemberRole.ROLE_USER) {
publishNotification(task.getProcessor(), task, comment.getContent(), member.getNickname());
}
else {
} else {
publishNotification(task.getRequester(), task, comment.getContent(), task.getProcessor().getNickname());
}
}
Expand All @@ -73,29 +67,27 @@ public void saveCommentAttachment(Long userId, Long taskId, MultipartFile file)
if (Member.checkCommenter(task, member)) {
Comment comment = Comment.createComment(member, task, null);
Comment savedComment = commandCommentPort.saveComment(comment);
List<MultipartFile> files = new ArrayList<>();
files.add(file);
saveAttachment(files, task, savedComment);
saveAttachment(file, task, savedComment);

TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.COMMENT_FILE, task, null, member, savedComment);
commandTaskHistoryPort.save(taskHistory);

if (member.getMemberInfo().getRole() == MemberRole.ROLE_USER) {
publishNotification(task.getProcessor(), task, "첨부파일", member.getNickname());
}
else {
} else {
publishNotification(task.getRequester(), task, "첨부파일", task.getProcessor().getNickname());
}
}
}

private void saveAttachment(List<MultipartFile> files, Task task, Comment comment) {
List<String> fileUrls = s3UploadAdapter.uploadFiles(FilePathConstants.TASK_IMAGE, files);
List<Attachment> attachments = AttachmentMapper.toCommentAttachments(task, comment, files, fileUrls);
commandAttachmentPort.saveAll(attachments);
private void saveAttachment(MultipartFile file, Task task, Comment comment) {
String fileUrl = s3UploadPort.uploadSingleFile(FilePathConstants.TASK_COMMENT, file);
Attachment attachment = Attachment.createCommentAttachment(task, comment, file.getOriginalFilename(), fileUrl, file.getSize());
commandAttachmentPort.save(attachment);
}

private void publishNotification(Member receiver, Task task, String message, String commenterName){
sendPushNotificationService.sendPushNotification(receiver, NotificationType.COMMENT, task, message, commenterName);
private void publishNotification(Member receiver, Task task, String message, String commenterName) {
sendNotificationService.sendPushNotification(receiver, NotificationType.COMMENT, task, message, commenterName);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,19 @@
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.application.service.webhook.SendPushNotificationService;
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.Category;
import clap.server.domain.model.task.Label;
import clap.server.domain.model.task.Task;
import clap.server.domain.model.task.TaskHistory;
import clap.server.domain.policy.task.RequestedTaskUpdatePolicy;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;


@ApplicationService
@RequiredArgsConstructor
@Transactional(readOnly = true)
Expand All @@ -37,8 +36,9 @@ public class ApprovalTaskService implements ApprovalTaskUsecase {
private final CategoryService categoryService;
private final LabelService labelService;
private final CommandTaskPort commandTaskPort;
private final RequestedTaskUpdatePolicy requestedTaskUpdatePolicy;
private final CommandTaskHistoryPort commandTaskHistoryPort;
private final SendPushNotificationService sendPushNotificationService;
private final SendNotificationService sendNotificationService;

@Override
@Transactional
Expand All @@ -49,31 +49,30 @@ public ApprovalTaskResponse approvalTaskByReviewer(Long reviewerId, Long taskId,
Category category = categoryService.findById(approvalTaskRequest.categoryId());
Label label = labelService.findById(approvalTaskRequest.labelId());

requestedTaskUpdatePolicy.validateTaskRequested(task);
task.approveTask(reviewer, processor, approvalTaskRequest.dueDate(), category, label);
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_ASSIGNED, task, null, processor,null);
commandTaskHistoryPort.save(taskHistory);

List<Member> receivers = new ArrayList<>();
receivers.add(task.getRequester());
receivers.add(task.getProcessor());

List<Member> receivers = List.of(reviewer, processor);
publishNotification(receivers, task);

return TaskMapper.toApprovalTaskResponse(commandTaskPort.save(task));
}

@Override
public FindApprovalFormResponse findApprovalForm(Long managerId, Long taskId) {
memberService.findActiveMember(managerId);
Task task = taskService.findById(taskId);
task.validateTaskRequested();
requestedTaskUpdatePolicy.validateTaskRequested(task);
return TaskMapper.toFindApprovalFormResponse(task);
}

private void publishNotification(List<Member> receivers, Task task){
for (Member receiver : receivers) {

sendPushNotificationService.sendPushNotification(receiver, NotificationType.PROCESSOR_ASSIGNED,
receivers.forEach(receiver -> {
sendNotificationService.sendPushNotification(receiver, NotificationType.PROCESSOR_ASSIGNED,
task, task.getProcessor().getNickname(), null);
}
});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,30 @@

import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest;
import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse;

import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter;
import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType;
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.task.CreateTaskUsecase;
import clap.server.application.port.outbound.s3.S3UploadPort;
import clap.server.application.port.outbound.task.CommandAttachmentPort;
import clap.server.application.port.outbound.task.CommandTaskPort;

import clap.server.application.service.webhook.SendPushNotificationService;
import clap.server.application.service.webhook.SendNotificationService;
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.common.constants.FilePathConstants;
import clap.server.domain.model.task.Task;
import lombok.RequiredArgsConstructor;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;


@ApplicationService
@RequiredArgsConstructor
public class CreateTaskService implements CreateTaskUsecase {
Expand All @@ -36,9 +34,8 @@ public class CreateTaskService implements CreateTaskUsecase {
private final CategoryService categoryService;
private final CommandTaskPort commandTaskPort;
private final CommandAttachmentPort commandAttachmentPort;
private final S3UploadAdapter s3UploadAdapter;
private final SendPushNotificationService sendPushNotificationService;
private final ApplicationEventPublisher applicationEventPublisher;
private final S3UploadPort s3UploadPort;
private final SendNotificationService sendNotificationService;

@Override
@Transactional
Expand All @@ -51,29 +48,21 @@ public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createT
commandTaskPort.save(savedTask);

if (files != null) {
saveAttachments(files, savedTask);
}

saveAttachments(files, savedTask);}
publishNotification(savedTask);
return TaskMapper.toCreateTaskResponse(savedTask);
}

private void saveAttachments(List<MultipartFile> files, Task task) {
List<String> fileUrls = s3UploadAdapter.uploadFiles(FilePathConstants.TASK_IMAGE, files);
List<String> fileUrls = s3UploadPort.uploadFiles(FilePathConstants.TASK_IMAGE, files);
List<Attachment> attachments = AttachmentMapper.toTaskAttachments(task, files, fileUrls);
commandAttachmentPort.saveAll(attachments);
}

private void publishNotification(Task task) {
List<Member> reviewers = memberService.findReviewers();
reviewers.forEach(reviewer -> {sendNotificationService.sendPushNotification(reviewer, NotificationType.TASK_REQUESTED,
task, null, null);});

// 검토자들 각각에 대한 알림 생성 후 event 발행
for (Member reviewer : reviewers) {

sendPushNotificationService.sendPushNotification(reviewer, NotificationType.TASK_REQUESTED,
task, null, null);
}
}


}
Loading