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
2 changes: 1 addition & 1 deletion src/main/java/clap/server/HealthCheckController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
@RequestMapping("/health")
public class HealthCheckController {
@GetMapping
public ResponseEntity<?> healthcheck(){
public ResponseEntity<String> healthcheck(){
return ResponseEntity.ok("health check");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package clap.server.adapter.inbound.web.dto.task;

import java.time.LocalDateTime;

public record AttachmentResponse(
String fileName,
String fileSize,
String fileUrl,
LocalDateTime fileUploadedAt
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package clap.server.adapter.inbound.web.dto.task;

import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;

import java.time.LocalDateTime;
import java.util.List;

public record FindTaskDetailsResponse(
Long taskId,
String taskCode,
LocalDateTime requestedAt,
LocalDateTime finishedAt,
TaskStatus taskStatus,
String requesterNickName,
String requesterImageUrl,
String processorNickName,
String processorImageUrl,
String mainCategoryName,
String categoryName,
String title,
String description,
List<AttachmentResponse> attachmentResponses

//TODO: taskhistory 및 comment 정보 추가
) {}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;

public record FindTaskListRequest(
Integer term, //조회기간
Integer term, //조회기간: 1주일, 1개월, 3개월
Long categoryId,
Long mainCategoryId,
String title,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
public record FindTaskListResponse(
Long taskId,
String taskCode,
LocalDateTime createdAt,
LocalDateTime requestedAt,
String mainCategoryName,
String categoryName,
String title,
String processorName,
TaskStatus taskStatus,
LocalDateTime completedAt
LocalDateTime finishedAt
) {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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;
Expand All @@ -19,7 +20,7 @@ public class CreateTaskController {
private static final Long memberId = 4L;

@PostMapping
public ResponseEntity<?> createTask(
public ResponseEntity<CreateTaskResponse> createTask(
@RequestBody @Valid CreateTaskRequest createTaskRequest){
return ResponseEntity.ok(taskCreateUsecase.createTask(memberId, createTaskRequest));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
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<List<FindTaskDetailsResponse>> getRequestedTaskDetails(){
return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(memberId, taskId));
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package clap.server.adapter.inbound.web.task;

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.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;
Expand All @@ -19,7 +21,7 @@ public class FindTaskListController {


@GetMapping("/requests")
public ResponseEntity<?> getRequestedTaskList(
public ResponseEntity<Page<FindTaskListResponse>> getRequestedTaskList(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size,
@RequestBody FindTaskListRequest findTaskListRequest){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,20 @@
import clap.server.adapter.outbound.persistense.mapper.AttachmentPersistenceMapper;
import clap.server.adapter.outbound.persistense.repository.task.AttachmentRepository;
import clap.server.application.port.outbound.task.CommandAttachmentPort;
import clap.server.application.port.outbound.task.LoadAttachmentPort;
import clap.server.common.annotation.architecture.PersistenceAdapter;
import clap.server.domain.model.task.Attachment;

import lombok.RequiredArgsConstructor;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;


@PersistenceAdapter
@RequiredArgsConstructor
public class AttachmentPersistenceAdapter implements CommandAttachmentPort {
public class AttachmentPersistenceAdapter implements CommandAttachmentPort, LoadAttachmentPort {

private final AttachmentRepository attachmentRepository;
private final AttachmentPersistenceMapper attachmentPersistenceMapper;
Expand All @@ -34,4 +36,12 @@ public void saveAll(List<Attachment> attachments) {
.collect(Collectors.toList());
attachmentRepository.saveAll(attachmentEntities);
}

@Override
public List<Attachment> findAllByTaskId(final Long taskId) {
List<AttachmentEntity> attachmentEntities = attachmentRepository.findAllByTask_TaskId(taskId);
return attachmentEntities.stream()
.map(attachmentPersistenceMapper::toDomain)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class AttachmentEntity extends BaseTimeEntity {
@JoinColumn(name = "task_id")
private TaskEntity task;

@ManyToOne(fetch = FetchType.LAZY)
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "comment_id")
private CommentEntity comment;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import lombok.experimental.SuperBuilder;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "task")
Expand Down Expand Up @@ -62,5 +64,4 @@ public class TaskEntity extends BaseTimeEntity {

@Column
private LocalDateTime completedAt;

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class TaskHistoryEntity extends BaseTimeEntity {
@Embedded
private TaskModificationInfo taskModificationInfo;

@ManyToOne(fetch = FetchType.LAZY)
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "comment_id")
private CommentEntity comment;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public class TaskModificationInfo {
private TaskEntity task;

@Column(name = "modified_field")
private String modifiedField;
private String modifiedField; //처리자(requestor) / 요청상태(taskStatus) -> task 상태 변경 혹은 처리 변경시에 taskhistory 테이블도 변경해야함

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modified_member_id")
@JoinColumn(name = "modified_member_id") //처리자가 바뀌는 경우
private MemberEntity member;

@Column(name = "new_value")
private String newValue;
private String newValue; //상태가 바뀌는 경우
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface AttachmentRepository extends JpaRepository<AttachmentEntity, Long> {
List<AttachmentEntity> findAllByTask_TaskId(Long taskId);

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package clap.server.application;
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.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;
Expand All @@ -21,8 +22,6 @@

import java.util.List;

import static clap.server.application.mapper.TaskMapper.toCreateTaskResponse;
import static clap.server.application.mapper.TaskMapper.toTask;

@ApplicationService
@RequiredArgsConstructor
Expand All @@ -40,12 +39,12 @@ public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createT
Member member = memberService.findActiveMember(requesterId);
Category category = categoryService.findById(createTaskRequest.categoryId());

Task task = toTask(member, category, createTaskRequest.title(), createTaskRequest.description());
Task task = TaskMapper.toTask(member, category, createTaskRequest.title(), createTaskRequest.description());
Task savedTask = commandTaskPort.save(task);

List<Attachment> attachments = AttachmentMapper.toAttachments(savedTask, createTaskRequest.fileUrls());
commandAttachmentPort.saveAll(attachments);

return toCreateTaskResponse(savedTask);
return TaskMapper.toCreateTaskResponse(savedTask);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package clap.server.application.Task;

import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse;
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
import clap.server.application.mapper.TaskMapper;
import clap.server.application.port.inbound.domain.MemberService;
import clap.server.application.port.inbound.task.FindTaskDetailsUsecase;
import clap.server.application.port.outbound.task.LoadAttachmentPort;
import clap.server.application.port.outbound.task.LoadTaskPort;
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.Task;
import clap.server.exception.ApplicationException;
import clap.server.exception.code.TaskErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


@ApplicationService
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class FindTaskDetailsService implements FindTaskDetailsUsecase {
private final MemberService memberService;
private final LoadTaskPort loadTaskPort;
private final LoadAttachmentPort loadAttachmentPort;

@Override
public List<FindTaskDetailsResponse> findRequestedTaskDetails(final Long requesterId, final Long taskId) {
memberService.findActiveMember(requesterId);
Task task = loadTaskPort.findById(taskId)
.orElseThrow(()-> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND));
List<Attachment> attachments = loadAttachmentPort.findAllByTaskId(taskId);
return TaskMapper.toFindTaskDetailResponses(task, attachments);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package clap.server.application;
package clap.server.application.Task;

import clap.server.adapter.inbound.web.dto.task.FindTaskListRequest;
import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse;
Expand All @@ -21,7 +21,7 @@
@ApplicationService
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class FindTasklistService implements FindTaskListUsecase {
public class FindTaskListService implements FindTaskListUsecase {

private final MemberService memberService;
private final LoadTaskPort loadTaskPort;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package clap.server.application.mapper;

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;

Expand Down
37 changes: 37 additions & 0 deletions src/main/java/clap/server/application/mapper/TaskMapper.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package clap.server.application.mapper;


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.FindTaskDetailsResponse;
import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse;
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
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 java.util.List;
import java.util.stream.Collectors;

public class TaskMapper {
private TaskMapper() {
throw new IllegalArgumentException();
Expand Down Expand Up @@ -41,4 +47,35 @@ public static FindTaskListResponse toFindTaskListResponse(Task task) {
task.getCompletedAt()
);
}

public static List<FindTaskDetailsResponse> toFindTaskDetailResponses(Task task, List<Attachment> attachments){

List<AttachmentResponse> attachmentResponses = attachments.stream()
.map(attachment -> new AttachmentResponse(
attachment.getOriginalName(),
attachment.getFileSize(),
attachment.getFileUrl(),
attachment.getCreatedAt()
))
.collect(Collectors.toList());

FindTaskDetailsResponse response = new FindTaskDetailsResponse(
task.getTaskId(),
task.getTaskCode(),
task.getCreatedAt(),
task.getCompletedAt(),
task.getTaskStatus(),
task.getRequester().getMemberInfo().getNickname(),
task.getRequester().getImageUrl(),
task.getProcessor() != null ? task.getProcessor().getMemberInfo().getNickname() : null,
task.getProcessor() != null ? task.getProcessor().getImageUrl() : null,
task.getCategory().getMainCategory().getName(),
task.getCategory().getName(),
task.getTitle(),
task.getDescription(),
attachmentResponses
);

return List.of(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package clap.server.application.port.inbound.task;

import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse;

import java.util.List;

public interface FindTaskDetailsUsecase {
List<FindTaskDetailsResponse> findRequestedTaskDetails(Long memberId, Long taskId);
}
Loading
Loading