RecommendationRequestController.java

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

  2. import edu.ucsb.cs156.rec.entities.RecommendationRequest;
  3. import edu.ucsb.cs156.rec.entities.RequestType;
  4. import edu.ucsb.cs156.rec.entities.User;
  5. import edu.ucsb.cs156.rec.errors.EntityNotFoundException;
  6. import edu.ucsb.cs156.rec.repositories.RecommendationRequestRepository;
  7. import edu.ucsb.cs156.rec.repositories.RequestTypeRepository;
  8. import edu.ucsb.cs156.rec.repositories.UserRepository;
  9. import edu.ucsb.cs156.rec.services.CurrentUserService;
  10. import io.swagger.v3.oas.annotations.Operation;
  11. import io.swagger.v3.oas.annotations.Parameter;
  12. import io.swagger.v3.oas.annotations.tags.Tag;
  13. import lombok.extern.slf4j.Slf4j;

  14. import com.fasterxml.jackson.core.JsonProcessingException;

  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.format.annotation.DateTimeFormat;
  17. import org.springframework.security.access.prepost.PreAuthorize;
  18. import org.springframework.web.bind.annotation.GetMapping;
  19. import org.springframework.web.bind.annotation.PostMapping;
  20. import org.springframework.web.bind.annotation.RequestMapping;
  21. import org.springframework.web.bind.annotation.RequestParam;
  22. import org.springframework.web.bind.annotation.RestController;

  23. import java.time.LocalDateTime;

  24. @Tag(name = "RecommendationRequest")
  25. @RequestMapping("/api/recommendationrequest")
  26. @RestController
  27. @Slf4j
  28. public class RecommendationRequestController extends ApiController {
  29.     @Autowired
  30.     RecommendationRequestRepository recommendationRequestRepository;
  31.     @Autowired
  32.     CurrentUserService currentUserService;
  33.     @Autowired
  34.     UserRepository userRepository;
  35.     @Autowired
  36.     RequestTypeRepository requestTypeRepository;

  37.     /**
  38.      * List all recommendation requests
  39.      *
  40.      * @return an iterable of RecommendationRequest
  41.      */
  42.     @Operation(summary= "List all recommendation requests")
  43.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  44.     @GetMapping("/alladmin")
  45.     public Iterable<RecommendationRequest> allRecommendationRequests() {
  46.         Iterable<RecommendationRequest> requests = recommendationRequestRepository.findAll();
  47.         return requests;
  48.     }
  49.    
  50.     /**
  51.      * List all recommendation requests created by a user with requesterId
  52.      *
  53.      * @return an iterable of RecommendationRequest
  54.      */
  55.     @Operation(summary= "List all recommendation requests created by a user with requesterId")
  56.     @PreAuthorize("hasRole('ROLE_USER')")
  57.     @GetMapping("/all")
  58.     public Iterable<RecommendationRequest> getAllCurrentUser() {
  59.         User currentUser = currentUserService.getUser();
  60.         Long requesterId = currentUser.getId();
  61.         Iterable<RecommendationRequest> requests = recommendationRequestRepository.findAllByRequesterId(requesterId);

  62.         return requests;
  63.     }

  64.     /**
  65.      * Create a new recommendation request
  66.      *
  67.      * @param professorId the id of the professor
  68.      * @param requestType the request type
  69.      * @param details the details of the recommendation request
  70.      * @param neededByDate the date the request should be fulfilled by
  71.      * @return a RecommendationRequest
  72.      */
  73.     @Operation(summary= "Create a new request")
  74.     @PreAuthorize("hasRole('ROLE_USER')")
  75.     @PostMapping("/post")

  76.     public RecommendationRequest postRecommendationRequest(
  77.             @Parameter(name="professorId") @RequestParam Long professorId,
  78.             @Parameter(name="requestType") @RequestParam String requestType,
  79.             @Parameter(name="details") @RequestParam String details,
  80.             @Parameter(name="neededByDate", description="date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)") @RequestParam("neededByDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime neededByDate
  81.             )
  82.             throws JsonProcessingException {

  83.         // For an explanation of @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
  84.         // See: https://www.baeldung.com/spring-date-parameters

  85.         RecommendationRequest recommendationRequest = new RecommendationRequest();
  86.         User currentUser = currentUserService.getUser();
  87.         Long requesterId = currentUser.getId();

  88.         User professor = userRepository.findById(professorId)
  89.             .orElseThrow(() -> new EntityNotFoundException(User.class, professorId));

  90.         if (!professor.getAdmin()) {
  91.             throw new IllegalArgumentException("Requested professor is not an admin.");
  92.         }

  93.         requestTypeRepository.findByRequestType(requestType)
  94.                 .orElseThrow(() -> new EntityNotFoundException(RequestType.class, requestType));

  95.         recommendationRequest.setRequesterId(requesterId);
  96.         recommendationRequest.setProfessorId(professorId);
  97.         recommendationRequest.setRequestType(requestType);
  98.         recommendationRequest.setDetails(details);

  99.         // completionDate is unassigned until completed, so we set that as null
  100.         LocalDateTime submissionDate = LocalDateTime.now();
  101.         submissionDate = submissionDate.minusNanos(submissionDate.getNano());

  102.         String status = "Pending";

  103.         recommendationRequest.setNeededByDate(neededByDate);
  104.         recommendationRequest.setSubmissionDate(submissionDate);
  105.         recommendationRequest.setStatus(status);

  106.         RecommendationRequest savedRecommendationRequest = recommendationRequestRepository.save(recommendationRequest);

  107.         return savedRecommendationRequest;
  108.     }

  109.     /**
  110.      * Get a single request by id
  111.      *
  112.      * CHECK if recommendation request belongs to user
  113.      *
  114.      * @param id the id of the request
  115.      * @return a RecommendationRequest
  116.      */
  117.     @Operation(summary= "Get a single request")
  118.     @PreAuthorize("hasRole('ROLE_USER')")
  119.     @GetMapping("")
  120.     public RecommendationRequest getById(
  121.             @Parameter(name="id") @RequestParam Long id
  122.         ) {
  123.         User currentUser = currentUserService.getUser();
  124.         Long requesterId = currentUser.getId();

  125.         RecommendationRequest recommendationRequest = recommendationRequestRepository.findById(id)
  126.                 .orElseThrow(() -> new EntityNotFoundException(RecommendationRequest.class, id));

  127.         if (requesterId != recommendationRequest.getRequesterId()) {
  128.             // throw entity not found to reveal less information to any malicious user
  129.             throw new EntityNotFoundException(RecommendationRequest.class, id);
  130.         }

  131.         return recommendationRequest;
  132.     }
  133. }