From 83c6cac08c70a65d638c1a77a6472b931ebea718 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Thu, 31 Oct 2024 17:18:59 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20RequestParam=EC=9D=B8=20accountId=20?= =?UTF-8?q?->=20RequestHeader=EC=9D=B8=20Authorization=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 해결된 오류: - 기존의 인증방식에서 잘못된 방식으로 accountId를 얻으려고 시도했음 --- .../devlinkbackend/team/controller/TeamController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/mtvs/devlinkbackend/team/controller/TeamController.java b/src/main/java/com/mtvs/devlinkbackend/team/controller/TeamController.java index 5d6d5c1..91c1bc5 100644 --- a/src/main/java/com/mtvs/devlinkbackend/team/controller/TeamController.java +++ b/src/main/java/com/mtvs/devlinkbackend/team/controller/TeamController.java @@ -33,8 +33,9 @@ public TeamController(TeamService teamService, JwtUtil jwtUtil) { }) @PostMapping public ResponseEntity registTeam( - @RequestBody TeamRegistRequestDTO teamRegistRequestDTO, @RequestParam String accountId) { + @RequestBody TeamRegistRequestDTO teamRegistRequestDTO, @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); TeamSingleReponseDTO team = teamService.registTeam(teamRegistRequestDTO, accountId); return new ResponseEntity<>(team, HttpStatus.CREATED); } @@ -104,7 +105,9 @@ public ResponseEntity getTeamsByMemberIdContaining( @PatchMapping public ResponseEntity updateTeam( @RequestBody TeamUpdateRequestDTO teamUpdateRequestDTO, - @RequestParam String accountId) { + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); try { TeamSingleReponseDTO updatedTeam = teamService.updateTeam(teamUpdateRequestDTO, accountId); @@ -126,6 +129,7 @@ public TeamSingleReponseDTO addMemberToTeam( @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); + System.out.println(teamMemberModifyRequestDTO); return teamService.addMemberToTeam(teamMemberModifyRequestDTO, accountId); } From 4c1d8e7083202d07942ba5e3f17cfcbfcfa5a69f Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Thu, 31 Oct 2024 17:33:16 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20web,=20ue=EC=9D=98=20UI=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변경된 점: - 기존의 workType에 대해서 FE UI에서 삭제됨에 따라 해당 컬럼도 삭제 --- .../project/dto/request/ProjectRegistRequestDTO.java | 1 - .../mtvs/devlinkbackend/project/entity/Project.java | 12 ++---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectRegistRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectRegistRequestDTO.java index 9051f8e..d58b498 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectRegistRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectRegistRequestDTO.java @@ -9,7 +9,6 @@ @NoArgsConstructor @ToString public class ProjectRegistRequestDTO { - private String workScope; private String workType; private String progressClassification; private String companyName; diff --git a/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java b/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java index 6b8b0e2..1eb6d6b 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java @@ -26,9 +26,6 @@ public class Project { @Column(name = "PROJECT_ID") private Long projectId; - @Column(name = "WORK_SCOPE") - private String workScope; - @Column(name = "WORK_TYPE") private String workType; @@ -41,7 +38,7 @@ public class Project { @Column(name = "TITLE", nullable = false) private String title; - @Column(name = "CONTENT", nullable = false) + @Column(name = "CONTENT", nullable = false, columnDefinition = "TEXT") private String content; @Column(name = "REQUIRED_CLIENT") @@ -97,8 +94,7 @@ public Project(String title, String content, LocalDate startDateTime, LocalDate this.accountId = accountId; } - public Project(String workScope, String workType, String progressClassification, String companyName, String title, String content, Integer requiredClient, Integer requiredServer, Integer requiredDesign, Integer requiredPlanner, Integer requiredAIEngineer, LocalDate startDateTime, LocalDate endDateTime, Integer estimatedCost, String accountId) { - this.workScope = workScope; + public Project(String workType, String progressClassification, String companyName, String title, String content, Integer requiredClient, Integer requiredServer, Integer requiredDesign, Integer requiredPlanner, Integer requiredAIEngineer, LocalDate startDateTime, LocalDate endDateTime, Integer estimatedCost, String accountId) { this.workType = workType; this.progressClassification = progressClassification; this.companyName = companyName; @@ -115,10 +111,6 @@ public Project(String workScope, String workType, String progressClassification, this.accountId = accountId; } - public void setWorkScope(String workScope) { - this.workScope = workScope; - } - public void setWorkType(String workType) { this.workType = workType; } From f2b9619ea7e924df6d3a76d601d4d5ee6cc0c13b Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Thu, 31 Oct 2024 17:34:53 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20web,=20ue=EC=9D=98=20UI=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변경된 점: - 기존의 workType에 대해서 FE UI에서 삭제됨에 따라 해당 컬럼도 삭제 --- .../devlinkbackend/project/repository/ProjectRepository.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java b/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java index f5d0425..7c3ca01 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java @@ -19,9 +19,6 @@ public interface ProjectRepository extends JpaRepository { // AccountId로 프로젝트 조회 (페이징 추가) Page findProjectsByAccountId(String accountId, Pageable pageable); - // WorkScope로 프로젝트 조회 (페이징 추가) - Page findProjectsByWorkScope(String workScope, Pageable pageable); - // WorkType으로 프로젝트 조회 (페이징 추가) Page findProjectsByWorkType(String workType, Pageable pageable); From 1c6628f5eee0a2f67f1aa13d3d0fdcaed7e80a64 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Thu, 31 Oct 2024 17:35:35 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20web,=20ue=EC=9D=98=20UI=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변경된 점: - 기존의 workType에 대해서 FE UI에서 삭제됨에 따라 해당 컬럼도 삭제 --- .../project/dto/request/ProjectUpdateRequestDTO.java | 1 - .../project/repository/projection/ProjectSummary.java | 1 - .../devlinkbackend/project/service/ProjectService.java | 8 -------- 3 files changed, 10 deletions(-) diff --git a/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectUpdateRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectUpdateRequestDTO.java index 725acf8..187c821 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectUpdateRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/dto/request/ProjectUpdateRequestDTO.java @@ -11,7 +11,6 @@ @ToString public class ProjectUpdateRequestDTO { private Long projectId; - private String workScope; private String workType; private String progressClassification; private String companyName; diff --git a/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectSummary.java b/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectSummary.java index 9471f2d..d3b2581 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectSummary.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectSummary.java @@ -6,7 +6,6 @@ public interface ProjectSummary { Long getProjectId(); - String getWorkScope(); String getWorkType(); String getProgressClassification(); String getCompanyName(); diff --git a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java index f1741b6..139885e 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java @@ -33,7 +33,6 @@ public ProjectService(ProjectRepository projectRepository) { @Transactional public ProjectSingleResponseDTO registProject(ProjectRegistRequestDTO projectRegistRequestDTO, String accountId) { return new ProjectSingleResponseDTO(projectRepository.save(new Project( - projectRegistRequestDTO.getWorkScope(), projectRegistRequestDTO.getWorkType(), projectRegistRequestDTO.getProgressClassification(), projectRegistRequestDTO.getCompanyName(), @@ -61,12 +60,6 @@ public ProjectPagingResponseDTO findProjectsByAccountIdWithPaging(int page, Stri return new ProjectPagingResponseDTO(projectPage.getContent(), projectPage.getTotalPages()); } - public ProjectPagingResponseDTO findProjectsByWorkScopeWithPaging(int page, String workScope) { - Pageable pageable = PageRequest.of(page, pageSize, Sort.by("createdAt").descending()); - Page projectPage = projectRepository.findProjectsByWorkScope(workScope, pageable); - return new ProjectPagingResponseDTO(projectPage.getContent(), projectPage.getTotalPages()); - } - public ProjectPagingResponseDTO findProjectsByWorkTypeWithPaging(int page, String workType) { Pageable pageable = PageRequest.of(page, pageSize, Sort.by("createdAt").descending()); Page projectPage = projectRepository.findProjectsByWorkType(workType, pageable); @@ -116,7 +109,6 @@ public ProjectSingleResponseDTO updateProject(ProjectUpdateRequestDTO projectUpd if (request.isPresent()) { Project foundProject = request.get(); if(foundProject.getAccountId().equals(accountId)) { - foundProject.setWorkScope(projectUpdateRequestDTO.getWorkScope()); foundProject.setWorkType(projectUpdateRequestDTO.getWorkType()); foundProject.setProgressClassification(projectUpdateRequestDTO.getProgressClassification()); foundProject.setTitle(projectUpdateRequestDTO.getTitle()); From 7b06c4c440746ffd5e0c64535572c5caf351ad36 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Thu, 31 Oct 2024 17:37:05 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20WEB=20FE=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20API=20=EC=B6=94=EA=B0=80=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추가된 기능: - 기존 Project 게시판에서 리스트업하기 위한 API를 추가 개발 --- .../project/controller/ProjectController.java | 13 -- .../controller/ProjectSummaryController.java | 23 +++ .../dto/response/ProjectPreviewDTO.java | 20 +++ .../ProjectSummaryPagingResponseDTO.java | 17 +++ .../project/repository/ProjectRepository.java | 2 + .../project/service/ProjectDetailService.java | 132 +++++++++++++++++- 6 files changed, 192 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectPreviewDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectSummaryPagingResponseDTO.java diff --git a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java index c6f529d..4631c81 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java @@ -74,19 +74,6 @@ public ResponseEntity getProjectsByAccountId( return ResponseEntity.ok(projects); } - @Operation(summary = "Pagination으로 업무 범위별 프로젝트 의뢰 목록 조회", description = "Pagination으로 특정 업무 범위에 대한 모든 프로젝트 의뢰를 조회합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "프로젝트 의뢰 목록이 성공적으로 조회됨") - }) - @GetMapping("/work-scope") - public ResponseEntity getProjectsByWorkScope( - @RequestParam int page, - @RequestParam String workScope) { - - ProjectPagingResponseDTO projects = projectService.findProjectsByWorkScopeWithPaging(page, workScope); - return ResponseEntity.ok(projects); - } - @Operation(summary = "Pagination으로 근무 형태별 프로젝트 의뢰 목록 조회", description = "Pagination으로 근무 형태 범위에 대한 모든 프로젝트 의뢰를 조회합니다.") @ApiResponses({ @ApiResponse(responseCode = "200", description = "프로젝트 의뢰 목록이 성공적으로 조회됨") diff --git a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectSummaryController.java b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectSummaryController.java index cab4327..b3dbc64 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectSummaryController.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectSummaryController.java @@ -1,6 +1,7 @@ package com.mtvs.devlinkbackend.project.controller; import com.mtvs.devlinkbackend.project.dto.response.ProjectDetailResponseDTO; +import com.mtvs.devlinkbackend.project.dto.response.ProjectSummaryPagingResponseDTO; import com.mtvs.devlinkbackend.project.dto.response.ProjectSummaryResponseDTO; import com.mtvs.devlinkbackend.project.service.ProjectDetailService; import io.swagger.v3.oas.annotations.Operation; @@ -29,6 +30,28 @@ public ResponseEntity findAllSummary() { return summary != null ? ResponseEntity.ok(summary) : ResponseEntity.notFound().build(); } + @Operation(summary = "Pagination으로 전체 프로젝트 요약 조회", description = "Pagination으로 전체 프로젝트 요약을 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "성공적으로 조회됨"), + @ApiResponse(responseCode = "404", description = "찾을 수 없음") + }) + @GetMapping("/summary/pagination") + public ResponseEntity findAllSummary(@RequestParam int page) { + ProjectSummaryPagingResponseDTO summary = projectDetailService.findAllProjectSummaryWithPagination(page); + return summary != null ? ResponseEntity.ok(summary) : ResponseEntity.notFound().build(); + } + + @Operation(summary = "Pagination으로 전체 프로젝트 요약 조회", description = "Pagination으로 전체 프로젝트 요약을 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "성공적으로 조회됨"), + @ApiResponse(responseCode = "404", description = "찾을 수 없음") + }) + @GetMapping("/summary/home") + public ResponseEntity findAllSummaryInHome() { + ProjectSummaryPagingResponseDTO summary = projectDetailService.findAllProjectPreviewInHome(); + return summary != null ? ResponseEntity.ok(summary) : ResponseEntity.notFound().build(); + } + @Operation(summary = "전체 프로젝트 세부 내용 조회", description = "전체 프로젝트 세부 내용을 조회합니다.") @ApiResponses({ @ApiResponse(responseCode = "200", description = "성공적으로 조회됨"), diff --git a/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectPreviewDTO.java b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectPreviewDTO.java new file mode 100644 index 0000000..5ab45bd --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectPreviewDTO.java @@ -0,0 +1,20 @@ +package com.mtvs.devlinkbackend.project.dto.response; + +import lombok.*; + +import java.time.LocalDate; +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class ProjectPreviewDTO { + private Long projectId; + private String workType; + private String progressClassification; + private String previewTitle; + private List requiredWorkers; + private LocalDate deadlineDate; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectSummaryPagingResponseDTO.java b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectSummaryPagingResponseDTO.java new file mode 100644 index 0000000..539f9a5 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectSummaryPagingResponseDTO.java @@ -0,0 +1,17 @@ +package com.mtvs.devlinkbackend.project.dto.response; + +import com.mtvs.devlinkbackend.project.repository.projection.ProjectSummary; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ProjectSummaryPagingResponseDTO { + private List data; + private Integer totalPages; + private Long totalProjectCnt; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java b/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java index 7c3ca01..b856c69 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java @@ -50,5 +50,7 @@ Page findProjectsWithLargerRequirements( List findAllBy(); + Page findAllBy(Pageable pageable); + ProjectIdAndContent findProjectIdAndContentByProjectId(Long projectId); } diff --git a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectDetailService.java b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectDetailService.java index a9dd6b1..c872a5f 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectDetailService.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectDetailService.java @@ -2,18 +2,27 @@ import com.mtvs.devlinkbackend.comment.entity.Comment; import com.mtvs.devlinkbackend.comment.repository.CommentRepository; -import com.mtvs.devlinkbackend.project.dto.response.ProjectDetailResponseDTO; -import com.mtvs.devlinkbackend.project.dto.response.ProjectSummaryResponseDTO; +import com.mtvs.devlinkbackend.project.dto.response.*; import com.mtvs.devlinkbackend.project.repository.projection.ProjectIdAndContent; import com.mtvs.devlinkbackend.project.repository.projection.ProjectSummary; import com.mtvs.devlinkbackend.project.repository.ProjectRepository; import com.mtvs.devlinkbackend.support.repository.SupportRepository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.List; @Service public class ProjectDetailService { + + private static final int pageSize = 15; + private final ProjectRepository projectRepository; private final CommentRepository commentRepository; private final SupportRepository supportRepository; @@ -29,6 +38,125 @@ public ProjectSummaryResponseDTO findAllProjectSummary() { return new ProjectSummaryResponseDTO(projectSummaryList); } + public ProjectSummaryPagingResponseDTO findAllProjectSummaryWithPagination(int page) { + Pageable pageable = PageRequest.of(page, pageSize, Sort.by("createdAt").descending()); + Page projectSummaryPage = projectRepository.findAllBy(pageable); + List projectPreviewDTOList = new ArrayList<>(); + + for (ProjectSummary summary : projectSummaryPage.getContent()) { + ProjectPreviewDTO previewDTO = new ProjectPreviewDTO(); + + // workType 설정 + previewDTO.setWorkType(summary.getWorkType()); + previewDTO.setProgressClassification(summary.getProgressClassification()); + + // previewTitle 생성: workType + (StartDateTime과 EndDateTime의 월 차이) + title + long monthsDifference = ChronoUnit.MONTHS.between(summary.getStartDateTime(), summary.getEndDateTime()); + String previewTitle = "["+summary.getWorkType() + "] [" + monthsDifference + "개월"; + + // requiredWorkers 설정 + List requiredWorkers = new ArrayList<>(); + if (summary.getRequiredClient() != null && summary.getRequiredClient() > 0) { + requiredWorkers.add("클라이언트"); + previewTitle = previewTitle + "/클라이언트(" + summary.getRequiredClient() + ")"; + } + if (summary.getRequiredServer() != null && summary.getRequiredServer() > 0) { + requiredWorkers.add("서버"); + previewTitle = previewTitle + "/서버(" + summary.getRequiredServer() + ")"; + } + if (summary.getRequiredDesign() != null && summary.getRequiredDesign() > 0) { + requiredWorkers.add("디자인"); + previewTitle = previewTitle + "/디자인(" + summary.getRequiredDesign() + ")"; + } + if (summary.getRequiredPlanner() != null && summary.getRequiredPlanner() > 0) { + requiredWorkers.add("기획"); + previewTitle = previewTitle + "/기획(" + summary.getRequiredPlanner() + ")"; + } + if (summary.getRequiredAIEngineer() != null && summary.getRequiredAIEngineer() > 0) { + requiredWorkers.add("AI"); + previewTitle = previewTitle + "/AI(" + summary.getRequiredAIEngineer() + ")"; + } + previewTitle = previewTitle + "] " + summary.getTitle(); + + previewDTO.setPreviewTitle(previewTitle); + + previewDTO.setRequiredWorkers(requiredWorkers); + + // deadlineDate 설정: createdAt에서 30일을 더한 날짜 + LocalDate deadlineDate = summary.getCreatedAt().toLocalDate().plusDays(30); + previewDTO.setDeadlineDate(deadlineDate); + + // ProjectPreviewDTO 리스트에 추가 + projectPreviewDTOList.add(previewDTO); + } + + return new ProjectSummaryPagingResponseDTO(projectPreviewDTOList, projectSummaryPage.getTotalPages(), projectRepository.count()); + } + + public ProjectSummaryPagingResponseDTO findAllProjectPreviewInHome() { + Pageable pageable = PageRequest.of(0, 5, Sort.by("createdAt").descending()); + Page projectSummaryPage = projectRepository.findAllBy(pageable); + List projectPreviewDTOList = new ArrayList<>(); + + for (ProjectSummary summary : projectSummaryPage.getContent()) { + ProjectPreviewDTO previewDTO = new ProjectPreviewDTO(); + + previewDTO.setProjectId(summary.getProjectId()); + + // workType 설정 + previewDTO.setWorkType(summary.getWorkType()); + previewDTO.setProgressClassification(summary.getProgressClassification()); + + // previewTitle 생성: workType + (StartDateTime과 EndDateTime의 월 차이) + title + long monthsDifference = ChronoUnit.MONTHS.between(summary.getStartDateTime(), summary.getEndDateTime()); + String previewTitle = "["; + if(summary.getWorkType().equals("both")) + previewTitle += "상주, 원격"; + else if (summary.getWorkType().equals("local")) + previewTitle += "상주"; + else if (summary.getWorkType().equals("remote")) + previewTitle += "원격"; + previewTitle = previewTitle + "] [" + monthsDifference + "개월"; + + // requiredWorkers 설정 + List requiredWorkers = new ArrayList<>(); + if (summary.getRequiredClient() != null && summary.getRequiredClient() > 0) { + requiredWorkers.add("클라이언트"); + previewTitle = previewTitle + "/클라이언트(" + summary.getRequiredClient() + ")"; + } + if (summary.getRequiredServer() != null && summary.getRequiredServer() > 0) { + requiredWorkers.add("서버"); + previewTitle = previewTitle + "/서버(" + summary.getRequiredServer() + ")"; + } + if (summary.getRequiredDesign() != null && summary.getRequiredDesign() > 0) { + requiredWorkers.add("디자인"); + previewTitle = previewTitle + "/디자인(" + summary.getRequiredDesign() + ")"; + } + if (summary.getRequiredPlanner() != null && summary.getRequiredPlanner() > 0) { + requiredWorkers.add("기획"); + previewTitle = previewTitle + "/기획(" + summary.getRequiredPlanner() + ")"; + } + if (summary.getRequiredAIEngineer() != null && summary.getRequiredAIEngineer() > 0) { + requiredWorkers.add("AI"); + previewTitle = previewTitle + "/AI(" + summary.getRequiredAIEngineer() + ")"; + } + previewTitle = previewTitle + "] " + summary.getTitle(); + + previewDTO.setPreviewTitle(previewTitle); + + previewDTO.setRequiredWorkers(requiredWorkers); + + // deadlineDate 설정: createdAt에서 30일을 더한 날짜 + LocalDate deadlineDate = summary.getCreatedAt().toLocalDate().plusDays(30); + previewDTO.setDeadlineDate(deadlineDate); + + // ProjectPreviewDTO 리스트에 추가 + projectPreviewDTOList.add(previewDTO); + } + + return new ProjectSummaryPagingResponseDTO(projectPreviewDTOList, projectSummaryPage.getTotalPages(), projectRepository.count()); + } + public ProjectDetailResponseDTO findProjectDetailByProjectId(Long projectId) { ProjectIdAndContent projectIdAndContents = projectRepository.findProjectIdAndContentByProjectId(projectId); List commentList = commentRepository.findCommentIdsByProjectId(projectId);