-
Notifications
You must be signed in to change notification settings - Fork 1
[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 3 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.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| 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.service.ReviewService; | ||
| import io.swagger.v3.oas.annotations.Operation; | ||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 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") | ||
|
goodispotato marked this conversation as resolved.
Outdated
|
||
| public ApiResTemplate createReview( | ||
| @RequestBody ReviewCreateReqDto reviewCreateReqDto, | ||
| Principal principal | ||
| ) { | ||
|
Comment on lines
+25
to
+30
|
||
| reviewService.createReview(principal, reviewCreateReqDto); | ||
| return ApiResTemplate.successWithNoContent(SuccessCode.SUCCESS); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Valid 어노테이션 추가하고, 응답 형식을 nocontent가 아닌 ReviewResDto로 data에 값을 채워서 보내주어서 생성시에도 값을 바로 확인할 수 있게 하면 좋을 것 같아요 !! |
||
| } | ||
|
||
| } | ||
| 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 { | ||
| ReviewReqDto reviewReqDto; | ||
| List<SpectrumReqDto> spectrumReqDtos; | ||
|
goodispotato marked this conversation as resolved.
Outdated
|
||
| } | ||
| 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,16 @@ | ||
| package com.sossbar.review.dto.response; | ||
|
|
||
| import com.sossbar.spectrumaxis.dto.response.SpectrumAxisResDto; | ||
| import com.sossbar.tag.dto.response.TagResDto; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public record ReviewResDto ( | ||
| String positiveFeedback, | ||
| String negativeFeedback, | ||
| Long revieweeId, | ||
| Long projectId, | ||
| List<TagResDto> tags, | ||
| List<SpectrumAxisResDto> spectrumAxes | ||
| ) { | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,53 @@ | ||
| 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 | ||
| @Setter | ||
|
goodispotato marked this conversation as resolved.
Outdated
|
||
| @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; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| package com.sossbar.review.entity; | ||
|
|
||
| import com.sossbar.spectrumaxis.entity.SpectrumAxis; | ||
| import jakarta.persistence.*; | ||
| import lombok.AccessLevel; | ||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| @Entity | ||
| @NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
| @AllArgsConstructor | ||
| @Builder | ||
| public class ReviewSpectrum { | ||
|
|
||
| @Id | ||
| @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| private Long reviewSpectrumId; | ||
|
|
||
| @ManyToOne(fetch = FetchType.LAZY) | ||
| @JoinColumn(name = "review_id") | ||
| private Review review; | ||
|
|
||
| @ManyToOne(fetch = FetchType.LAZY) | ||
| @JoinColumn(name = "spectrum_axis_id") | ||
| private SpectrumAxis spectrumAxis; | ||
|
|
||
| @Column | ||
| private Integer strength; | ||
|
|
||
| public void setReview(Review review) { | ||
| this.review = review; | ||
| } | ||
|
|
||
| public void setSpectrumAxis(SpectrumAxis spectrumAxis) { | ||
| this.spectrumAxis = spectrumAxis; | ||
| } | ||
|
|
||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| package com.sossbar.review.entity; | ||
|
|
||
| import com.sossbar.tag.entity.Tag; | ||
| import com.sossbar.user.entity.User; | ||
| import jakarta.persistence.*; | ||
| import lombok.AccessLevel; | ||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| @Entity | ||
| @NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
| @AllArgsConstructor | ||
| @Builder | ||
| public class ReviewTag { | ||
|
|
||
| @Id | ||
| @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| private Long reviewTagId; | ||
|
|
||
| @ManyToOne(fetch = FetchType.LAZY) | ||
| @JoinColumn(name = "review_id") | ||
| private Review review; | ||
|
|
||
| @ManyToOne(fetch = FetchType.LAZY) | ||
| @JoinColumn(name = "tag_id") | ||
| private Tag tag; | ||
|
|
||
| public void setReview(Review review) { | ||
| this.review = review; | ||
| } | ||
|
|
||
| public void setTag(Tag tag) { | ||
| this.tag = tag; | ||
| } | ||
|
|
||
| } |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,13 @@ | ||||||
| package com.sossbar.review.repository; | ||||||
|
|
||||||
| import com.sossbar.review.entity.Review; | ||||||
| import com.sossbar.user.entity.User; | ||||||
| import org.springframework.data.jpa.repository.JpaRepository; | ||||||
| import org.springframework.stereotype.Repository; | ||||||
|
|
||||||
| @Repository | ||||||
| public interface ReviewRepository extends JpaRepository<Review, Long> { | ||||||
|
|
||||||
| // 중복 리뷰 검증 | ||||||
| boolean existsByReviewerAndReviewee(User Reviewer, User Reviewee); | ||||||
|
goodispotato marked this conversation as resolved.
Outdated
|
||||||
| boolean existsByReviewerAndReviewee(User Reviewer, User Reviewee); | |
| boolean existsByReviewerAndReviewee(User reviewer, User reviewee); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| package com.sossbar.review.repository; | ||
|
|
||
| import com.sossbar.review.entity.ReviewSpectrum; | ||
| import org.springframework.data.jpa.repository.JpaRepository; | ||
| import org.springframework.stereotype.Repository; | ||
|
|
||
| @Repository | ||
| public interface ReviewSpectrumRepository extends JpaRepository<ReviewSpectrum, Long> { | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| package com.sossbar.review.repository; | ||
|
|
||
| import com.sossbar.review.entity.ReviewTag; | ||
| import org.springframework.data.jpa.repository.JpaRepository; | ||
| import org.springframework.stereotype.Repository; | ||
|
|
||
| @Repository | ||
| public interface ReviewTagRepository extends JpaRepository<ReviewTag, Long> { | ||
| } |
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를 추가해 일관성을 맞춰 주세요.