JobsController.java

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

  2. import com.fasterxml.jackson.databind.ObjectMapper;

  3. import io.swagger.v3.oas.annotations.tags.Tag;
  4. import io.swagger.v3.oas.annotations.Operation;
  5. import io.swagger.v3.oas.annotations.Parameter;

  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.data.domain.Page;
  8. import org.springframework.data.domain.PageRequest;
  9. import org.springframework.data.domain.Sort;
  10. import org.springframework.security.access.prepost.PreAuthorize;
  11. import org.springframework.web.bind.annotation.GetMapping;
  12. import org.springframework.web.bind.annotation.PostMapping;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestParam;
  15. import org.springframework.web.bind.annotation.RestController;


  16. import edu.ucsb.cs156.happiercows.entities.jobs.Job;
  17. import edu.ucsb.cs156.happiercows.jobs.InstructorReportJob;
  18. import edu.ucsb.cs156.happiercows.jobs.InstructorReportJobFactory;
  19. import edu.ucsb.cs156.happiercows.jobs.InstructorReportJobSingleCommons;
  20. import edu.ucsb.cs156.happiercows.jobs.InstructorReportJobSingleCommonsFactory;
  21. import edu.ucsb.cs156.happiercows.jobs.MilkTheCowsJobFactory;
  22. import edu.ucsb.cs156.happiercows.jobs.MilkTheCowsJobFactoryInd;
  23. import edu.ucsb.cs156.happiercows.jobs.SetCowHealthJobFactory;
  24. import edu.ucsb.cs156.happiercows.jobs.UpdateCowHealthJobFactoryInd;
  25. import edu.ucsb.cs156.happiercows.jobs.TestJob;
  26. import edu.ucsb.cs156.happiercows.jobs.UpdateCowHealthJobFactory;
  27. import edu.ucsb.cs156.happiercows.jobs.RecordCommonStatsJob;
  28. import edu.ucsb.cs156.happiercows.jobs.RecordCommonStatsJobFactory;
  29. import edu.ucsb.cs156.happiercows.repositories.jobs.JobsRepository;
  30. import edu.ucsb.cs156.happiercows.services.jobs.JobContextConsumer;
  31. import edu.ucsb.cs156.happiercows.services.jobs.JobService;
  32. import edu.ucsb.cs156.happiercows.services.CommonsPlusBuilderService;


  33. @Tag(name = "Jobs")
  34. @RequestMapping("/api/jobs")
  35. @RestController
  36. public class JobsController extends ApiController {
  37.     @Autowired
  38.     private JobsRepository jobsRepository;

  39.     @Autowired
  40.     private JobService jobService;

  41.     @Autowired
  42.     private CommonsPlusBuilderService commonsPlusBuilderService;

  43.     @Autowired
  44.     ObjectMapper mapper;

  45.     @Autowired
  46.     UpdateCowHealthJobFactory updateCowHealthJobFactory;

  47.     @Autowired
  48.     MilkTheCowsJobFactory milkTheCowsJobFactory;

  49.     @Autowired
  50.     MilkTheCowsJobFactoryInd milkTheCowsJobFactoryInd;

  51.     @Autowired
  52.     SetCowHealthJobFactory setCowHealthJobFactory;

  53.     @Autowired
  54.     InstructorReportJobFactory instructorReportJobFactory;

  55.     @Autowired
  56.     InstructorReportJobSingleCommonsFactory instructorReportJobSingleCommonsFactory;

  57.     @Autowired
  58.     UpdateCowHealthJobFactoryInd updateCowHealthJobFactoryInd;

  59.     @Autowired
  60.     RecordCommonStatsJobFactory recordCommonStatsJobFactory;

  61.     @Operation(summary = "List all jobs")
  62.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  63.     @GetMapping("/all")
  64.     public Iterable<Job> allJobs() {
  65.         Iterable<Job> jobs = jobsRepository.findAll();
  66.         return jobs;
  67.     }

  68.     @Operation(summary = "List all jobs")
  69.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  70.     @GetMapping("/all/pageable")
  71.     public Page<Job> allJobsPaged(
  72.          @Parameter(name="page") @RequestParam int page,
  73.          @Parameter(name="size") @RequestParam int size
  74.     ) {
  75.         Page<Job> jobs = jobsRepository.findAll(PageRequest.of(page, size, Sort.by("id").descending()));
  76.         return jobs;
  77.     }

  78.     @Operation(summary = "Launch Test Job (click fail if you want to test exception handling)")
  79.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  80.     @PostMapping("/launch/testjob")
  81.     public Job launchTestJob(
  82.         @Parameter(name="fail") @RequestParam Boolean fail,
  83.         @Parameter(name="sleepMs") @RequestParam Integer sleepMs
  84.     ) {
  85.         TestJob testJob = TestJob.builder()
  86.         .fail(fail)
  87.         .sleepMs(sleepMs)
  88.         .build();

  89.         // Reference: frontend/src/components/Jobs/TestJobForm.js
  90.         if (sleepMs < 0 || sleepMs > 60000) {
  91.             throw new IllegalArgumentException("sleepMs must be between 0 and 60000");
  92.         }

  93.         return jobService.runAsJob(testJob);
  94.     }

  95.     @Operation(summary = "Launch Job to Milk the Cows (click fail if you want to test exception handling)")
  96.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  97.     @PostMapping("/launch/milkthecowjob")
  98.     public Job launchTestJob(
  99.     ) {
  100.         JobContextConsumer milkTheCowsJob = milkTheCowsJobFactory.create();
  101.         return jobService.runAsJob(milkTheCowsJob);
  102.     }

  103.     @Operation(summary = "Launch Job to Milk the Cows for a single commons")
  104.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  105.     @PostMapping("/launch/milkthecowjobsinglecommons")
  106.     public Job launchTestJob(
  107.          @Parameter(name="commonsId") @RequestParam Long commonsId
  108.     ) {
  109.         JobContextConsumer milkTheCowsJobInd = milkTheCowsJobFactoryInd.create(commonsId);
  110.         return jobService.runAsJob(milkTheCowsJobInd);
  111.     }

  112.     @Operation(summary = "Launch Job to Update Cow Health")
  113.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  114.     @PostMapping("/launch/updatecowhealth")
  115.     public Job updateCowHealth(
  116.     ) {
  117.         JobContextConsumer updateCowHealthJob = updateCowHealthJobFactory.create();
  118.         return jobService.runAsJob(updateCowHealthJob);
  119.     }

  120.     @Operation(summary = "Launch Job to Update Cow Health for a single commons")
  121.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  122.     @PostMapping("/launch/updatecowhealthsinglecommons")
  123.     public Job updateCowHealth(
  124.          @Parameter(name="commonsId") @RequestParam Long commonsId
  125.     ) {
  126.         JobContextConsumer updateCowHealthJobInd = updateCowHealthJobFactoryInd.create(commonsId);
  127.         return jobService.runAsJob(updateCowHealthJobInd);
  128.     }

  129.     @Operation(summary = "Launch Job to Set Cow Health")
  130.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  131.     @PostMapping("/launch/setcowhealth")
  132.     public Job setCowHealth(
  133.         @Parameter(name="commonsID") @RequestParam Long commonsID,
  134.         @Parameter(name="health") @RequestParam double health
  135.     ) {
  136.         JobContextConsumer setCowHealthJob = setCowHealthJobFactory.create(commonsID, health);

  137.         // Reference: frontend/src/components/Jobs/SetCowHealthForm.js
  138.         if (health < 0 || health > 100) {
  139.             throw new IllegalArgumentException("health must be between 0 and 100");
  140.         }

  141.         return jobService.runAsJob(setCowHealthJob);
  142.     }

  143.     @Operation(summary = "Launch Job to Produce Instructor Report")
  144.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  145.     @PostMapping("/launch/instructorreport")
  146.     public Job instructorReport(
  147.     ) {
  148.         InstructorReportJob instructorReportJob = (InstructorReportJob) instructorReportJobFactory.create();
  149.         return jobService.runAsJob(instructorReportJob);
  150.     }

  151.     @Operation(summary = "Launch Job to Produce Instructor Report for a single commons")
  152.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  153.     @PostMapping("/launch/instructorreportsinglecommons")
  154.     public Job instructorReportSingleCommons(
  155.          @Parameter(name="commonsId") @RequestParam Long commonsId
  156.     ) {

  157.         InstructorReportJobSingleCommons instructorReportJobSingleCommons = (InstructorReportJobSingleCommons) instructorReportJobSingleCommonsFactory.create(commonsId);
  158.         return jobService.runAsJob(instructorReportJobSingleCommons);
  159.     }

  160.     @Operation(summary = "Launch Job to Record the Stats of all Commons")
  161.     @PreAuthorize("hasRole('ROLE_ADMIN')")
  162.     @PostMapping("/launch/recordcommonstats")
  163.     public Job recordCommonStats(
  164.     ) {

  165.         RecordCommonStatsJob recordCommonStatsJob = (RecordCommonStatsJob) recordCommonStatsJobFactory.create();
  166.         return jobService.runAsJob(recordCommonStatsJob);
  167.     }
  168. }