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
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package clap.server.adapter.inbound.web.dto.task;


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

public record AttachmentRequest(
@Schema(description = "파일 ID", example = "45")
Long fileId,
String fileUrl) {

@Schema(description = "파일 URL", example = "https://example.com/file.png")
String fileUrl
) {
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
package clap.server.adapter.inbound.web.dto.task;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

import java.util.List;


@Schema(description = "작업 생성 요청")
public record CreateTaskRequest(
@Schema(description = "카테고리 ID")
@NotNull
Long categoryId,

@Schema(description = "메인 카테고리 ID")
@NotNull
Long mainCategoryId,

@Schema(description = "작업 제목")
@NotBlank
String title,

@Schema(description = "작업 설명")
String description,

@Schema(description = "첨부 파일 URL 목록", example = "[\"https://example.com/file1.png\", \"https://example.com/file2.pdf\"]")
List<@NotBlank String> fileUrls
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@



public record CreateAndUpdateTaskResponse(
public record CreateTaskResponse(
Long taskId,
Long categoryId,
String title
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package clap.server.adapter.inbound.web.dto.task;


import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Value;

import java.util.List;

@Schema(description = "작업 필터링 요청")
public record FilterTaskListRequest(

@Schema(description = "검색 기간 (단위: 시간)", example = "1, 24, 168, 730, 2190 (1시간, 24시간, 1주일, 1개월, 3개월)")
Integer term,

@Schema(description = "카테고리 ID 목록", example = "[1, 2, 3]")
@NotNull
List<Long> categoryIds,

@Schema(description = "메인 카테고리 ID 목록", example = "[10, 20, 30]")
@NotNull
List<Long> mainCategoryIds,

@Schema(description = "작업 제목", example = "작업 제목")
@NotNull
String title,

@Schema(description = "사용자 닉네임", example = "atom.park")
@NotNull
String nickName,

@Schema(description = "작업 상태 목록", example = "[\"REQUESTED\", \"IN_PROGRESS\"]")
@NotNull
List<TaskStatus> taskStatus,

@Schema(description = "정렬 기준", implementation = OrderRequest.class)
@NotNull
OrderRequest orderRequest
) {
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package clap.server.adapter.inbound.web.dto.task;

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

public record OrderRequest(
@Schema(description = "정렬 기준 (REQUESTED_AT/FINISHED_AT)", example = "REQUESTED_AT")
String sortBy,

@Schema(description = "정렬 방향 (ASC/DESC)", example = "ASC")
String sortDirection
) {}
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
package clap.server.adapter.inbound.web.dto.task;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

import java.util.List;

@Schema(description = "작업 업데이트 요청")
public record UpdateTaskRequest(

@Schema(description = "작업 ID", example = "123")
@NotNull
Long taskId,

@Schema(description = "카테고리 ID", example = "1")
@NotNull
Long categoryId,

@Schema(description = "메인 카테고리 ID", example = "10")
@NotNull
Long mainCategoryId,

@Schema(description = "작업 제목", example = "업데이트된 제목")
@NotBlank
String title,

@Schema(description = "작업 설명", example = "업데이트된 설명.")
String description,

@Schema(description = "첨부 파일 요청 목록", implementation = AttachmentRequest.class)
List<AttachmentRequest> attachmentRequests
) {
}
) {}

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package clap.server.adapter.inbound.web.dto.task;

public record UpdateTaskResponse(
Long taskId,
Long categoryId,
String title
) {
}
Original file line number Diff line number Diff line change
@@ -1,41 +1,53 @@
package clap.server.adapter.inbound.web.task;

import clap.server.adapter.inbound.security.SecurityUserDetails;
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.FilterTaskListRequest;
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 io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;

import lombok.extern.slf4j.Slf4j;
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.security.access.annotation.Secured;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "작업 조회")
@WebAdapter
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/tasks")
public class FindTaskController {
private final FindTaskDetailsUsecase taskDetailsUsecase;
private final FindTaskListUsecase taskListUsecase;
private static final Long taskId = 3L;
private static final Long memberId = 4L;

@Operation(summary = "사용자 요청 작업 목록 조회")
@Secured({"ROLE_USER"})
@GetMapping("/requests")
public ResponseEntity<Page<FindTaskListResponse>> getRequestedTaskList(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size,
@RequestBody FindTaskListRequest findTaskListRequest){
Pageable pageable = PageRequest.of(page, size);
return ResponseEntity.ok(taskListUsecase.findRequestedTaskList(memberId, pageable, findTaskListRequest));
@RequestParam(defaultValue = "20") int pageSize,
@ModelAttribute FilterTaskListRequest filterTaskListRequest,
@AuthenticationPrincipal SecurityUserDetails userInfo){
Pageable pageable = PageRequest.of(page, pageSize);
return ResponseEntity.ok(taskListUsecase.findRequestedTaskList(userInfo.getUserId(), pageable, filterTaskListRequest));
}

@GetMapping("/requests/details")
public ResponseEntity<List<FindTaskDetailsResponse>> getRequestedTaskDetails(){
return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(memberId, taskId));
@Operation(summary = "요청한 작업 상세 조회")
@Secured({"ROLE_USER", "ROLE_MANAGER"})
@GetMapping("/requests/details/{taskId}")
public ResponseEntity<List<FindTaskDetailsResponse>> getRequestedTaskDetails(
@PathVariable Long taskId,
@AuthenticationPrincipal SecurityUserDetails userInfo){
return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(userInfo.getUserId(), taskId));
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
package clap.server.adapter.inbound.web.task;

import clap.server.adapter.inbound.security.SecurityUserDetails;
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.CreateTaskResponse;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest;
import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse;
import clap.server.application.port.inbound.task.CreateTaskUsecase;
import clap.server.application.port.inbound.task.UpdateTaskUsecase;
import clap.server.common.annotation.architecture.WebAdapter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;


@Tag(name = "작업 생성 및 수정")
@WebAdapter
@RestController
@RequiredArgsConstructor
Expand All @@ -20,17 +26,20 @@ public class ManagementTaskController {

private final CreateTaskUsecase createTaskUsecase;
private final UpdateTaskUsecase updateTaskUsecase;
private static final Long memberId = 4L;

@Operation(summary = "작업 요청 생성")
@PostMapping
public ResponseEntity<CreateAndUpdateTaskResponse> createTask(
@RequestBody @Valid CreateTaskRequest createTaskRequest){
return ResponseEntity.ok(createTaskUsecase.createTask(memberId, createTaskRequest));
public ResponseEntity<CreateTaskResponse> createTask(
@RequestBody @Valid CreateTaskRequest createTaskRequest,
@AuthenticationPrincipal SecurityUserDetails userInfo){
return ResponseEntity.ok(createTaskUsecase.createTask(userInfo.getUserId(), createTaskRequest));
}

@Operation(summary = "요청한 작업 수정")
@PatchMapping
public ResponseEntity<CreateAndUpdateTaskResponse> updateTask(
@RequestBody @Valid UpdateTaskRequest updateTaskRequest){
return ResponseEntity.ok(updateTaskUsecase.updateTask(memberId, updateTaskRequest));
public ResponseEntity<UpdateTaskResponse> updateTask(
@RequestBody @Valid UpdateTaskRequest updateTaskRequest,
@AuthenticationPrincipal SecurityUserDetails userInfo){
return ResponseEntity.ok(updateTaskUsecase.updateTask(userInfo.getUserId(), updateTaskRequest));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public void saveAll(List<Attachment> attachments) {
}

@Override
public List<Attachment> findAllByTaskId(final Long taskId) {
List<AttachmentEntity> attachmentEntities = attachmentRepository.findAllByTask_TaskId(taskId);
public List<Attachment> findAllByTaskIdAndCommentIsNull(final Long taskId) {
List<AttachmentEntity> attachmentEntities = attachmentRepository.findAllByTask_TaskIdAndCommentIsNull(taskId);
return attachmentEntities.stream()
.map(attachmentPersistenceMapper::toDomain)
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package clap.server.adapter.outbound.persistense;

import clap.server.adapter.inbound.web.dto.task.FindTaskListRequest;
import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest;
import clap.server.adapter.inbound.web.dto.task.FindTaskListResponse;
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper;
Expand Down Expand Up @@ -38,7 +38,7 @@ public Optional<Task> findById(Long id) {
}

@Override
public Page<FindTaskListResponse> findAllByRequesterId(Long requesterId, Pageable pageable, FindTaskListRequest findTaskListRequest) {
public Page<FindTaskListResponse> findAllByRequesterId(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest) {
Page<Task> taskList = taskRepository.findRequestedTaskList(requesterId, pageable, findTaskListRequest)
.map(taskPersistenceMapper::toDomain);
return taskList.map(TaskMapper::toFindTaskListResponse);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class CommentEntity extends BaseTimeEntity {
@JoinColumn(name = "task_id", nullable = false)
private TaskEntity task;

@Column(name = "content", nullable = false)
@Column(name = "content", nullable = false) //nullable false인 이유
private String content;

@Column(name = "is_modified", nullable = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public enum TaskStatus {
REQUESTED("요청"),
IN_PROGRESS("진행 중"),
PENDING_COMPLETED("검토중"),
PENDING_COMPLETED("검토 중"),
COMPLETED("완료"),
TERMINATED("종료");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import clap.server.adapter.outbound.persistense.mapper.common.PersistenceMapper;
import clap.server.domain.model.task.Task;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper(componentModel = "spring", uses = {MemberPersistenceMapper.class, LabelPersistenceMapper.class, CategoryPersistenceMapper.class})
public interface TaskPersistenceMapper extends PersistenceMapper<TaskEntity, Task> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@

@Repository
public interface AttachmentRepository extends JpaRepository<AttachmentEntity, Long> {
List<AttachmentEntity> findAllByTask_TaskId(Long taskId);
// fileIds 목록을 받아 해당하는 파일들을 삭제
List<AttachmentEntity> findAllByTask_TaskIdAndCommentIsNull(Long taskId);
void deleteAllByAttachmentIdIn(List<Long> attachmentIds);

}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package clap.server.adapter.outbound.persistense.repository.task;

import clap.server.adapter.inbound.web.dto.task.FindTaskListRequest;
import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest;
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface TaskCustomRepository {

Page<TaskEntity> findRequestedTaskList(Long requesterId, Pageable pageable, FindTaskListRequest findTaskListRequest);
Page<TaskEntity> findRequestedTaskList(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
}
Loading
Loading