diff --git a/src/main/java/com/mtvs/devlinkbackend/comment/repository/CommentRepository.java b/src/main/java/com/mtvs/devlinkbackend/comment/repository/CommentRepository.java index c467a3d..393d348 100644 --- a/src/main/java/com/mtvs/devlinkbackend/comment/repository/CommentRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/comment/repository/CommentRepository.java @@ -2,6 +2,8 @@ import com.mtvs.devlinkbackend.comment.entity.Comment; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -10,4 +12,7 @@ public interface CommentRepository extends JpaRepository { List findCommentsByAccountId(String accountId); List findCommentsByProject_ProjectId(Long requestId); + + @Query("SELECT c FROM Comment c WHERE c.project.projectId = :projectId") + List findCommentIdsByProjectId(@Param("projectId") Long projectId); } diff --git a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectSummaryController.java b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectSummaryController.java new file mode 100644 index 0000000..cab4327 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectSummaryController.java @@ -0,0 +1,43 @@ +package com.mtvs.devlinkbackend.project.controller; + +import com.mtvs.devlinkbackend.project.dto.response.ProjectDetailResponseDTO; +import com.mtvs.devlinkbackend.project.dto.response.ProjectSummaryResponseDTO; +import com.mtvs.devlinkbackend.project.service.ProjectDetailService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/project") +public class ProjectSummaryController { + private final ProjectDetailService projectDetailService; + + public ProjectSummaryController(ProjectDetailService projectDetailService) { + this.projectDetailService = projectDetailService; + } + + @Operation(summary = "전체 프로젝트 요약 조회", description = "전체 프로젝트 요약을 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "성공적으로 조회됨"), + @ApiResponse(responseCode = "404", description = "찾을 수 없음") + }) + @GetMapping("/summary") + public ResponseEntity findAllSummary() { + ProjectSummaryResponseDTO summary = projectDetailService.findAllProjectSummary(); + return summary != null ? ResponseEntity.ok(summary) : ResponseEntity.notFound().build(); + } + + @Operation(summary = "전체 프로젝트 세부 내용 조회", description = "전체 프로젝트 세부 내용을 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "성공적으로 조회됨"), + @ApiResponse(responseCode = "404", description = "찾을 수 없음") + }) + @GetMapping("/{projectId}/detail") + public ResponseEntity findProjectDetailByProjectId( + @PathVariable(name = "projectId") Long projectId) { + ProjectDetailResponseDTO detail = projectDetailService.findProjectDetailByProjectId(projectId); + return detail != null ? ResponseEntity.ok(detail) : ResponseEntity.notFound().build(); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectDetailResponseDTO.java b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectDetailResponseDTO.java new file mode 100644 index 0000000..bc538a7 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectDetailResponseDTO.java @@ -0,0 +1,18 @@ +package com.mtvs.devlinkbackend.project.dto.response; + +import com.mtvs.devlinkbackend.comment.entity.Comment; +import com.mtvs.devlinkbackend.project.repository.projection.ProjectIdAndContent; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ProjectDetailResponseDTO { + private ProjectIdAndContent projectIdAndContent; + private List commentIdList; + private List supportedTeamIdList; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectSummaryResponseDTO.java b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectSummaryResponseDTO.java new file mode 100644 index 0000000..cf38fe0 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/dto/response/ProjectSummaryResponseDTO.java @@ -0,0 +1,15 @@ +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 ProjectSummaryResponseDTO { + private List data; +} 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 2bb19c3..fe51d3f 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/repository/ProjectRepository.java @@ -1,6 +1,8 @@ package com.mtvs.devlinkbackend.project.repository; import com.mtvs.devlinkbackend.project.entity.Project; +import com.mtvs.devlinkbackend.project.repository.projection.ProjectIdAndContent; +import com.mtvs.devlinkbackend.project.repository.projection.ProjectSummary; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,6 +11,7 @@ import org.springframework.stereotype.Repository; import java.time.LocalDateTime; +import java.util.List; @Repository public interface ProjectRepository extends JpaRepository { @@ -46,4 +49,8 @@ Page findProjectsWithLargerRequirements( @Param("requiredAIEngineer") Integer requiredAIEngineer, Pageable pageable ); + + List findAllBy(); + + ProjectIdAndContent findProjectIdAndContentByProjectId(Long projectId); } diff --git a/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectIdAndContent.java b/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectIdAndContent.java new file mode 100644 index 0000000..297113a --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectIdAndContent.java @@ -0,0 +1,6 @@ +package com.mtvs.devlinkbackend.project.repository.projection; + +public interface ProjectIdAndContent { + Long getProjectId(); + String getContent(); +} 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 new file mode 100644 index 0000000..38b096b --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/repository/projection/ProjectSummary.java @@ -0,0 +1,25 @@ +package com.mtvs.devlinkbackend.project.repository.projection; + +import java.time.LocalDateTime; +import java.util.Map; + +public interface ProjectSummary { + Long getProjectId(); + String getWorkScope(); + String getWorkType(); + String getProgressClassification(); + String getCompanyName(); + String getTitle(); + Integer getRequiredClient(); + Integer getRequiredServer(); + Integer getRequiredDesign(); + Integer getRequiredPlanner(); + Integer getRequiredAIEngineer(); + LocalDateTime getStartDateTime(); + LocalDateTime getEndDateTime(); + Integer getEstimatedCost(); + String getAccountId(); + LocalDateTime getCreatedAt(); + LocalDateTime getModifiedAt(); + Map getProjectVector(); +} diff --git a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectDetailService.java b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectDetailService.java new file mode 100644 index 0000000..a9dd6b1 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectDetailService.java @@ -0,0 +1,39 @@ +package com.mtvs.devlinkbackend.project.service; + +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.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.stereotype.Service; + +import java.util.List; + +@Service +public class ProjectDetailService { + private final ProjectRepository projectRepository; + private final CommentRepository commentRepository; + private final SupportRepository supportRepository; + + public ProjectDetailService(ProjectRepository projectRepository, CommentRepository commentRepository, SupportRepository supportRepository) { + this.projectRepository = projectRepository; + this.commentRepository = commentRepository; + this.supportRepository = supportRepository; + } + + public ProjectSummaryResponseDTO findAllProjectSummary() { + List projectSummaryList = projectRepository.findAllBy(); + return new ProjectSummaryResponseDTO(projectSummaryList); + } + + public ProjectDetailResponseDTO findProjectDetailByProjectId(Long projectId) { + ProjectIdAndContent projectIdAndContents = projectRepository.findProjectIdAndContentByProjectId(projectId); + List commentList = commentRepository.findCommentIdsByProjectId(projectId); + List supportedTeamIdList = supportRepository.findTeamIdByProjectId(projectId); + + return new ProjectDetailResponseDTO(projectIdAndContents, commentList, supportedTeamIdList); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java b/src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java index ecbf827..149a7fc 100644 --- a/src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/support/repository/SupportRepository.java @@ -2,6 +2,8 @@ import com.mtvs.devlinkbackend.support.entity.Support; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -10,4 +12,6 @@ public interface SupportRepository extends JpaRepository { List findSupportsByProjectId(Long projectId); List findSupportsByTeamId(Long teamId); + @Query("SELECT s.teamId FROM Support s WHERE s.projectId = :projectId") + List findTeamIdByProjectId(@Param("projectId") Long projectId); }