RecommendationRequestsController.java

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

  2. import edu.ucsb.cs156.example.errors.EntityNotFoundException;
  3. import edu.ucsb.cs156.example.repositories.RecommendationRequestRepository;

  4. import io.swagger.v3.oas.annotations.Operation;
  5. import io.swagger.v3.oas.annotations.Parameter;
  6. import io.swagger.v3.oas.annotations.tags.Tag;
  7. import lombok.extern.slf4j.Slf4j;

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

  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.format.annotation.DateTimeFormat;
  11. import org.springframework.security.access.prepost.PreAuthorize;
  12. import org.springframework.web.bind.annotation.DeleteMapping;
  13. import org.springframework.web.bind.annotation.GetMapping;
  14. import org.springframework.web.bind.annotation.PostMapping;
  15. import org.springframework.web.bind.annotation.PutMapping;
  16. import org.springframework.web.bind.annotation.RequestBody;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RequestParam;
  19. import org.springframework.web.bind.annotation.RestController;

  20. import jakarta.validation.Valid;

  21. import edu.ucsb.cs156.example.entities.RecommendationRequest;

  22. import java.time.LocalDateTime;
  23. @Tag(name = "recommendationRequests")
  24. @RequestMapping("/api/recommendationrequests")
  25. @RestController
  26. @Slf4j
  27. public class RecommendationRequestsController extends ApiController {
  28.     @Autowired
  29.     RecommendationRequestRepository recommendationRequestRepository;

  30.     @Operation(summary= "List all recommendation requests")
  31.     @PreAuthorize("hasRole('ROLE_USER')")
  32.     @GetMapping("/all")
  33.     public Iterable<RecommendationRequest> allRecommendationRequests() {
  34.         Iterable<RecommendationRequest> reqs = recommendationRequestRepository.findAll();
  35.         return reqs;
  36.     }

  37.     @Operation(summary= "Create a new recommendation request")
  38.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  39.     @PostMapping("/post")
  40.     public RecommendationRequest postRecommendationRequest(
  41.             @Parameter(name="requesterEmail") @RequestParam String requesterEmail,
  42.             @Parameter(name="professorEmail") @RequestParam String professorEmail,
  43.             @Parameter(name="explanation") @RequestParam String explanation,
  44.            
  45.             @Parameter(name="dateRequested", description="date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)")
  46.             @RequestParam("dateRequested")
  47.             @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
  48.             LocalDateTime dateRequested,
  49.            
  50.             @Parameter(name="dateNeeded", description="date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)")
  51.             @RequestParam("dateNeeded")
  52.             @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
  53.             LocalDateTime dateNeeded,

  54.             @Parameter(name="doneBool") @RequestParam boolean doneBool
  55.             )

  56.             throws JsonProcessingException {

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

  59.         log.info("localDateTime1={}", dateRequested);
  60.         log.info("localDateTime2={}", dateNeeded);

  61.         RecommendationRequest req = new RecommendationRequest();
  62.         req.setRequesterEmail(requesterEmail);
  63.         req.setProfessorEmail(professorEmail);
  64.         req.setExplanation(explanation);
  65.         req.setDateRequested(dateRequested);
  66.         req.setDateNeeded(dateNeeded);
  67.         req.setDone(doneBool);
  68.         RecommendationRequest savedReq = recommendationRequestRepository.save(req);

  69.         return savedReq;
  70.     }

  71.     /**
  72.      * Get a single request by id
  73.      *
  74.      * @param id the id of the request
  75.      * @return a RecommendationRequest
  76.      */
  77.     @Operation(summary= "Get a single recommendation request")
  78.     @PreAuthorize("hasRole('ROLE_USER')")
  79.     @GetMapping("")
  80.     public RecommendationRequest getById(
  81.             @Parameter(name="id") @RequestParam Long id) {
  82.         RecommendationRequest req = recommendationRequestRepository.findById(id)
  83.                 .orElseThrow(() -> new EntityNotFoundException(RecommendationRequest.class, id));

  84.         return req;
  85.     }

  86.     /**
  87.      * Delete a RecommendationRequest
  88.      *
  89.      * @param id the id of the req
  90.      * @return a message indicating the req was deleted
  91.      */
  92.     @Operation(summary= "Delete a RecommendationRequest")
  93.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  94.     @DeleteMapping("")
  95.     public Object deleteRecommendationRequest(
  96.             @Parameter(name="id") @RequestParam Long id) {
  97.         RecommendationRequest req = recommendationRequestRepository.findById(id)
  98.                 .orElseThrow(() -> new EntityNotFoundException(RecommendationRequest.class, id));

  99.         recommendationRequestRepository.delete(req);
  100.         return genericMessage("RecommendationRequest with id %s deleted".formatted(id));
  101.     }

  102.     /**
  103.      * Update a single recommendation request
  104.      *
  105.      * @param id       id of the req to update
  106.      * @param incoming the new req
  107.      * @return the updated req object
  108.      */
  109.     @Operation(summary= "Update a single RecommendationRequest")
  110.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  111.     @PutMapping("")
  112.     public RecommendationRequest updateRecommendationRequest(
  113.             @Parameter(name="id") @RequestParam Long id,
  114.             @RequestBody @Valid RecommendationRequest incoming) {

  115.         RecommendationRequest req = recommendationRequestRepository.findById(id)
  116.                 .orElseThrow(() -> new EntityNotFoundException(RecommendationRequest.class, id));

  117.         req.setDateNeeded(incoming.getDateNeeded());
  118.         req.setDateRequested(incoming.getDateRequested());
  119.         req.setDone(incoming.getDone());
  120.         req.setProfessorEmail(incoming.getProfessorEmail());
  121.         req.setRequesterEmail(incoming.getRequesterEmail());
  122.         req.setExplanation(incoming.getExplanation());

  123.         recommendationRequestRepository.save(req);

  124.         return req;
  125.     }
  126.    
  127. }