ReviewController.java

  1. package edu.ucsb.cs156.dining.controllers;

  2. import edu.ucsb.cs156.dining.entities.Review;
  3. import edu.ucsb.cs156.dining.entities.User;
  4. import edu.ucsb.cs156.dining.errors.EntityNotFoundException;
  5. import edu.ucsb.cs156.dining.models.CurrentUser;
  6. import edu.ucsb.cs156.dining.models.Entree;
  7. import edu.ucsb.cs156.dining.repositories.MenuItemRepository;
  8. import edu.ucsb.cs156.dining.repositories.ReviewRepository;
  9. import io.swagger.v3.oas.annotations.Operation;
  10. import io.swagger.v3.oas.annotations.Parameter;
  11. import io.swagger.v3.oas.annotations.tags.Tag;
  12. import lombok.extern.slf4j.Slf4j;
  13. import com.fasterxml.jackson.core.JsonProcessingException;

  14. import java.time.LocalDateTime;
  15. import java.util.HashMap;
  16. import java.util.Map;

  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.format.annotation.DateTimeFormat;
  19. import org.springframework.http.HttpStatus;
  20. import org.springframework.http.ResponseEntity;
  21. import org.springframework.security.access.prepost.PreAuthorize;
  22. import org.springframework.web.bind.annotation.DeleteMapping;
  23. import org.springframework.web.bind.annotation.ExceptionHandler;
  24. import org.springframework.web.bind.annotation.GetMapping;
  25. import org.springframework.web.bind.annotation.PostMapping;
  26. import org.springframework.web.bind.annotation.PutMapping;
  27. import org.springframework.web.bind.annotation.RequestBody;
  28. import org.springframework.web.bind.annotation.RequestMapping;
  29. import org.springframework.web.bind.annotation.RequestParam;
  30. import org.springframework.web.bind.annotation.RestController;
  31. import org.springframework.web.server.ResponseStatusException;

  32. import com.nimbusds.openid.connect.sdk.claims.UserInfo;

  33. import jakarta.validation.Valid;

  34. /**
  35.  * This is a REST controller for Reviews
  36.  */

  37. @Tag(name = "Review")
  38. @RequestMapping("/api/reviews")
  39. @RestController
  40. @Slf4j
  41. public class ReviewController extends ApiController {

  42.     @ExceptionHandler(IllegalArgumentException.class)
  43.     public ResponseEntity<Map<String, String>> handleValidationExceptions(IllegalArgumentException ex) {
  44.         Map<String, String> errors = new HashMap<>();
  45.         errors.put("error", ex.getMessage());
  46.         return ResponseEntity.badRequest().body(errors);
  47.     }

  48.     @Autowired
  49.     ReviewRepository reviewRepository;

  50.     @Autowired
  51.     MenuItemRepository menuItemRepository;

  52.     /**
  53.      * This method returns a list of all Reviews.
  54.      *
  55.      * @return a list of all Reviews
  56.      */
  57.     @Operation(summary = "List all Reviews")
  58.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  59.     @GetMapping("/all")
  60.     public Iterable<Review> allReviews() {
  61.         log.info("Attempting to log all reviews");
  62.         Iterable<Review> reviews = reviewRepository.findAll();
  63.         log.info("all reviews found, ", reviews);
  64.         return reviews;
  65.     }

  66.     /**
  67.      * This method allows a user to submit a review
  68.      *
  69.      * @return message that says an review was added to the database
  70.      * @param itemId         id of the item
  71.      * @param dateItemServed localDataTime
  72.      *                       All others params must not be parameters and instead
  73.      *                       derived from data sources that are dynamic (Date), or
  74.      *                       set to be null or some other signifier
  75.      */
  76.     @Operation(summary = "Create a new review")
  77.     @PreAuthorize("hasRole('ROLE_USER')")
  78.     @PostMapping("/post")
  79.     public Review postReview(
  80.             @Parameter(name = "itemId") @RequestParam long itemId,
  81.             @Parameter(description = "Comments by the reviewer, can be blank") @RequestParam(required = false) String reviewerComments,
  82.             @Parameter(name = "itemsStars") @RequestParam Long itemsStars,
  83.             @Parameter(name = "dateItemServed", description = "date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)") @RequestParam("dateItemServed") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime dateItemServed) // For
  84.             throws JsonProcessingException {
  85.         LocalDateTime now = LocalDateTime.now();
  86.         Review review = new Review();
  87.         review.setDateItemServed(dateItemServed);
  88.         review.setDateCreated(now);

  89.         // Ensures content of truly empty and sets to null if so
  90.         if ((!reviewerComments.trim().isEmpty())) {
  91.             review.setReviewerComments(reviewerComments);
  92.         }

  93.         // Ensure user inputs rating 1-5
  94.         if (itemsStars < 1 || itemsStars > 5) {
  95.             throw new IllegalArgumentException("Items stars must be between 1 and 5.");
  96.         }

  97.         review.setItemsStars(itemsStars);

  98.         // Check if the menu item exists
  99.         if (!menuItemRepository.existsById(itemId)) {
  100.             throw new ResponseStatusException(HttpStatus.NOT_FOUND, "MenuItem with id " + itemId + " not found");
  101.         }

  102.         review.setItemId(itemId);
  103.         CurrentUser user = getCurrentUser();
  104.         review.setStudentId(user.getUser().getId());
  105.         review.setDateEdited(now);
  106.         log.info("reviews={}", review);
  107.         reviewRepository.save(review);
  108.         return review;
  109.     }

  110.     /**
  111.      * This method allows a user to get a list of reviews that they have previously made.
  112.      * Only user can only get a list of their own reviews, and you cant request another persons reviews
  113.      * @return a list of reviews sent by a given user
  114.      */
  115.     @Operation(summary = "Get all reviews a user has sent: only callable by the user")
  116.     @PreAuthorize("hasRole('ROLE_USER')")
  117.     @GetMapping("/userReviews")
  118.     public Iterable<Review> get_all_review_by_user_id(){
  119.         CurrentUser user = getCurrentUser();
  120.         long userId = user.getUser().getId();
  121.         Iterable<Review> reviews = reviewRepository.findAllByStudentId(userId);
  122.         return reviews;
  123.     }
  124. }