diff --git a/src/main/java/com/webservice/algorithmchef/controller/RecipeReviewController.java b/src/main/java/com/webservice/algorithmchef/controller/RecipeReviewController.java new file mode 100644 index 0000000..6a99396 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/controller/RecipeReviewController.java @@ -0,0 +1,35 @@ +package com.webservice.algorithmchef.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.webservice.algorithmchef.dto.recipereview.RecipeReviewRequest; +import com.webservice.algorithmchef.dto.recipereview.RecipeReviewResponse; +import com.webservice.algorithmchef.service.RecipeReviewService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class RecipeReviewController { + + private final RecipeReviewService rService; + + @PostMapping("/recipe/review") + public ResponseEntity makeReview(@RequestBody RecipeReviewRequest request, + @AuthenticationPrincipal UserDetails userDetails){ + try { + String userId = userDetails.getUsername(); + RecipeReviewResponse response = rService.makeReview(request, userId); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/recipereview/RecipeReviewRequest.java b/src/main/java/com/webservice/algorithmchef/dto/recipereview/RecipeReviewRequest.java new file mode 100644 index 0000000..f04a4f6 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/recipereview/RecipeReviewRequest.java @@ -0,0 +1,13 @@ +package com.webservice.algorithmchef.dto.recipereview; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class RecipeReviewRequest { + + private String name; + private float rating; + private String content; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/recipereview/RecipeReviewResponse.java b/src/main/java/com/webservice/algorithmchef/dto/recipereview/RecipeReviewResponse.java new file mode 100644 index 0000000..2333038 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/recipereview/RecipeReviewResponse.java @@ -0,0 +1,21 @@ +package com.webservice.algorithmchef.dto.recipereview; + +import com.webservice.algorithmchef.model.RecipeReview; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class RecipeReviewResponse { + + private String name; + private String userId; + private float rating; + + public RecipeReviewResponse(RecipeReview review) { + this.name = review.getRecipe().getName(); + this.userId = review.getUser().getUserId(); + this.rating = review.getRating(); + } +} diff --git a/src/main/java/com/webservice/algorithmchef/model/Ingredient.java b/src/main/java/com/webservice/algorithmchef/model/Ingredient.java index d4a6264..008c20f 100644 --- a/src/main/java/com/webservice/algorithmchef/model/Ingredient.java +++ b/src/main/java/com/webservice/algorithmchef/model/Ingredient.java @@ -46,7 +46,4 @@ public class Ingredient { @OneToMany(mappedBy = "ingredient",orphanRemoval = true,cascade = CascadeType.ALL) private List ingredients; - @OneToMany(mappedBy = "ingredient",orphanRemoval = true,cascade = CascadeType.ALL) - private List recipeIngredients; - } diff --git a/src/main/java/com/webservice/algorithmchef/model/Recipe.java b/src/main/java/com/webservice/algorithmchef/model/Recipe.java index 930a2dd..c63007a 100644 --- a/src/main/java/com/webservice/algorithmchef/model/Recipe.java +++ b/src/main/java/com/webservice/algorithmchef/model/Recipe.java @@ -30,7 +30,7 @@ public class Recipe { @Column(name="recipe_id") private Long id; - @Column(nullable = false, unique = true) + @Column(nullable = false) private String name; @Lob @@ -45,14 +45,24 @@ public class Recipe { @Column(nullable = false) private String type; + @Column(nullable = false) + @Lob + private String neededIngredients; + @Column(nullable = false) private double kcal; - @OneToMany(mappedBy = "recipe", orphanRemoval = true) - private List recipeTags; + @Column + private String tag; - @OneToMany(mappedBy = "recipe", orphanRemoval = true) - private List recipeIngredients; + @Column + private String portions; + + @Column + private String time; + + @Column + private String tip; @OneToMany(mappedBy = "recipe", orphanRemoval = true) private List recipeReviews; diff --git a/src/main/java/com/webservice/algorithmchef/model/RecipeIngredient.java b/src/main/java/com/webservice/algorithmchef/model/RecipeIngredient.java deleted file mode 100644 index 45fbb18..0000000 --- a/src/main/java/com/webservice/algorithmchef/model/RecipeIngredient.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.webservice.algorithmchef.model; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.Lob; -import jakarta.persistence.ManyToOne; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -@Entity -@AllArgsConstructor -@NoArgsConstructor -@Builder -@Getter -@Setter -@ToString -public class RecipeIngredient { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="recipe_ingredient_id") - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="recipe_id") - private Recipe recipe; - - @Column(nullable = false) - @Lob - private String neededIngredients; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="ingredient_id") - private Ingredient ingredient; - -} diff --git a/src/main/java/com/webservice/algorithmchef/model/RecipeReview.java b/src/main/java/com/webservice/algorithmchef/model/RecipeReview.java index fc0c923..dab0b96 100644 --- a/src/main/java/com/webservice/algorithmchef/model/RecipeReview.java +++ b/src/main/java/com/webservice/algorithmchef/model/RecipeReview.java @@ -11,6 +11,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; import jakarta.persistence.ManyToOne; import lombok.AllArgsConstructor; import lombok.Builder; @@ -44,6 +45,10 @@ public class RecipeReview { @Column(nullable = false) private float rating; + @Column + @Lob + private String content; + @CreationTimestamp private LocalDateTime createdAt; diff --git a/src/main/java/com/webservice/algorithmchef/model/RecipeTag.java b/src/main/java/com/webservice/algorithmchef/model/RecipeTag.java deleted file mode 100644 index cc94bfc..0000000 --- a/src/main/java/com/webservice/algorithmchef/model/RecipeTag.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.webservice.algorithmchef.model; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -@Entity -@AllArgsConstructor -@NoArgsConstructor -@Builder -@Getter -@Setter -@ToString -public class RecipeTag { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="recipe_tag_id") - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - private Recipe recipe; - - @ManyToOne(fetch = FetchType.LAZY) - private Tag tag; - - -} diff --git a/src/main/java/com/webservice/algorithmchef/model/Tag.java b/src/main/java/com/webservice/algorithmchef/model/Tag.java deleted file mode 100644 index 5a47ac2..0000000 --- a/src/main/java/com/webservice/algorithmchef/model/Tag.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.webservice.algorithmchef.model; - -import java.util.List; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -@Entity -@AllArgsConstructor -@NoArgsConstructor -@Builder -@Getter -@Setter -@ToString -public class Tag { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(nullable = false) - private Long id; - - @Column(nullable = false, unique = true) - private String name; - - @OneToMany(mappedBy = "tag", cascade = CascadeType.ALL, orphanRemoval = true) - private List recipeTags; -} diff --git a/src/main/java/com/webservice/algorithmchef/repository/RecipeRepository.java b/src/main/java/com/webservice/algorithmchef/repository/RecipeRepository.java new file mode 100644 index 0000000..915d827 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/repository/RecipeRepository.java @@ -0,0 +1,12 @@ +package com.webservice.algorithmchef.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.webservice.algorithmchef.model.Recipe; + +public interface RecipeRepository extends JpaRepository{ + + public Optional findByName(String name); +} diff --git a/src/main/java/com/webservice/algorithmchef/repository/RecipeReviewRepository.java b/src/main/java/com/webservice/algorithmchef/repository/RecipeReviewRepository.java new file mode 100644 index 0000000..fafd31e --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/repository/RecipeReviewRepository.java @@ -0,0 +1,12 @@ +package com.webservice.algorithmchef.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.webservice.algorithmchef.model.Recipe; +import com.webservice.algorithmchef.model.RecipeReview; +import com.webservice.algorithmchef.model.User; + +public interface RecipeReviewRepository extends JpaRepository { + + boolean existsByUserAndRecipe(User user, Recipe recipe); +} diff --git a/src/main/java/com/webservice/algorithmchef/service/RecipeReviewService.java b/src/main/java/com/webservice/algorithmchef/service/RecipeReviewService.java new file mode 100644 index 0000000..a7ee780 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/service/RecipeReviewService.java @@ -0,0 +1,50 @@ +package com.webservice.algorithmchef.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.webservice.algorithmchef.dto.recipereview.RecipeReviewRequest; +import com.webservice.algorithmchef.dto.recipereview.RecipeReviewResponse; +import com.webservice.algorithmchef.model.Recipe; +import com.webservice.algorithmchef.model.RecipeReview; +import com.webservice.algorithmchef.model.User; +import com.webservice.algorithmchef.repository.RecipeRepository; +import com.webservice.algorithmchef.repository.RecipeReviewRepository; +import com.webservice.algorithmchef.repository.UserRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class RecipeReviewService { + + private final RecipeRepository recipeRepository; + private final RecipeReviewRepository recipeReviewRepository; + private final UserRepository userRepository; + + + @Transactional + public RecipeReviewResponse makeReview(RecipeReviewRequest reviewRequest, String userId) { + User user = userRepository.findByUserId(userId) + .orElseThrow(()-> new IllegalArgumentException("해당하는 아이디의 사용작 없습니다.")); + String recipeName = reviewRequest.getName(); + float rating = reviewRequest.getRating(); + String content = reviewRequest.getContent(); + Recipe recipe = recipeRepository.findByName(recipeName) + .orElseThrow(()-> new IllegalArgumentException("해당하는 이름의 recipe가 존재하지 않습니다.")); + if (recipeReviewRepository.existsByUserAndRecipe(user, recipe)) { + throw new IllegalStateException("이미 리뷰를 작성한 레시피입니다."); + } + RecipeReview review = RecipeReview.builder() + .content(content) + .rating(rating) + .user(user) + .recipe(recipe) + .build(); + + RecipeReview recipeReview = recipeReviewRepository.save(review); + return new RecipeReviewResponse(recipeReview); + + } + +}