From edf5c3c02e9842e47d0c77343f1b595251d43cb5 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Thu, 23 Jan 2025 13:52:23 +0900 Subject: [PATCH 1/2] =?UTF-8?q?CLAP-58=20Feat:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/task/AttachmentRequest.java | 7 +++ .../web/dto/task/AttachmentResponse.java | 1 + ....java => CreateAndUpdateTaskResponse.java} | 4 +- .../web/dto/task/UpdateTaskRequest.java | 20 +++++++ .../web/task/CreateTaskController.java | 27 --------- ...ontroller.java => FindTaskController.java} | 18 ++++-- .../web/task/FindTaskDetailsController.java | 26 -------- .../web/task/ManagementTaskController.java | 36 +++++++++++ .../AttachmentPersistenceAdapter.java | 5 ++ .../entity/task/AttachmentEntity.java | 6 +- .../repository/task/AttachmentRepository.java | 2 + .../application/Task/CreateTaskService.java | 9 ++- .../Task/FindTaskDetailsService.java | 2 +- .../application/Task/UpdateTaskService.java | 59 +++++++++++++++++++ .../application/mapper/AttachmentMapper.java | 26 +++++++- .../server/application/mapper/TaskMapper.java | 27 +++++++-- .../port/inbound/domain/TaskService.java | 20 +++++++ .../port/inbound/task/CreateTaskUsecase.java | 4 +- .../port/inbound/task/UpdateTaskUsecase.java | 9 +++ .../outbound/task/CommandAttachmentPort.java | 1 + src/main/resources/mysql.yml | 2 +- 21 files changed, 234 insertions(+), 77 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentRequest.java rename src/main/java/clap/server/adapter/inbound/web/dto/task/{CreateTaskResponse.java => CreateAndUpdateTaskResponse.java} (73%) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskRequest.java delete mode 100644 src/main/java/clap/server/adapter/inbound/web/task/CreateTaskController.java rename src/main/java/clap/server/adapter/inbound/web/task/{FindTaskListController.java => FindTaskController.java} (70%) delete mode 100644 src/main/java/clap/server/adapter/inbound/web/task/FindTaskDetailsController.java create mode 100644 src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java create mode 100644 src/main/java/clap/server/application/Task/UpdateTaskService.java create mode 100644 src/main/java/clap/server/application/port/inbound/domain/TaskService.java create mode 100644 src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentRequest.java new file mode 100644 index 00000000..52c1d9c6 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentRequest.java @@ -0,0 +1,7 @@ +package clap.server.adapter.inbound.web.dto.task; + + +public record AttachmentRequest( + Long fileId, + String fileUrl) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentResponse.java index d2212586..12039463 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/AttachmentResponse.java @@ -3,6 +3,7 @@ import java.time.LocalDateTime; public record AttachmentResponse( + Long fileId, String fileName, String fileSize, String fileUrl, diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/CreateTaskResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/CreateAndUpdateTaskResponse.java similarity index 73% rename from src/main/java/clap/server/adapter/inbound/web/dto/task/CreateTaskResponse.java rename to src/main/java/clap/server/adapter/inbound/web/dto/task/CreateAndUpdateTaskResponse.java index 1c7d2843..bb923fd8 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/CreateTaskResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/CreateAndUpdateTaskResponse.java @@ -1,6 +1,8 @@ package clap.server.adapter.inbound.web.dto.task; -public record CreateTaskResponse( + + +public record CreateAndUpdateTaskResponse( Long taskId, Long categoryId, String title diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskRequest.java new file mode 100644 index 00000000..f9dbfeeb --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskRequest.java @@ -0,0 +1,20 @@ +package clap.server.adapter.inbound.web.dto.task; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.util.List; + +public record UpdateTaskRequest( + @NotNull + Long taskId, + @NotNull + Long categoryId, + @NotNull + Long mainCategoryId, + @NotBlank + String title, + String description, + List attachmentRequests +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/task/CreateTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/CreateTaskController.java deleted file mode 100644 index 260173f9..00000000 --- a/src/main/java/clap/server/adapter/inbound/web/task/CreateTaskController.java +++ /dev/null @@ -1,27 +0,0 @@ -package clap.server.adapter.inbound.web.task; - -import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; -import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse; -import clap.server.application.port.inbound.task.CreateTaskUsecase; -import clap.server.common.annotation.architecture.WebAdapter; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - - -@WebAdapter -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/tasks") -public class CreateTaskController { - - private final CreateTaskUsecase taskCreateUsecase; - private static final Long memberId = 4L; - - @PostMapping - public ResponseEntity createTask( - @RequestBody @Valid CreateTaskRequest createTaskRequest){ - return ResponseEntity.ok(taskCreateUsecase.createTask(memberId, createTaskRequest)); - } -} diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskListController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java similarity index 70% rename from src/main/java/clap/server/adapter/inbound/web/task/FindTaskListController.java rename to src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java index 0f03e04d..6ec4bdff 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskListController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java @@ -1,25 +1,30 @@ package clap.server.adapter.inbound.web.task; +import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; import clap.server.adapter.inbound.web.dto.task.FindTaskListRequest; import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse; +import clap.server.application.port.inbound.task.FindTaskDetailsUsecase; import clap.server.application.port.inbound.task.FindTaskListUsecase; import clap.server.common.annotation.architecture.WebAdapter; import lombok.RequiredArgsConstructor; + import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @WebAdapter @RestController @RequiredArgsConstructor @RequestMapping("/api/tasks") -public class FindTaskListController { +public class FindTaskController { + private final FindTaskDetailsUsecase taskDetailsUsecase; private final FindTaskListUsecase taskListUsecase; + private static final Long taskId = 3L; private static final Long memberId = 4L; - - @GetMapping("/requests") public ResponseEntity> getRequestedTaskList( @RequestParam(defaultValue = "0") int page, @@ -28,4 +33,9 @@ public ResponseEntity> getRequestedTaskList( Pageable pageable = PageRequest.of(page, size); return ResponseEntity.ok(taskListUsecase.findRequestedTaskList(memberId, pageable, findTaskListRequest)); } -} + + @GetMapping("/requests/details") + public ResponseEntity> getRequestedTaskDetails(){ + return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(memberId, taskId)); + } +} \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskDetailsController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskDetailsController.java deleted file mode 100644 index 9732a278..00000000 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskDetailsController.java +++ /dev/null @@ -1,26 +0,0 @@ -package clap.server.adapter.inbound.web.task; - -import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; -import clap.server.application.port.inbound.task.FindTaskDetailsUsecase; -import clap.server.common.annotation.architecture.WebAdapter; -import lombok.RequiredArgsConstructor; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@WebAdapter -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/tasks") -public class FindTaskDetailsController { - private final FindTaskDetailsUsecase taskDetailsUsecase; - private static final Long taskId = 3L; - private static final Long memberId = 4L; - - @GetMapping("/requests/details") - public ResponseEntity> getRequestedTaskDetails(){ - return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(memberId, taskId)); - } -} \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java new file mode 100644 index 00000000..ff9b1151 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java @@ -0,0 +1,36 @@ +package clap.server.adapter.inbound.web.task; + +import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; +import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest; +import clap.server.application.port.inbound.task.CreateTaskUsecase; +import clap.server.application.port.inbound.task.UpdateTaskUsecase; +import clap.server.common.annotation.architecture.WebAdapter; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +@WebAdapter +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/tasks") +public class ManagementTaskController { + + private final CreateTaskUsecase createTaskUsecase; + private final UpdateTaskUsecase updateTaskUsecase; + private static final Long memberId = 4L; + + @PostMapping + public ResponseEntity createTask( + @RequestBody @Valid CreateTaskRequest createTaskRequest){ + return ResponseEntity.ok(createTaskUsecase.createTask(memberId, createTaskRequest)); + } + + @PatchMapping + public ResponseEntity updateTask( + @RequestBody @Valid UpdateTaskRequest updateTaskRequest){ + return ResponseEntity.ok(updateTaskUsecase.updateTask(memberId, updateTaskRequest)); + } +} diff --git a/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java index f0f8d901..63af74cc 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java @@ -44,4 +44,9 @@ public List findAllByTaskId(final Long taskId) { .map(attachmentPersistenceMapper::toDomain) .collect(Collectors.toList()); } + + @Override + public void deleteByIds(List attachmentIds) { + attachmentRepository.deleteAllByAttachmentIdIn(attachmentIds); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java index f350a3db..4fa02685 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java @@ -24,6 +24,9 @@ public class AttachmentEntity extends BaseTimeEntity { @Column(nullable = false) private String fileUrl; + @Column(nullable = false) + private String fileSize; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "task_id") private TaskEntity task; @@ -31,7 +34,4 @@ public class AttachmentEntity extends BaseTimeEntity { @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "comment_id") private CommentEntity comment; - - @Column(nullable = false) - private String fileSize; } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java index 027ae3e0..c3b71706 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java @@ -8,5 +8,7 @@ @Repository public interface AttachmentRepository extends JpaRepository { List findAllByTask_TaskId(Long taskId); + // fileIds 목록을 받아 해당하는 파일들을 삭제 + void deleteAllByAttachmentIdIn(List attachmentIds); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/Task/CreateTaskService.java index 2ff71a34..9b7a9765 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/Task/CreateTaskService.java @@ -1,7 +1,7 @@ package clap.server.application.Task; import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; -import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskMapper; @@ -25,7 +25,6 @@ @ApplicationService @RequiredArgsConstructor -@Transactional(readOnly = true) public class CreateTaskService implements CreateTaskUsecase { private final MemberService memberService; @@ -35,16 +34,16 @@ public class CreateTaskService implements CreateTaskUsecase { @Override @Transactional - public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { + public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { Member member = memberService.findActiveMember(requesterId); Category category = categoryService.findById(createTaskRequest.categoryId()); Task task = TaskMapper.toTask(member, category, createTaskRequest.title(), createTaskRequest.description()); Task savedTask = commandTaskPort.save(task); - List attachments = AttachmentMapper.toAttachments(savedTask, createTaskRequest.fileUrls()); + List attachments = AttachmentMapper.toCreateAttachments(savedTask, createTaskRequest.fileUrls()); commandAttachmentPort.saveAll(attachments); - return TaskMapper.toCreateTaskResponse(savedTask); + return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); } } \ No newline at end of file diff --git a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java b/src/main/java/clap/server/application/Task/FindTaskDetailsService.java index 6c1c5f94..c9ed511f 100644 --- a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java +++ b/src/main/java/clap/server/application/Task/FindTaskDetailsService.java @@ -32,7 +32,7 @@ public List findRequestedTaskDetails(final Long request memberService.findActiveMember(requesterId); Task task = loadTaskPort.findById(taskId) .orElseThrow(()-> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND)); - List attachments = loadAttachmentPort.findAllByTaskId(taskId); + List attachments = loadAttachmentPort.findAllByTaskId(taskId); //TODO: comment에 달린 이미지 첨부파일은 가져오지 않도록 수정 return TaskMapper.toFindTaskDetailResponses(task, attachments); } } diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java new file mode 100644 index 00000000..0bf3c4b8 --- /dev/null +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -0,0 +1,59 @@ +package clap.server.application.Task; + +import clap.server.adapter.inbound.web.dto.task.AttachmentRequest; +import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest; +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.UpdateTaskUsecase; +import clap.server.application.port.outbound.task.CommandAttachmentPort; +import clap.server.application.port.outbound.task.CommandTaskPort; + +import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.member.Member; +import clap.server.domain.model.task.Attachment; +import clap.server.domain.model.task.Category; +import clap.server.domain.model.task.Task; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + + + +@ApplicationService +@RequiredArgsConstructor +@Slf4j +public class UpdateTaskService implements UpdateTaskUsecase { + + private final MemberService memberService; + private final CategoryService categoryService; + private final TaskService taskService; + private final CommandTaskPort commandTaskPort; + private final CommandAttachmentPort commandAttachmentPort; + + + @Override + @Transactional + public CreateAndUpdateTaskResponse updateTask(Long requesterId, UpdateTaskRequest updateTaskRequest) { + Member member = memberService.findActiveMember(requesterId); + Category category = categoryService.findById(updateTaskRequest.categoryId()); + Task task = taskService.findById(updateTaskRequest.taskId()); + + Task updatedTask = TaskMapper.toUpdatedTask(task,member, category, updateTaskRequest.title(), updateTaskRequest.description()); + Task savedTask = commandTaskPort.save(updatedTask); + + List attachmentIds = AttachmentMapper.toAttachmentIds(updateTaskRequest.attachmentRequests()); + commandAttachmentPort.deleteByIds(attachmentIds); + + List attachments = AttachmentMapper.toUpdateAttachments(savedTask, updateTaskRequest.attachmentRequests()); + commandAttachmentPort.saveAll(attachments); + return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); + } +} diff --git a/src/main/java/clap/server/application/mapper/AttachmentMapper.java b/src/main/java/clap/server/application/mapper/AttachmentMapper.java index a048136c..54f69eb5 100644 --- a/src/main/java/clap/server/application/mapper/AttachmentMapper.java +++ b/src/main/java/clap/server/application/mapper/AttachmentMapper.java @@ -1,11 +1,13 @@ package clap.server.application.mapper; +import clap.server.adapter.inbound.web.dto.task.AttachmentRequest; import clap.server.adapter.inbound.web.dto.task.AttachmentResponse; import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; import clap.server.domain.model.task.Attachment; import clap.server.domain.model.task.Task; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; public class AttachmentMapper { @@ -13,15 +15,35 @@ private AttachmentMapper() { throw new IllegalArgumentException(); } - public static List toAttachments(Task task, List fileUrls) { + public static List toCreateAttachments(Task task, List fileUrls) { return fileUrls.stream() .map(fileUrl -> Attachment.builder() .task(task) .fileUrl(fileUrl) - .originalName("파일 예시 이름") + .originalName("파일 이름") .fileSize("16MB") //TODO: 하드코딩 제거 .build()) .collect(Collectors.toList()); } + + public static List toUpdateAttachments(Task task, List attachmentRequests) { + return attachmentRequests.stream() + .map(request -> Attachment.builder() + .task(task) + .fileUrl(request.fileUrl()) + .originalName("수정된 파일 이름") + .fileSize("17MB") + .build()) + .collect(Collectors.toList()); + } + + + public static List toAttachmentIds(List attachmentRequests) { + return attachmentRequests.stream() + .map(AttachmentRequest::fileId) + .filter(Objects::nonNull) + .toList(); + } + } diff --git a/src/main/java/clap/server/application/mapper/TaskMapper.java b/src/main/java/clap/server/application/mapper/TaskMapper.java index 27b36709..b838d9b2 100644 --- a/src/main/java/clap/server/application/mapper/TaskMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskMapper.java @@ -2,7 +2,7 @@ import clap.server.adapter.inbound.web.dto.task.AttachmentResponse; -import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; @@ -11,6 +11,8 @@ import clap.server.domain.model.task.Category; import clap.server.domain.model.task.Task; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; @@ -18,20 +20,34 @@ public class TaskMapper { private TaskMapper() { throw new IllegalArgumentException(); } - + private static final String formattedDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmm")); public static Task toTask(Member member, Category category, String title, String description) { + + return Task.builder() + .title(title) + .description(description) + .category(category) + .requester(member) + .taskStatus(TaskStatus.REQUESTED) + .taskCode(category.getMainCategory().getCode() + formattedDateTime) + .build(); + } + public static Task toUpdatedTask(Task task, Member member, Category category, String title, String description) { + return Task.builder() + .taskId(task.getTaskId()) .title(title) .description(description) .category(category) .requester(member) .taskStatus(TaskStatus.REQUESTED) - .taskCode("1234") //TODO: 하드코딩 제거, reviewer_id 명시 필요 + .taskCode(category.getMainCategory().getCode() + formattedDateTime) .build(); } - public static CreateTaskResponse toCreateTaskResponse(Task task) { - return new CreateTaskResponse(task.getTaskId(), task.getCategory().getCategoryId(), task.getTitle()); + + public static CreateAndUpdateTaskResponse toCreateAndUpdateTaskResponse(Task task) { + return new CreateAndUpdateTaskResponse(task.getTaskId(), task.getCategory().getCategoryId(), task.getTitle()); } public static FindTaskListResponse toFindTaskListResponse(Task task) { @@ -52,6 +68,7 @@ public static List toFindTaskDetailResponses(Task task, List attachmentResponses = attachments.stream() .map(attachment -> new AttachmentResponse( + attachment.getAttachmentId(), attachment.getOriginalName(), attachment.getFileSize(), attachment.getFileUrl(), diff --git a/src/main/java/clap/server/application/port/inbound/domain/TaskService.java b/src/main/java/clap/server/application/port/inbound/domain/TaskService.java new file mode 100644 index 00000000..fada0234 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/domain/TaskService.java @@ -0,0 +1,20 @@ +package clap.server.application.port.inbound.domain; + +import clap.server.application.port.outbound.task.LoadTaskPort; +import clap.server.domain.model.task.Task; +import clap.server.exception.ApplicationException; +import clap.server.exception.code.TaskErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class TaskService { + + private final LoadTaskPort loadTaskPort; + + public Task findById(Long taskId) { + return loadTaskPort.findById(taskId).orElseThrow( + ()-> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND)); + } +} diff --git a/src/main/java/clap/server/application/port/inbound/task/CreateTaskUsecase.java b/src/main/java/clap/server/application/port/inbound/task/CreateTaskUsecase.java index 9529e066..1627b9f4 100644 --- a/src/main/java/clap/server/application/port/inbound/task/CreateTaskUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/CreateTaskUsecase.java @@ -1,8 +1,8 @@ package clap.server.application.port.inbound.task; import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; -import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; public interface CreateTaskUsecase { - CreateTaskResponse createTask(Long memberId, CreateTaskRequest createTaskRequest); + CreateAndUpdateTaskResponse createTask(Long memberId, CreateTaskRequest createTaskRequest); } diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java new file mode 100644 index 00000000..caf1c41f --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java @@ -0,0 +1,9 @@ +package clap.server.application.port.inbound.task; + + +import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest; + +public interface UpdateTaskUsecase { + CreateAndUpdateTaskResponse updateTask(Long memberId, UpdateTaskRequest updateTaskRequest); +} diff --git a/src/main/java/clap/server/application/port/outbound/task/CommandAttachmentPort.java b/src/main/java/clap/server/application/port/outbound/task/CommandAttachmentPort.java index d11fad38..ff7a6e8a 100644 --- a/src/main/java/clap/server/application/port/outbound/task/CommandAttachmentPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/CommandAttachmentPort.java @@ -10,4 +10,5 @@ public interface CommandAttachmentPort { void saveAll(List attachments); + void deleteByIds(List attachmentId); } diff --git a/src/main/resources/mysql.yml b/src/main/resources/mysql.yml index b77551db..7655ec4e 100644 --- a/src/main/resources/mysql.yml +++ b/src/main/resources/mysql.yml @@ -38,7 +38,7 @@ spring: logging: level: ROOT: INFO - org.hibernate: DEBUG + #org.hibernate: DEBUG org.hibernate.type.descriptor.sql.BasicBinder: TRACE org.hibernate.sql: debug org.hibernate.type: trace From 2fe3943c6f457893c07c4d33d5cc2ed29a4c1023 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Thu, 23 Jan 2025 15:28:42 +0900 Subject: [PATCH 2/2] =?UTF-8?q?CLAP-58=20Fix:=20mapper=EC=97=90=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A0=88=EB=B2=A8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Task/CreateTaskService.java | 6 ++--- .../application/Task/UpdateTaskService.java | 6 ++--- .../application/mapper/AttachmentMapper.java | 21 --------------- .../server/application/mapper/TaskMapper.java | 10 ------- .../server/domain/model/task/Attachment.java | 27 ++++++++++++++++++- .../clap/server/domain/model/task/Task.java | 27 +++++++++++++++++++ 6 files changed, 57 insertions(+), 40 deletions(-) diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/Task/CreateTaskService.java index 9b7a9765..c490d067 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/Task/CreateTaskService.java @@ -3,7 +3,6 @@ import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; -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; @@ -37,11 +36,10 @@ public class CreateTaskService implements CreateTaskUsecase { public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { Member member = memberService.findActiveMember(requesterId); Category category = categoryService.findById(createTaskRequest.categoryId()); - - Task task = TaskMapper.toTask(member, category, createTaskRequest.title(), createTaskRequest.description()); + Task task = Task.createTask(member, category, createTaskRequest.title(), createTaskRequest.description()); Task savedTask = commandTaskPort.save(task); - List attachments = AttachmentMapper.toCreateAttachments(savedTask, createTaskRequest.fileUrls()); + List attachments = Attachment.createAttachments(savedTask, createTaskRequest.fileUrls()); commandAttachmentPort.saveAll(attachments); return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java index 0bf3c4b8..7fb5a7ae 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -1,6 +1,5 @@ package clap.server.application.Task; -import clap.server.adapter.inbound.web.dto.task.AttachmentRequest; import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest; import clap.server.application.mapper.AttachmentMapper; @@ -23,7 +22,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Objects; @@ -46,13 +44,13 @@ public CreateAndUpdateTaskResponse updateTask(Long requesterId, UpdateTaskReques Category category = categoryService.findById(updateTaskRequest.categoryId()); Task task = taskService.findById(updateTaskRequest.taskId()); - Task updatedTask = TaskMapper.toUpdatedTask(task,member, category, updateTaskRequest.title(), updateTaskRequest.description()); + Task updatedTask = Task.updateTask(task, member, category, updateTaskRequest.title(), updateTaskRequest.description()); Task savedTask = commandTaskPort.save(updatedTask); List attachmentIds = AttachmentMapper.toAttachmentIds(updateTaskRequest.attachmentRequests()); commandAttachmentPort.deleteByIds(attachmentIds); - List attachments = AttachmentMapper.toUpdateAttachments(savedTask, updateTaskRequest.attachmentRequests()); + List attachments = Attachment.updateAttachments(savedTask, updateTaskRequest.attachmentRequests()); commandAttachmentPort.saveAll(attachments); return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); } diff --git a/src/main/java/clap/server/application/mapper/AttachmentMapper.java b/src/main/java/clap/server/application/mapper/AttachmentMapper.java index 54f69eb5..73713949 100644 --- a/src/main/java/clap/server/application/mapper/AttachmentMapper.java +++ b/src/main/java/clap/server/application/mapper/AttachmentMapper.java @@ -15,27 +15,6 @@ private AttachmentMapper() { throw new IllegalArgumentException(); } - public static List toCreateAttachments(Task task, List fileUrls) { - return fileUrls.stream() - .map(fileUrl -> Attachment.builder() - .task(task) - .fileUrl(fileUrl) - .originalName("파일 이름") - .fileSize("16MB") //TODO: 하드코딩 제거 - .build()) - .collect(Collectors.toList()); - } - - public static List toUpdateAttachments(Task task, List attachmentRequests) { - return attachmentRequests.stream() - .map(request -> Attachment.builder() - .task(task) - .fileUrl(request.fileUrl()) - .originalName("수정된 파일 이름") - .fileSize("17MB") - .build()) - .collect(Collectors.toList()); - } public static List toAttachmentIds(List attachmentRequests) { diff --git a/src/main/java/clap/server/application/mapper/TaskMapper.java b/src/main/java/clap/server/application/mapper/TaskMapper.java index b838d9b2..eab5dad0 100644 --- a/src/main/java/clap/server/application/mapper/TaskMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskMapper.java @@ -21,17 +21,7 @@ private TaskMapper() { throw new IllegalArgumentException(); } private static final String formattedDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmm")); - public static Task toTask(Member member, Category category, String title, String description) { - return Task.builder() - .title(title) - .description(description) - .category(category) - .requester(member) - .taskStatus(TaskStatus.REQUESTED) - .taskCode(category.getMainCategory().getCode() + formattedDateTime) - .build(); - } public static Task toUpdatedTask(Task task, Member member, Category category, String title, String description) { return Task.builder() diff --git a/src/main/java/clap/server/domain/model/task/Attachment.java b/src/main/java/clap/server/domain/model/task/Attachment.java index 18158de4..db733936 100644 --- a/src/main/java/clap/server/domain/model/task/Attachment.java +++ b/src/main/java/clap/server/domain/model/task/Attachment.java @@ -1,11 +1,15 @@ package clap.server.domain.model.task; +import clap.server.adapter.inbound.web.dto.task.AttachmentRequest; import clap.server.domain.model.common.BaseTime; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.List; +import java.util.stream.Collectors; + @Getter @SuperBuilder @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -16,4 +20,25 @@ public class Attachment extends BaseTime { private String originalName; private String fileUrl; private String fileSize; -} + + public static List createAttachments(Task task, List fileUrls) { + return fileUrls.stream() + .map(fileUrl -> Attachment.builder() + .task(task) + .fileUrl(fileUrl) + .originalName("파일 이름") + .fileSize("16MB") //TODO: 하드코딩 제거 + .build()) + .collect(Collectors.toList()); + } + + public static List updateAttachments(Task task, List attachmentRequests) { + return attachmentRequests.stream() + .map(request -> Attachment.builder() + .task(task) + .fileUrl(request.fileUrl()) + .originalName("수정된 파일 이름") + .fileSize("17MB") + .build()) + .collect(Collectors.toList()); + }} diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index cfed288a..4289c6ae 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -4,11 +4,13 @@ import clap.server.domain.model.common.BaseTime; import clap.server.domain.model.member.Member; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; @Getter @SuperBuilder @@ -27,4 +29,29 @@ public class Task extends BaseTime { private Member reviewer; private LocalDateTime dueDate; private LocalDateTime completedAt; + + public static Task createTask(Member member, Category category, String title, String description) { + return Task.builder() + .requester(member) + .category(category) + .title(title) + .description(description) + .taskStatus(TaskStatus.REQUESTED) + .taskCode(category.getMainCategory().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmm"))) + .build(); + } + + public static Task updateTask(Task task, Member member, Category category, String title, String description) { + + return Task.builder() + .taskId(task.getTaskId()) + .requester(member) + .category(category) + .title(title) + .description(description) + .taskStatus(TaskStatus.REQUESTED) + .taskCode(category.getMainCategory().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmm"))) + .build(); + } + }