From 31e64f6bab70ff29a58b4f131d49b094c94eeb58 Mon Sep 17 00:00:00 2001 From: Jens Kristian Villadsen Date: Tue, 23 Apr 2024 14:10:02 +0200 Subject: [PATCH] Added exposure of job controller API (#678) --- .../fhir/jpa/starter/web/JobController.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/main/java/ca/uhn/fhir/jpa/starter/web/JobController.java diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/web/JobController.java b/src/main/java/ca/uhn/fhir/jpa/starter/web/JobController.java new file mode 100644 index 0000000..5be2049 --- /dev/null +++ b/src/main/java/ca/uhn/fhir/jpa/starter/web/JobController.java @@ -0,0 +1,42 @@ +package ca.uhn.fhir.jpa.starter.web; + +import ca.uhn.fhir.batch2.api.IJobCoordinator; +import ca.uhn.fhir.batch2.api.JobOperationResultJson; +import ca.uhn.fhir.batch2.model.JobInstance; +import ca.uhn.fhir.batch2.model.StatusEnum; +import ca.uhn.fhir.batch2.models.JobInstanceFetchRequest; +import jakarta.validation.constraints.Min; +import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("control") +public class JobController { + private final IJobCoordinator theJobCoordinator; + + public JobController(IJobCoordinator theJobCoordinator) { + this.theJobCoordinator = theJobCoordinator; + } + + @RequestMapping(value = JobController.JOBS, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public List getAllJobs(@RequestParam(name = "pageStart") @Min(0) int pageStart, @RequestParam(name = "batchSize") int batchSize, @RequestParam(name = "jobStatus", required = false) StatusEnum jobStatus) { + JobInstanceFetchRequest jobInstanceFetchRequest = new JobInstanceFetchRequest(); + jobInstanceFetchRequest.setPageStart(pageStart); + jobInstanceFetchRequest.setBatchSize(batchSize); + jobInstanceFetchRequest.setJobStatus(jobStatus != null ? jobStatus.toString() : ""); + jobInstanceFetchRequest.setSort(Sort.by(Sort.Direction.DESC, JobController.MY_CREATE_TIME)); + + return theJobCoordinator.fetchAllJobInstances(jobInstanceFetchRequest).getContent(); + } + + @RequestMapping(value = JobController.JOBS, method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_VALUE) + public JobOperationResultJson cancelInstance(@RequestParam(name = "instanceId") String instanceId) { + return theJobCoordinator.cancelInstance(instanceId); + } + + public static final String JOBS = "jobs"; + public static final String MY_CREATE_TIME = "myCreateTime"; +}