-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature: 특정 프로젝트 상세 정보 반환 기능 구현 (#100)
* feat: 특정 프로젝트 상세 정보 반환 기능 구현 - 프로젝트 더보기 페이지에 반환할 정보 - 이름, 소개글, 깃허브 링크, 비헨스 링크, 프로젝트 링크, 기수, 사진 목록, 멤버 목록 * refactor: 코드 명확성 및 일관성 개선 - 일관된 트랜잭션 관리를 위해 getProjectDetail 클래스에 @transactional 어노테이션을 적용했습니다. - ProjectDetailResponse에서 generationNumber도 반환되게 수정 - 코드 일관성을 위해 project 관련 repository 메소드 호출 방식 변경
- Loading branch information
1 parent
caba409
commit be377fb
Showing
9 changed files
with
171 additions
and
0 deletions.
There are no files selected for viewing
27 changes: 27 additions & 0 deletions
27
src/main/java/org/cotato/csquiz/api/project/controller/ProjectController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package org.cotato.csquiz.api.project.controller; | ||
|
||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
import lombok.RequiredArgsConstructor; | ||
import org.cotato.csquiz.api.project.dto.ProjectDetailResponse; | ||
import org.cotato.csquiz.domain.generation.service.ProjectService; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.GetMapping; | ||
import org.springframework.web.bind.annotation.PathVariable; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
@Tag(name = "프로젝트 API") | ||
@RestController | ||
@RequiredArgsConstructor | ||
@RequestMapping("/v2/api/projects") | ||
public class ProjectController { | ||
|
||
private final ProjectService projectService; | ||
|
||
@Operation(summary = "특정 프로젝트 상세 정보 조회 API") | ||
@GetMapping("/{projectId}") | ||
public ResponseEntity<ProjectDetailResponse> getProjectDetail(@PathVariable("projectId") Long projectId) { | ||
return ResponseEntity.ok().body(projectService.getProjectDetail(projectId)); | ||
} | ||
} |
38 changes: 38 additions & 0 deletions
38
src/main/java/org/cotato/csquiz/api/project/dto/ProjectDetailResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package org.cotato.csquiz.api.project.dto; | ||
|
||
import java.util.List; | ||
import org.cotato.csquiz.domain.generation.entity.Project; | ||
import org.cotato.csquiz.domain.generation.entity.ProjectImage; | ||
import org.cotato.csquiz.domain.generation.entity.ProjectMember; | ||
|
||
public record ProjectDetailResponse( | ||
Long projectId, | ||
String name, | ||
String introduction, | ||
String githubUrl, | ||
String behanceUrl, | ||
String projectUrl, | ||
Long generationId, | ||
Integer generationNumber, | ||
List<ProjectImageInfoResponse> imageInfos, | ||
List<ProjectMemberInfoResponse> memberInfos | ||
) { | ||
public static ProjectDetailResponse of(Project project, Integer generationNumber, List<ProjectImage> projectImages, List<ProjectMember> projectMembers){ | ||
return new ProjectDetailResponse( | ||
project.getId(), | ||
project.getName(), | ||
project.getIntroduction(), | ||
project.getGithubUrl(), | ||
project.getBehanceUrl(), | ||
project.getProjectUrl(), | ||
project.getGenerationId(), | ||
generationNumber, | ||
projectImages.stream() | ||
.map(ProjectImageInfoResponse::from) | ||
.toList(), | ||
projectMembers.stream() | ||
.map(ProjectMemberInfoResponse::from) | ||
.toList() | ||
); | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
src/main/java/org/cotato/csquiz/api/project/dto/ProjectImageInfoResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package org.cotato.csquiz.api.project.dto; | ||
|
||
import org.cotato.csquiz.domain.generation.entity.ProjectImage; | ||
import org.cotato.csquiz.domain.generation.enums.ProjectImageType; | ||
|
||
public record ProjectImageInfoResponse( | ||
Long imageId, | ||
String imageUrl, | ||
ProjectImageType projectImageType | ||
) { | ||
public static ProjectImageInfoResponse from(ProjectImage projectImage) { | ||
return new ProjectImageInfoResponse( | ||
projectImage.getId(), | ||
projectImage.getS3Info().getUrl(), | ||
projectImage.getProjectImageType() | ||
); | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
src/main/java/org/cotato/csquiz/api/project/dto/ProjectMemberInfoResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package org.cotato.csquiz.api.project.dto; | ||
|
||
import org.cotato.csquiz.domain.auth.enums.MemberPosition; | ||
import org.cotato.csquiz.domain.generation.entity.ProjectMember; | ||
|
||
public record ProjectMemberInfoResponse( | ||
Long memberId, | ||
String name, | ||
MemberPosition memberPosition | ||
) { | ||
public static ProjectMemberInfoResponse from(ProjectMember projectMember) { | ||
return new ProjectMemberInfoResponse( | ||
projectMember.getId(), | ||
projectMember.getName(), | ||
projectMember.getMemberPosition() | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10 changes: 10 additions & 0 deletions
10
src/main/java/org/cotato/csquiz/domain/generation/repository/ProjectImageRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package org.cotato.csquiz.domain.generation.repository; | ||
|
||
import java.util.List; | ||
import org.cotato.csquiz.domain.generation.entity.ProjectImage; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface ProjectImageRepository extends JpaRepository<ProjectImage, Long> { | ||
List<ProjectImage> findByProjectId(Long projectId); | ||
List<ProjectImage> findAllByProjectId(Long projectId); | ||
} |
9 changes: 9 additions & 0 deletions
9
src/main/java/org/cotato/csquiz/domain/generation/repository/ProjectMemberRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package org.cotato.csquiz.domain.generation.repository; | ||
|
||
import java.util.List; | ||
import org.cotato.csquiz.domain.generation.entity.ProjectMember; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface ProjectMemberRepository extends JpaRepository<ProjectMember, Long> { | ||
List<ProjectMember> findAllByProjectId(Long projectId); | ||
} |
7 changes: 7 additions & 0 deletions
7
src/main/java/org/cotato/csquiz/domain/generation/repository/ProjectRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package org.cotato.csquiz.domain.generation.repository; | ||
|
||
import org.cotato.csquiz.domain.generation.entity.Project; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface ProjectRepository extends JpaRepository<Project, Long>{ | ||
} |
39 changes: 39 additions & 0 deletions
39
src/main/java/org/cotato/csquiz/domain/generation/service/ProjectService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package org.cotato.csquiz.domain.generation.service; | ||
|
||
import jakarta.persistence.EntityNotFoundException; | ||
import java.util.List; | ||
import lombok.RequiredArgsConstructor; | ||
import org.cotato.csquiz.api.project.dto.ProjectDetailResponse; | ||
import org.cotato.csquiz.domain.generation.entity.Project; | ||
import org.cotato.csquiz.domain.generation.entity.ProjectImage; | ||
import org.cotato.csquiz.domain.generation.entity.ProjectMember; | ||
import org.cotato.csquiz.domain.generation.repository.GenerationRepository; | ||
import org.cotato.csquiz.domain.generation.repository.ProjectImageRepository; | ||
import org.cotato.csquiz.domain.generation.repository.ProjectMemberRepository; | ||
import org.cotato.csquiz.domain.generation.repository.ProjectRepository; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@Service | ||
@Transactional(readOnly = true) | ||
@RequiredArgsConstructor | ||
public class ProjectService { | ||
|
||
private final ProjectRepository projectRepository; | ||
private final ProjectImageRepository projectImageRepository; | ||
private final ProjectMemberRepository projectMemberRepository; | ||
private final GenerationRepository generationRepository; | ||
|
||
@Transactional | ||
public ProjectDetailResponse getProjectDetail(Long projectId) { | ||
|
||
Project project = projectRepository.findById(projectId) | ||
.orElseThrow(() -> new EntityNotFoundException("찾으려는 프로젝트가 존재하지 않습니다.")); | ||
|
||
List<ProjectImage> images = projectImageRepository.findAllByProjectId(projectId); | ||
List<ProjectMember> members = projectMemberRepository.findAllByProjectId(projectId); | ||
Integer generationNumber = generationRepository.findGenerationNumberByGenerationId(project.getGenerationId()); | ||
|
||
return ProjectDetailResponse.of(project, generationNumber, images, members); | ||
} | ||
} |