-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
🐛 Fix: resolve issue with review creation API
- Loading branch information
Showing
16 changed files
with
398 additions
and
1 deletion.
There are no files selected for viewing
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 |
---|---|---|
|
@@ -36,3 +36,4 @@ out/ | |
|
||
### VS Code ### | ||
.vscode/ | ||
/src/main/resources/application.yml |
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
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
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,41 @@ | ||
package umc.moviein.domain; | ||
|
||
import jakarta.persistence.*; | ||
import lombok.*; | ||
import umc.moviein.domain.common.BaseEntity; | ||
import umc.moviein.domain.mapping.TagReview; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
@Entity | ||
@Setter | ||
@Getter | ||
@Builder | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Table(name = "reveiw") | ||
public class Review extends BaseEntity { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long reviewId; | ||
|
||
@Column(nullable = false, columnDefinition = "int default 10") | ||
private Integer rating; | ||
@Column(nullable = false, length = 50) | ||
private String content; | ||
@Column(nullable = false) | ||
private boolean isSpoiled = false; | ||
|
||
@OneToMany(mappedBy = "review") | ||
List<TagReview> tagReviewList = new ArrayList<>(); | ||
|
||
private Long movieId; | ||
|
||
@ManyToOne(fetch = FetchType.LAZY) | ||
@JoinColumn(name = "user_id") | ||
private User user; | ||
|
||
|
||
} |
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,29 @@ | ||
package umc.moviein.domain; | ||
|
||
|
||
import jakarta.persistence.*; | ||
import lombok.*; | ||
import umc.moviein.domain.mapping.TagReview; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
@Entity | ||
@Setter | ||
@Getter | ||
@Builder | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Table(name = "tag") | ||
public class Tag { | ||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long tagId; | ||
|
||
@Column(nullable = true) | ||
private String name; | ||
|
||
@OneToMany(mappedBy = "tag") | ||
List<TagReview> tagReviewList = new ArrayList<>(); | ||
|
||
} |
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
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,26 @@ | ||
package umc.moviein.domain.mapping; | ||
|
||
import jakarta.persistence.*; | ||
import lombok.*; | ||
import umc.moviein.domain.Review; | ||
import umc.moviein.domain.Tag; | ||
|
||
@Entity | ||
@Setter | ||
@Getter | ||
@Builder | ||
@AllArgsConstructor | ||
@NoArgsConstructor | ||
@Table(name = "tag-review") | ||
public class TagReview { | ||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long tagReviewId; | ||
|
||
@ManyToOne(fetch = FetchType.LAZY) | ||
@JoinColumn(name = "review_id") | ||
private Review review; | ||
@ManyToOne(fetch = FetchType.LAZY) | ||
@JoinColumn(name = "tag_id") | ||
private Tag tag; | ||
} |
14 changes: 14 additions & 0 deletions
14
src/main/java/umc/moviein/repository/ReviewRepository.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,14 @@ | ||
package umc.moviein.repository; | ||
|
||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import umc.moviein.domain.Review; | ||
|
||
import java.util.List; | ||
import java.util.Optional; | ||
|
||
@Repository | ||
public interface ReviewRepository extends JpaRepository<Review, Long> { | ||
|
||
Optional<List<Review>> findAllByMovieId(Long movieId); | ||
} |
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,8 @@ | ||
package umc.moviein.repository; | ||
|
||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import umc.moviein.domain.Tag; | ||
@Repository | ||
public interface TagRespsitory extends JpaRepository<Tag, Long> { | ||
} |
17 changes: 17 additions & 0 deletions
17
src/main/java/umc/moviein/repository/TagReviewRepository.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,17 @@ | ||
package umc.moviein.repository; | ||
|
||
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 umc.moviein.domain.Tag; | ||
import umc.moviein.domain.mapping.TagReview; | ||
|
||
import java.util.List; | ||
|
||
@Repository | ||
public interface TagReviewRepository extends JpaRepository<TagReview, Long> { | ||
|
||
@Query("SELECT t FROM TagReview tr JOIN tr.tag t WHERE tr.review.reviewId = :reviewId") | ||
List<Tag> findTagsByReviewId(@Param("reviewId") Long reviewId); | ||
} |
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,88 @@ | ||
package umc.moviein.service; | ||
|
||
import lombok.Builder; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import umc.moviein.repository.UserRepository; | ||
import umc.moviein.web.dto.MovieInfoResponseDto; | ||
import umc.moviein.web.dto.ReviewRequestDto; | ||
import umc.moviein.web.dto.ReviewResponseDto; | ||
import umc.moviein.web.dto.TagDto; | ||
import umc.moviein.domain.Review; | ||
import umc.moviein.domain.Tag; | ||
import umc.moviein.domain.mapping.TagReview; | ||
import umc.moviein.repository.ReviewRepository; | ||
import umc.moviein.repository.TagRespsitory; | ||
import umc.moviein.repository.TagReviewRepository; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
import static umc.moviein.jwt.SecurityUtil.getCurrentMemberId; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
@Builder | ||
public class ReviewService { | ||
final ReviewRepository reviewRepository; | ||
final TagRespsitory tagRespsitory; | ||
final TagReviewRepository tagReviewRepository; | ||
final UserRepository userRepository; | ||
|
||
public Review registerReview(ReviewRequestDto dto) { | ||
Review review = ReviewRequestDto.convertDtoToEntity(dto); | ||
// Todo 예외처리 | ||
review.setUser(userRepository.findById(getCurrentMemberId()).orElseThrow(() -> new IllegalArgumentException("not valid user in review"))); | ||
reviewRepository.save(review); | ||
tagReviewRepository.saveAll(createOrUpdateTags(dto.getTags(), review)); | ||
|
||
|
||
return review; | ||
} | ||
|
||
public List<TagReview> createOrUpdateTags(List<Integer> tags, Review review) { | ||
List<TagReview> tagReviews = new ArrayList<>(); | ||
for (Integer tagId : tags) { | ||
// 태그 조회 | ||
Tag tag = tagRespsitory.findById(tagId.longValue()) | ||
.orElseGet(() -> { | ||
// 태그가 없으면 새로 생성 | ||
Tag newTag = new Tag(); | ||
newTag.setTagId(tagId.longValue()); // ID 설정 (필요한 경우) | ||
newTag.setName("New Tag " + tagId); // 태그 이름 설정 (적절히 변경) | ||
return tagRespsitory.save(newTag); | ||
}); | ||
|
||
// 태그 리뷰 생성 | ||
TagReview tagReview = TagReview.builder() | ||
.review(review) | ||
.tag(tag) | ||
.build(); | ||
tagReviews.add(tagReview); | ||
} | ||
return tagReviews; | ||
|
||
} | ||
public MovieInfoResponseDto findReviewsByMovieId(Long movieId) { | ||
// 영화 id로 리뷰 필터링 | ||
List<Review> reviewList = reviewRepository.findAllByMovieId(movieId) | ||
.orElseThrow(() -> new IllegalArgumentException("No reviews found for movieId: " + movieId)); | ||
|
||
List<ReviewResponseDto> reviews = reviewList.stream() | ||
.map(review -> { | ||
// 태그 정보 | ||
List<TagDto> tagDtos = TagDto.convertTagDtoTOList( | ||
tagReviewRepository.findTagsByReviewId(review.getReviewId())); | ||
|
||
return ReviewResponseDto.convertEntityToDto(review, tagDtos); | ||
}) | ||
.collect(Collectors.toList()); | ||
|
||
return MovieInfoResponseDto.builder() | ||
.movieId(movieId) | ||
.reviews(reviews) | ||
.build(); | ||
} | ||
} | ||
|
38 changes: 38 additions & 0 deletions
38
src/main/java/umc/moviein/web/controller/ReviewController.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 umc.moviein.web.controller; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.*; | ||
import umc.moviein.apiPayload.ApiResponse; | ||
import umc.moviein.web.dto.MovieInfoResponseDto; | ||
import umc.moviein.web.dto.ReviewRequestDto; | ||
import umc.moviein.domain.Review; | ||
import umc.moviein.service.ReviewService; | ||
|
||
import static org.springframework.http.ResponseEntity.ok; | ||
|
||
@RestController | ||
@RequestMapping("/api") | ||
@RequiredArgsConstructor | ||
public class ReviewController { | ||
final ReviewService reviewService; | ||
|
||
@PostMapping("/review") | ||
public ResponseEntity<?> createReview(@RequestBody ReviewRequestDto reviewDto) { | ||
try { | ||
Review review = reviewService.registerReview(reviewDto); | ||
return ResponseEntity.ok("Review created successfully"); | ||
} catch (Exception e) { | ||
// 예외 처리 (선택적으로 로깅 추가 가능) | ||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) | ||
.body("Failed to create review: " + e.getMessage()); | ||
} | ||
|
||
} | ||
@GetMapping("/reviews/{movieId}") | ||
public ResponseEntity<ApiResponse<MovieInfoResponseDto>> findReviews(@PathVariable(name = "movieId") Long movieId) { | ||
MovieInfoResponseDto reviews = reviewService.findReviewsByMovieId(movieId); | ||
return ok(ApiResponse.onSuccess(reviews)); | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
src/main/java/umc/moviein/web/dto/MovieInfoResponseDto.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,17 @@ | ||
package umc.moviein.web.dto; | ||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.Builder; | ||
import lombok.Data; | ||
import lombok.NoArgsConstructor; | ||
|
||
import java.util.List; | ||
|
||
@Data | ||
@Builder | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
public class MovieInfoResponseDto { | ||
private Long movieId; | ||
private List<ReviewResponseDto> reviews; | ||
} |
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,33 @@ | ||
package umc.moviein.web.dto; | ||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.Builder; | ||
import lombok.Data; | ||
import lombok.NoArgsConstructor; | ||
import umc.moviein.domain.Review; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
@Data | ||
@Builder | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
public class ReviewRequestDto { | ||
|
||
Long movieId; | ||
Integer rating; | ||
List<Integer> tags = new ArrayList<>(); | ||
String content; | ||
boolean isSpoiled; | ||
|
||
public static Review convertDtoToEntity(ReviewRequestDto dto) { | ||
return Review.builder() | ||
.movieId(dto.movieId) | ||
.rating(dto.rating) | ||
.content(dto.content) | ||
.isSpoiled(dto.isSpoiled) | ||
.build(); | ||
} | ||
|
||
} |
Oops, something went wrong.