RecommendationRequestController.java

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

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

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

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

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

  21. import jakarta.validation.Valid;

  22. import java.time.LocalDateTime;

  23. @Tag(name = "RecommendationRequest")
  24. @RequestMapping("/api/recommendationrequest")
  25. @RestController
  26. @Slf4j
  27. public class RecommendationRequestController extends ApiController {
  28.     @Autowired
  29.     RecommendationRequestRepository recommendationRequestRepository;

  30.     /**
  31.      * List all recommendation requests
  32.      *
  33.      * @return an iterable of RecommendationRequest
  34.      */
  35.     @Operation(summary= "List all recommendation requests")
  36.     @PreAuthorize("hasRole('ROLE_USER')")
  37.     @GetMapping("/all")
  38.     public Iterable<RecommendationRequest> allRecommendationRequests() {
  39.         Iterable<RecommendationRequest> requests = recommendationRequestRepository.findAll();
  40.         return requests;
  41.     }

  42.     /**
  43.      * Create a new request
  44.      *
  45.      * @param requesterEmail        
  46.      * @param professorEmail        
  47.      * @param explanation          
  48.      * @param dateRequested
  49.      * @param dateNeeded
  50.      * @param done
  51.      * @return                  
  52.      */
  53.     @Operation(summary= "Create a new request")
  54.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  55.     @PostMapping("/post")
  56.     public RecommendationRequest postRecommendationRequest(
  57.             @Parameter(name="requesterEmail") @RequestParam String requesterEmail,
  58.             @Parameter(name="professorEmail") @RequestParam String professorEmail,
  59.             @Parameter(name="explanation") @RequestParam String explanation,
  60.             @Parameter(name="dateRequested", description="date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)") @RequestParam("dateRequested") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime dateRequested,
  61.             @Parameter(name="dateNeeded", description="date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)") @RequestParam("dateNeeded") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime dateNeeded,
  62.             @Parameter(name="done") @RequestParam boolean done)
  63.             throws JsonProcessingException {

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

  66.         // log.info("dateRequested={}", dateRequested);
  67.         // log.info("dateNeeded={}", dateNeeded);

  68.         RecommendationRequest recommendationRequest = new RecommendationRequest();
  69.         recommendationRequest.setRequesterEmail(requesterEmail);
  70.         recommendationRequest.setProfessorEmail(professorEmail);
  71.         recommendationRequest.setExplanation(explanation);
  72.         recommendationRequest.setDateRequested(dateRequested);
  73.         recommendationRequest.setDateNeeded(dateNeeded);
  74.         recommendationRequest.setDone(done);

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

  76.         return savedRecommendationRequest;
  77.     }

  78.     /**
  79.      * Get a single request by id
  80.      *
  81.      * @param id the id of the request
  82.      * @return a RecommendationRequest
  83.      */
  84.     @Operation(summary= "Get a single request")
  85.     @PreAuthorize("hasRole('ROLE_USER')")
  86.     @GetMapping("")
  87.     public RecommendationRequest getById(
  88.             @Parameter(name="id") @RequestParam Long id) {
  89.         RecommendationRequest recommendationRequest = recommendationRequestRepository.findById(id)
  90.                 .orElseThrow(() -> new EntityNotFoundException(RecommendationRequest.class, id));

  91.         return recommendationRequest;
  92.     }

  93.     /**
  94.      * Delete a RecommendationRequest
  95.      *
  96.      * @param id the id of the request to delete
  97.      * @return a message indicating the request was deleted
  98.      */
  99.     @Operation(summary= "Delete a RecommendationRequest")
  100.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  101.     @DeleteMapping("")
  102.     public Object deleteRecommendationRequest(
  103.             @Parameter(name="id") @RequestParam Long id) {
  104.         RecommendationRequest recommendationRequest = recommendationRequestRepository.findById(id)
  105.                 .orElseThrow(() -> new EntityNotFoundException(RecommendationRequest.class, id));

  106.                 recommendationRequestRepository.delete(recommendationRequest);
  107.         return genericMessage("RecommendationRequest with id %s deleted".formatted(id));
  108.     }

  109.     /**
  110.      * Update a single request
  111.      *
  112.      * @param id       id of the request to update
  113.      * @param incoming the new date
  114.      * @return the updated date object
  115.      */
  116.     @Operation(summary= "Update a single date")
  117.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  118.     @PutMapping("")
  119.     public RecommendationRequest updateRecommendationRequest(
  120.             @Parameter(name="id") @RequestParam Long id,
  121.             @RequestBody @Valid RecommendationRequest incoming) {

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

  124.         recommendationRequest.setRequesterEmail(incoming.getRequesterEmail());
  125.         recommendationRequest.setProfessorEmail(incoming.getProfessorEmail());
  126.         recommendationRequest.setExplanation(incoming.getExplanation());
  127.         recommendationRequest.setDateRequested(incoming.getDateRequested());
  128.         recommendationRequest.setDateNeeded(incoming.getDateNeeded());
  129.         recommendationRequest.setDone(incoming.getDone());

  130.         recommendationRequestRepository.save(recommendationRequest);

  131.         return recommendationRequest;
  132.     }
  133. }