-
Notifications
You must be signed in to change notification settings - Fork 0
[Feat/#5] - 후기 작성 구현 #12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
9b06461
63119b5
c8991d1
61fb376
a023268
1094311
535b1e9
ad05049
340093c
8eff943
b58471b
47d6bb4
49e4ad2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Large diffs are not rendered by default.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| package com.sossbar.review.controller; | ||
|
|
||
| import com.sossbar.global.common.code.SuccessCode; | ||
| import com.sossbar.global.common.template.ApiResTemplate; | ||
| import com.sossbar.review.dto.request.ReviewCreateReqDto; | ||
| import com.sossbar.review.dto.response.ReviewCreateResDto; | ||
| import com.sossbar.review.service.ReviewService; | ||
| 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.web.bind.annotation.PostMapping; | ||
| import org.springframework.web.bind.annotation.RequestBody; | ||
| import org.springframework.web.bind.annotation.RestController; | ||
|
|
||
| import java.security.Principal; | ||
|
|
||
| @Tag(name = "Review API", description = "후기 관련 API") | ||
| @RestController | ||
| @RequiredArgsConstructor | ||
| public class ReviewController { | ||
|
|
||
| private final ReviewService reviewService; | ||
|
|
||
| @Operation(summary = "후기 작성", description = "사용자는 로그인 후 다른 사용자에 대한 후기를 남길 수 있습니다.") | ||
| @PostMapping("/api/v1/reviews") | ||
| public ApiResTemplate<ReviewCreateResDto> createReview( | ||
| @RequestBody @Valid ReviewCreateReqDto reviewCreateReqDto, | ||
| Principal principal | ||
| ) { | ||
|
Comment on lines
+25
to
+30
|
||
| ReviewCreateResDto reviewCreateResDto = reviewService.createReview(principal, reviewCreateReqDto); | ||
|
|
||
| return ApiResTemplate.successResponse(SuccessCode.CREATE_SUCCESS, reviewCreateResDto); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| package com.sossbar.review.dto.request; | ||
|
|
||
| import lombok.Getter; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| // 통합 DTO | ||
| @Getter | ||
| public class ReviewCreateReqDto { | ||
| private ReviewReqDto reviewReqDto; | ||
| private List<SpectrumReqDto> spectrumReqDtos; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| package com.sossbar.review.dto.request; | ||
|
|
||
| import com.sossbar.projects.entity.Project; | ||
| import com.sossbar.review.entity.Review; | ||
| import com.sossbar.user.entity.User; | ||
| import jakarta.validation.constraints.NotBlank; | ||
| import jakarta.validation.constraints.NotNull; | ||
| import jakarta.validation.constraints.Positive; | ||
| import jakarta.validation.constraints.Size; | ||
| import lombok.Getter; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| // 리뷰 + 태그 DTO | ||
| @Getter | ||
| public class ReviewReqDto { | ||
| @NotBlank | ||
| @Size(min = 10) | ||
| private String positiveFeedback; | ||
|
|
||
| @Size(min = 10) | ||
| private String negativeFeedback; | ||
|
|
||
| @NotNull | ||
| @Positive | ||
| private Long revieweeId; | ||
|
|
||
| @NotNull | ||
| @Positive | ||
| private Long projectId; | ||
|
|
||
| private List<Long> tagIds; | ||
|
|
||
| public Review toEntity(User reviewer, User reviewee, Project project) { | ||
| return Review.builder() | ||
| .positiveFeedback(positiveFeedback) | ||
| .negativeFeedback(negativeFeedback) | ||
| .reviewer(reviewer) | ||
| .reviewee(reviewee) | ||
| .project(project) | ||
| .build(); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,12 @@ | ||||||||||
| package com.sossbar.review.dto.request; | ||||||||||
|
|
||||||||||
|
|
||||||||||
| import lombok.Getter; | ||||||||||
|
|
||||||||||
|
|
||||||||||
| // 스펙트럼 항목 하나 당 DTO | ||||||||||
| @Getter | ||||||||||
| public class SpectrumReqDto { | ||||||||||
| Long spectrumAxisId; | ||||||||||
| Integer spectrumStrength; | ||||||||||
|
Comment on lines
+10
to
+11
|
||||||||||
| Long spectrumAxisId; | |
| Integer spectrumStrength; | |
| private Long spectrumAxisId; | |
| private Integer spectrumStrength; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| package com.sossbar.review.dto.response; | ||
|
|
||
| import com.sossbar.review.entity.Review; | ||
| import com.sossbar.review.entity.ReviewSpectrum; | ||
| import com.sossbar.review.entity.ReviewTag; | ||
| import com.sossbar.tag.dto.response.TagResDto; | ||
| import lombok.Builder; | ||
|
|
||
| import java.util.List; | ||
| import java.util.stream.Collectors; | ||
|
|
||
| @Builder | ||
| public record ReviewCreateResDto ( | ||
| ReviewResDto reviewResDto, | ||
| List<SpectrumResDto> spectrumResDtos | ||
| ) { | ||
| public static ReviewCreateResDto from(Review savedReview, List<ReviewTag> reviewTags, List<ReviewSpectrum> reviewSpectrums) { | ||
| List<TagResDto> tagResDtos = reviewTags.stream() | ||
| .map(reviewTag -> new TagResDto( | ||
| reviewTag.getTag().getTagId(), | ||
| reviewTag.getTag().getTagName() | ||
| )) | ||
| .collect(Collectors.toList()); | ||
|
|
||
| ReviewResDto reviewResDto = new ReviewResDto( | ||
| savedReview.getPositiveFeedback(), | ||
| savedReview.getNegativeFeedback(), | ||
| savedReview.getReviewee().getId(), | ||
| savedReview.getProject().getProjectId(), | ||
| tagResDtos | ||
| ); | ||
|
|
||
| List<SpectrumResDto> spectrumResDtos = reviewSpectrums.stream() | ||
| .map(reviewSpectrum -> SpectrumResDto.builder() | ||
| .spectrumAxisId(reviewSpectrum.getSpectrumAxis().getSpectrumAxisId()) | ||
| .spectrumStrength(reviewSpectrum.getStrength()) | ||
| .build()) | ||
| .collect(Collectors.toList()); | ||
|
|
||
| return ReviewCreateResDto.builder() | ||
| .reviewResDto(reviewResDto) | ||
| .spectrumResDtos(spectrumResDtos) | ||
| .build(); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| package com.sossbar.review.dto.response; | ||
|
|
||
| import com.sossbar.tag.dto.response.TagResDto; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public record ReviewResDto ( | ||
| String positiveFeedback, | ||
| String negativeFeedback, | ||
| Long revieweeId, | ||
| Long projectId, | ||
| List<TagResDto> tagResDtos | ||
| ) { | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| package com.sossbar.review.dto.response; | ||
|
|
||
| import lombok.Builder; | ||
|
|
||
| @Builder | ||
| public record SpectrumResDto ( | ||
| Long spectrumAxisId, | ||
| Integer spectrumStrength | ||
| ) { | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,52 @@ | ||
| package com.sossbar.review.entity; | ||
|
|
||
| import com.sossbar.projects.entity.Project; | ||
| import com.sossbar.user.entity.User; | ||
| import jakarta.persistence.*; | ||
| import lombok.*; | ||
|
|
||
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| @Entity | ||
| @Getter | ||
| @NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
| public class Review { | ||
|
Comment on lines
+11
to
+14
|
||
|
|
||
| @Id | ||
| @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| private Long reviewId; | ||
|
|
||
| @Column | ||
| private String positiveFeedback; | ||
|
|
||
| @Column | ||
| private String negativeFeedback; | ||
|
|
||
| @ManyToOne(fetch = FetchType.LAZY) | ||
| @JoinColumn(name = "reviewer_id") | ||
| private User reviewer; | ||
|
|
||
| @ManyToOne(fetch = FetchType.LAZY) | ||
| @JoinColumn(name = "reviewee_id") | ||
| private User reviewee; | ||
|
|
||
| @ManyToOne(fetch = FetchType.LAZY) | ||
| @JoinColumn(name = "project_id") | ||
| private Project project; | ||
|
|
||
| @OneToMany(mappedBy = "review", cascade = CascadeType.ALL, orphanRemoval = true) | ||
| private List<ReviewTag> reviewTags = new ArrayList<>(); | ||
|
|
||
| @OneToMany(mappedBy = "review", cascade = CascadeType.ALL, orphanRemoval = true) | ||
| private List<ReviewSpectrum> reviewSpectrums = new ArrayList<>(); | ||
|
|
||
| @Builder | ||
| public Review(String positiveFeedback, String negativeFeedback, User reviewer, User reviewee, Project project) { | ||
| this.positiveFeedback = positiveFeedback; | ||
| this.negativeFeedback = negativeFeedback; | ||
| this.reviewer = reviewer; | ||
| this.reviewee = reviewee; | ||
| this.project = project; | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 프로젝트의 다른 컨트롤러들은 공통 Swagger 응답 템플릿을 위해 클래스에
@SwaggerApiResTemplate를 붙이고 있습니다(예:UserController,ProjectController). ReviewController에도 동일한 템플릿을 적용하지 않으면 스웨거 응답 스펙이 컨트롤러별로 달라질 수 있으니, 필요하다면 클래스 레벨에@SwaggerApiResTemplate를 추가해 일관성을 맞춰 주세요.