HelpRequestController.java

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

  2. import edu.ucsb.cs156.example.entities.HelpRequest;
  3. import edu.ucsb.cs156.example.entities.UCSBDate;
  4. import edu.ucsb.cs156.example.errors.EntityNotFoundException;
  5. import edu.ucsb.cs156.example.repositories.HelpRequestRepository;
  6. import edu.ucsb.cs156.example.repositories.UCSBDateRepository;

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

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

  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.format.annotation.DateTimeFormat;
  14. import org.springframework.security.access.prepost.PreAuthorize;
  15. import org.springframework.web.bind.annotation.DeleteMapping;
  16. import org.springframework.web.bind.annotation.GetMapping;
  17. import org.springframework.web.bind.annotation.PostMapping;
  18. import org.springframework.web.bind.annotation.PutMapping;
  19. import org.springframework.web.bind.annotation.RequestBody;
  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 jakarta.validation.Valid;

  24. import java.time.LocalDateTime;

  25. @Tag(name = "HelpRequest") // Does this have to be plural?
  26. @RequestMapping("/api/helprequest")
  27. @RestController
  28. @Slf4j

  29. public class HelpRequestController extends ApiController{
  30.     @Autowired
  31.     HelpRequestRepository helpRequestRepository;

  32.     @Operation(summary= "List all help requests")
  33.     @PreAuthorize("hasRole('ROLE_USER')")
  34.     @GetMapping("/all")
  35.     public Iterable<HelpRequest> allHelpRequests() {
  36.         Iterable<HelpRequest> requests = helpRequestRepository.findAll();
  37.         return requests;
  38.     }

  39.     @Operation(summary= "GET (show) a single record in the table")
  40.     @PreAuthorize("hasRole('ROLE_USER')")
  41.     @GetMapping("")
  42.     public HelpRequest getById(
  43.             @Parameter(name="id") @RequestParam Long id) {
  44.         HelpRequest helpRequest = helpRequestRepository.findById(id)
  45.                 .orElseThrow(() -> new EntityNotFoundException(HelpRequest.class, id));
  46.         return helpRequest;
  47.     }

  48.     @Operation(summary= "Create a new request")
  49.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  50.     @PostMapping("/post")
  51.     public HelpRequest postHelpRequest(
  52.             @Parameter(name="requesterEmail") @RequestParam String requesterEmail,
  53.             @Parameter(name="teamId") @RequestParam String teamId,
  54.             @Parameter(name="tableOrBreakoutRoom") @RequestParam String tableOrBreakoutRoom,
  55.             @Parameter(name="requestTime", description="date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)") @RequestParam("requestTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime requestTime,
  56.             @Parameter(name="explanation") @RequestParam String explanation,
  57.             @Parameter(name="solved") @RequestParam boolean solved)
  58.             throws JsonProcessingException {

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

  61.         log.info("requestTime={}", requestTime);

  62.         // HelpRequest helpRequest = new HelpRequest();
  63.         // helpRequest.setRequesterEmail(requesterEmail); // This part is failing pitest
  64.         // helpRequest.setTeamId(teamId);
  65.         // helpRequest.setTableOrBreakoutRoom(tableOrBreakoutRoom);
  66.         // helpRequest.setRequestTime(requestTime);
  67.         // helpRequest.setExplanation(explanation);
  68.         // helpRequest.setSolved(solved);

  69.         // Using a builder works with pitest mutation coverage
  70.         HelpRequest helpRequest = HelpRequest.builder()
  71.             .requesterEmail(requesterEmail)
  72.             .teamId(teamId)
  73.             .tableOrBreakoutRoom(tableOrBreakoutRoom)
  74.             .requestTime(requestTime)
  75.             .explanation(explanation)
  76.             .solved(solved)
  77.             .build();
  78.                
  79.         HelpRequest savedHelpRequest = helpRequestRepository.save(helpRequest);

  80.         return savedHelpRequest;
  81.     }

  82.     @Operation(summary= "Delete a single record from the table")
  83.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  84.     @DeleteMapping("")
  85.     public Object deleteHelpRequest(
  86.             @Parameter(name="id") @RequestParam Long id) {
  87.         HelpRequest helpRequest = helpRequestRepository.findById(id)
  88.                 .orElseThrow(() -> new EntityNotFoundException(HelpRequest.class, id));

  89.         helpRequestRepository.delete(helpRequest);
  90.         return genericMessage("HelpRequest with id %s deleted".formatted(id));
  91.     }
  92.    
  93.     @Operation(summary= "Update a single record in the table")
  94.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  95.     @PutMapping("")
  96.     public HelpRequest updateHelpRequest(
  97.             @Parameter(name="id") @RequestParam Long id,
  98.             @RequestBody @Valid HelpRequest incoming) {

  99.         HelpRequest helpRequest = helpRequestRepository.findById(id)
  100.                 .orElseThrow(() -> new EntityNotFoundException(HelpRequest.class, id));

  101.         helpRequest.setRequesterEmail(incoming.getRequesterEmail());
  102.         helpRequest.setTeamId(incoming.getTeamId());
  103.         helpRequest.setTableOrBreakoutRoom(incoming.getTableOrBreakoutRoom());
  104.         helpRequest.setRequestTime(incoming.getRequestTime());
  105.         helpRequest.setExplanation(incoming.getExplanation());
  106.         helpRequest.setSolved(incoming.getSolved());

  107.         helpRequestRepository.save(helpRequest);

  108.         return helpRequest;
  109.     }


  110. }