From ae7d5c52b2ebfc3de0fe1febed23420c1c7f884d Mon Sep 17 00:00:00 2001 From: Tim Parsons Date: Tue, 19 Apr 2022 09:34:27 -0400 Subject: [PATCH 1/6] [BI-1459] - Add endpoint to fetch all jobs in a program --- .../api/v1/controller/JobController.java | 67 +++++++++++++++++++ .../controllers/UploadController.java | 18 ++--- .../brapps/importer/daos/ImportDAO.java | 9 +++ .../brapps/importer/model/ImportUpload.java | 2 + .../model/response/ImportResponse.java | 10 +++ .../importer/services/FileImportService.java | 27 ++++++++ 6 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/breedinginsight/api/v1/controller/JobController.java diff --git a/src/main/java/org/breedinginsight/api/v1/controller/JobController.java b/src/main/java/org/breedinginsight/api/v1/controller/JobController.java new file mode 100644 index 000000000..98cedc7fc --- /dev/null +++ b/src/main/java/org/breedinginsight/api/v1/controller/JobController.java @@ -0,0 +1,67 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.api.v1.controller; + +import io.micronaut.http.HttpResponse; +import io.micronaut.http.MediaType; +import io.micronaut.http.annotation.*; +import lombok.extern.slf4j.Slf4j; +import org.breedinginsight.api.auth.AuthenticatedUser; +import org.breedinginsight.api.auth.ProgramSecured; +import org.breedinginsight.api.auth.ProgramSecuredRole; +import org.breedinginsight.api.auth.SecurityService; +import org.breedinginsight.api.model.v1.response.Response; +import org.breedinginsight.api.v1.controller.metadata.AddMetadata; +import org.breedinginsight.brapps.importer.model.response.ImportResponse; +import org.breedinginsight.brapps.importer.services.FileImportService; +import org.breedinginsight.services.exceptions.DoesNotExistException; + +import javax.inject.Inject; +import java.util.List; +import java.util.UUID; + +@Slf4j +@Controller("/${micronaut.bi.api.version}") +public class JobController { + private SecurityService securityService; + private FileImportService fileImportService; + + @Inject + public JobController(SecurityService securityService, FileImportService fileImportService) { + this.securityService = securityService; + this.fileImportService = fileImportService; + } + + @Get("programs/{programId}/jobs") + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.APPLICATION_JSON) + @AddMetadata + @ProgramSecured(roles = {ProgramSecuredRole.BREEDER, ProgramSecuredRole.SYSTEM_ADMIN}) + public HttpResponse> getProgramUploads(@PathVariable UUID programId, @QueryValue(defaultValue = "false") Boolean mapping) { + log.debug(String.format("fetching processes for program: %s", programId)); + try { + AuthenticatedUser actingUser = securityService.getUser(); + List result = fileImportService.getProgramUploads(programId, mapping); + Response response = new Response(result); + return HttpResponse.ok(response); + } catch (DoesNotExistException e) { + log.info(e.getMessage(), e); + return HttpResponse.notFound(); + } + } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java index fa18760fb..6c38b8471 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java @@ -100,7 +100,7 @@ public HttpResponse> getUploadData(@PathVariable UUID p return HttpResponse.ok(response); } } catch (DoesNotExistException e) { - log.info(e.getMessage()); + log.info(e.getMessage(), e); return HttpResponse.notFound(); } } @@ -117,16 +117,16 @@ public HttpResponse> commitData(@PathVariable UUID prog Response response = new Response(result); return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); } catch (DoesNotExistException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.notFound(); } catch (AuthorizationException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.status(HttpStatus.FORBIDDEN, e.getMessage()); } catch (UnprocessableEntityException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, e.getMessage()); } catch (HttpStatusException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.status(e.getStatus(), e.getMessage()); } } @@ -143,16 +143,16 @@ public HttpResponse> previewData(@PathVariable UUID pro Response response = new Response(result); return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); } catch (DoesNotExistException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.notFound(); } catch (AuthorizationException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.status(HttpStatus.FORBIDDEN, e.getMessage()); } catch (UnprocessableEntityException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, e.getMessage()); } catch (HttpStatusException e) { - log.info(e.getMessage()); + log.error(e.getMessage(), e); return HttpResponse.status(e.getStatus(), e.getMessage()); } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java index 57b0e560a..687abd0e2 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java @@ -20,6 +20,7 @@ import io.micronaut.http.server.exceptions.InternalServerException; import org.breedinginsight.brapps.importer.model.ImportProgress; import org.breedinginsight.brapps.importer.model.ImportUpload; +import org.breedinginsight.brapps.importer.model.mapping.ImportMapping; import org.breedinginsight.dao.db.tables.BiUserTable; import org.breedinginsight.dao.db.tables.daos.ImporterImportDao; import org.breedinginsight.dao.db.tables.daos.ImporterProgressDao; @@ -68,6 +69,12 @@ public Optional getUploadById(UUID id) { } } + public List getProgramUploads(UUID programId) { + List records = getUploadsQuery().where(IMPORTER_IMPORT.PROGRAM_ID.eq(programId)).fetch(); + + return parseRecords(records); + } + public void update(ImportUpload upload) { super.update(upload); progressDao.update(upload.getProgress()); @@ -87,6 +94,7 @@ private List parseRecords(List records) { upload.setCreatedByUser(User.parseSQLRecord(record, createdByUser)); upload.setUpdatedByUser(User.parseSQLRecord(record, updatedByUser)); upload.setProgress(ImportProgress.parseSQLRecord(record)); + upload.setMapping(ImportMapping.parseSQLRecord(record)); // Parse our file data and modified data into a data table try { if (upload.getFileData() != null) { @@ -113,6 +121,7 @@ private SelectOnConditionStep getUploadsQuery() { .leftJoin(IMPORTER_PROGRESS).on(IMPORTER_IMPORT.IMPORTER_PROGRESS_ID.eq(IMPORTER_PROGRESS.ID)) .innerJoin(PROGRAM).on(IMPORTER_IMPORT.PROGRAM_ID.eq(PROGRAM.ID)) .innerJoin(BI_USER).on(IMPORTER_IMPORT.USER_ID.eq(BI_USER.ID)) + .innerJoin(IMPORTER_MAPPING).on(IMPORTER_IMPORT.IMPORTER_MAPPING_ID.eq(IMPORTER_MAPPING.ID)) .innerJoin(createdByUser).on(IMPORTER_IMPORT.CREATED_BY.eq(createdByUser.ID)) .innerJoin(updatedByUser).on(IMPORTER_IMPORT.UPDATED_BY.eq(updatedByUser.ID)); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java b/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java index 3dc5914dc..ab0272ba8 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java @@ -26,6 +26,7 @@ import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import org.breedinginsight.brapps.importer.model.mapping.ImportMapping; import org.breedinginsight.brapps.importer.model.mapping.MappingField; import org.breedinginsight.dao.db.tables.pojos.ImporterImportEntity; import org.breedinginsight.model.Program; @@ -51,6 +52,7 @@ public class ImportUpload extends ImporterImportEntity { private User createdByUser; private User updatedByUser; private ImportProgress progress; + private ImportMapping mapping; private Table fileDataTable; private Table modifiedDataTable; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java b/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java index 1661f80bc..a16a7fa75 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java @@ -21,8 +21,10 @@ import lombok.Getter; import lombok.Setter; import org.breedinginsight.brapps.importer.model.ImportProgress; +import org.breedinginsight.model.User; import org.jooq.JSONB; +import java.time.OffsetDateTime; import java.util.UUID; @Getter @@ -32,6 +34,14 @@ public class ImportResponse { private ImportProgress progress; // Since we are only ever returning the preview, don't worry about trying to deserialize it from the db private JSONB preview; + private UUID importMappingId; + private String importMappingName; + private String importType; + private String uploadFileName; + private User createdByUser; + private User updatedByUser; + private OffsetDateTime createdAt; + private OffsetDateTime updatedAt; @JsonRawValue public String getPreview() { diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java index 588fcf6a3..bf62abc6f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -470,6 +470,33 @@ public Pair getDataUpload(UUID uploadId, Boolean inc return new ImmutablePair<>(status, response); } + public List getProgramUploads(UUID programId, Boolean includeMapping) throws DoesNotExistException { + Optional optionalProgram = programService.getById(programId); + if (!optionalProgram.isPresent()) { + throw new DoesNotExistException("Program id does not exist"); + } + List uploads = importDAO.getProgramUploads(programId); + + return uploads.stream().map(upload -> { + ImportResponse response = new ImportResponse(); + response.setImportId(upload.getId()); + response.setImportMappingId(upload.getMapping().getId()); + response.setImportMappingName(upload.getMapping().getName()); + response.setImportType(upload.getMapping().getImportTypeId()); + response.setUploadFileName(upload.getUploadFileName()); + response.setCreatedByUser(upload.getCreatedByUser()); + response.setCreatedAt(upload.getCreatedAt()); + response.setUpdatedByUser(upload.getUpdatedByUser()); + response.setUpdatedAt(upload.getUpdatedAt()); + response.setProgress(upload.getProgress()); + if (includeMapping){ + response.setPreview(upload.getMappedData()); + } + + return response; + }).collect(Collectors.toList()); + } + public List getAllMappings(UUID programId, AuthenticatedUser actingUser, Boolean draft) throws DoesNotExistException, AuthorizationException { From 21464e9d4e47da8de6d9f96ea5471ab238a1e379 Mon Sep 17 00:00:00 2001 From: Tim Parsons Date: Wed, 20 Apr 2022 10:27:09 -0400 Subject: [PATCH 2/6] [BI-1459] - Creating Job data model --- .../api/v1/controller/JobController.java | 25 +++---- .../brapps/importer/daos/ImportDAO.java | 3 + .../brapps/importer/model/ImportProgress.java | 2 + .../brapps/importer/model/ImportUpload.java | 1 + .../model/response/ImportResponse.java | 8 ++- .../org/breedinginsight/model/job/Job.java | 41 +++++++++++ .../breedinginsight/model/job/JobDetail.java | 22 ++++++ .../services/job/JobService.java | 71 +++++++++++++++++++ 8 files changed, 157 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/breedinginsight/model/job/Job.java create mode 100644 src/main/java/org/breedinginsight/model/job/JobDetail.java create mode 100644 src/main/java/org/breedinginsight/services/job/JobService.java diff --git a/src/main/java/org/breedinginsight/api/v1/controller/JobController.java b/src/main/java/org/breedinginsight/api/v1/controller/JobController.java index 98cedc7fc..1f51fedde 100644 --- a/src/main/java/org/breedinginsight/api/v1/controller/JobController.java +++ b/src/main/java/org/breedinginsight/api/v1/controller/JobController.java @@ -21,15 +21,12 @@ import io.micronaut.http.MediaType; import io.micronaut.http.annotation.*; import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.api.auth.AuthenticatedUser; -import org.breedinginsight.api.auth.ProgramSecured; -import org.breedinginsight.api.auth.ProgramSecuredRole; -import org.breedinginsight.api.auth.SecurityService; +import org.breedinginsight.api.auth.*; import org.breedinginsight.api.model.v1.response.Response; import org.breedinginsight.api.v1.controller.metadata.AddMetadata; -import org.breedinginsight.brapps.importer.model.response.ImportResponse; -import org.breedinginsight.brapps.importer.services.FileImportService; +import org.breedinginsight.model.job.Job; import org.breedinginsight.services.exceptions.DoesNotExistException; +import org.breedinginsight.services.job.JobService; import javax.inject.Inject; import java.util.List; @@ -39,25 +36,23 @@ @Controller("/${micronaut.bi.api.version}") public class JobController { private SecurityService securityService; - private FileImportService fileImportService; + private JobService jobService; @Inject - public JobController(SecurityService securityService, FileImportService fileImportService) { + public JobController(SecurityService securityService, JobService jobService) { this.securityService = securityService; - this.fileImportService = fileImportService; + this.jobService = jobService; } @Get("programs/{programId}/jobs") - @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) @AddMetadata - @ProgramSecured(roles = {ProgramSecuredRole.BREEDER, ProgramSecuredRole.SYSTEM_ADMIN}) - public HttpResponse> getProgramUploads(@PathVariable UUID programId, @QueryValue(defaultValue = "false") Boolean mapping) { - log.debug(String.format("fetching processes for program: %s", programId)); + @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) + public HttpResponse>> getProgramUploads(@PathVariable UUID programId) { + log.debug(String.format("fetching jobs for program: %s", programId)); try { AuthenticatedUser actingUser = securityService.getUser(); - List result = fileImportService.getProgramUploads(programId, mapping); - Response response = new Response(result); + Response> response = new Response(jobService.getProgramJobs(programId)); return HttpResponse.ok(response); } catch (DoesNotExistException e) { log.info(e.getMessage(), e); diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java index 687abd0e2..0e3d2a7a5 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportDAO.java @@ -37,6 +37,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -77,6 +78,8 @@ public List getProgramUploads(UUID programId) { public void update(ImportUpload upload) { super.update(upload); + upload.setUpdatedAt(OffsetDateTime.now()); + upload.getProgress().setUpdatedAt(upload.getUpdatedAt()); progressDao.update(upload.getProgress()); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/ImportProgress.java b/src/main/java/org/breedinginsight/brapps/importer/model/ImportProgress.java index 6e2f54001..d216cd3f5 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/ImportProgress.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/ImportProgress.java @@ -55,6 +55,8 @@ public static ImportProgress parseSQLRecord(Record record) { .finished(record.getValue(IMPORTER_PROGRESS.FINISHED)) .inProgress(record.getValue(IMPORTER_PROGRESS.IN_PROGRESS)) .body(record.getValue(IMPORTER_PROGRESS.BODY)) + .updatedAt(record.getValue(IMPORTER_PROGRESS.UPDATED_AT)) + .createdAt(record.getValue(IMPORTER_PROGRESS.CREATED_AT)) .build(); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java b/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java index ab0272ba8..65ec0cbfd 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java @@ -31,6 +31,7 @@ import org.breedinginsight.dao.db.tables.pojos.ImporterImportEntity; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; +import org.breedinginsight.model.job.JobDetail; import org.jooq.Record; import tech.tablesaw.api.Table; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java b/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java index a16a7fa75..16d9c80eb 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/response/ImportResponse.java @@ -22,6 +22,7 @@ import lombok.Setter; import org.breedinginsight.brapps.importer.model.ImportProgress; import org.breedinginsight.model.User; +import org.breedinginsight.model.job.JobDetail; import org.jooq.JSONB; import java.time.OffsetDateTime; @@ -29,7 +30,7 @@ @Getter @Setter -public class ImportResponse { +public class ImportResponse implements JobDetail { private UUID importId; private ImportProgress progress; // Since we are only ever returning the preview, don't worry about trying to deserialize it from the db @@ -47,4 +48,9 @@ public class ImportResponse { public String getPreview() { return preview != null ? preview.data() : null; } + + @Override + public String getJobType() { + return "IMPORT"; + } } diff --git a/src/main/java/org/breedinginsight/model/job/Job.java b/src/main/java/org/breedinginsight/model/job/Job.java new file mode 100644 index 000000000..e73568748 --- /dev/null +++ b/src/main/java/org/breedinginsight/model/job/Job.java @@ -0,0 +1,41 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.model.job; + +import lombok.*; +import lombok.experimental.Accessors; +import org.breedinginsight.model.User; + +import java.time.OffsetDateTime; + +@Getter +@Setter +@Accessors(chain=true) +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Job { + private int statuscode; + private String statusMessage; + private String jobType; + private OffsetDateTime createdAt; + private OffsetDateTime updatedAt; + private User createdByUser; + private JobDetail jobDetail; +} diff --git a/src/main/java/org/breedinginsight/model/job/JobDetail.java b/src/main/java/org/breedinginsight/model/job/JobDetail.java new file mode 100644 index 000000000..bb7e1f8e6 --- /dev/null +++ b/src/main/java/org/breedinginsight/model/job/JobDetail.java @@ -0,0 +1,22 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.model.job; + +public interface JobDetail { + String getJobType(); +} diff --git a/src/main/java/org/breedinginsight/services/job/JobService.java b/src/main/java/org/breedinginsight/services/job/JobService.java new file mode 100644 index 000000000..32418db80 --- /dev/null +++ b/src/main/java/org/breedinginsight/services/job/JobService.java @@ -0,0 +1,71 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.services.job; + +import lombok.SneakyThrows; +import org.breedinginsight.brapps.importer.model.response.ImportResponse; +import org.breedinginsight.brapps.importer.services.FileImportService; +import org.breedinginsight.model.job.Job; +import org.breedinginsight.services.ProgramService; +import org.breedinginsight.services.exceptions.DoesNotExistException; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +public class JobService { + private FileImportService fileImportService; + private ProgramService programService; + + @Inject + public JobService(FileImportService fileImportService, ProgramService programService) { + this.fileImportService = fileImportService; + this.programService = programService; + } + + public List getProgramJobs(UUID programId) throws DoesNotExistException { + if (programService.getById(programId) + .isEmpty()) { + throw new DoesNotExistException("Program id does not exist"); + } + + List jobs = new ArrayList<>(); + jobs.addAll(getProgramImports(programId)); + + return jobs; + } + + @SneakyThrows + private List getProgramImports(UUID programId) { + List uploads = fileImportService.getProgramUploads(programId, false); + return uploads.stream() + .map(importJob -> new Job().setJobDetail(importJob) + .setJobType(importJob.getImportType()) + .setCreatedAt(importJob.getCreatedAt()) + .setUpdatedAt(importJob.getProgress().getUpdatedAt()) + .setStatuscode(importJob.getProgress() + .getStatuscode()) + .setCreatedByUser(importJob.getCreatedByUser()) + .setStatusMessage(importJob.getProgress() + .getMessage()) + ) + .collect(Collectors.toList()); + } +} From 2305b35b928366796a0e6e06159fa27a9df33efc Mon Sep 17 00:00:00 2001 From: Tim Parsons Date: Thu, 26 May 2022 23:30:19 -0400 Subject: [PATCH 3/6] [BI-1459] - Updating response model to use DataResponse --- .../api/v1/controller/JobController.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/breedinginsight/api/v1/controller/JobController.java b/src/main/java/org/breedinginsight/api/v1/controller/JobController.java index 1f51fedde..621493eb0 100644 --- a/src/main/java/org/breedinginsight/api/v1/controller/JobController.java +++ b/src/main/java/org/breedinginsight/api/v1/controller/JobController.java @@ -19,16 +19,28 @@ import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; -import io.micronaut.http.annotation.*; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.PathVariable; +import io.micronaut.http.annotation.Produces; import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.api.auth.*; +import org.breedinginsight.api.auth.AuthenticatedUser; +import org.breedinginsight.api.auth.ProgramSecured; +import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; +import org.breedinginsight.api.auth.SecurityService; +import org.breedinginsight.api.model.v1.response.DataResponse; import org.breedinginsight.api.model.v1.response.Response; +import org.breedinginsight.api.model.v1.response.metadata.Metadata; +import org.breedinginsight.api.model.v1.response.metadata.Pagination; +import org.breedinginsight.api.model.v1.response.metadata.Status; +import org.breedinginsight.api.model.v1.response.metadata.StatusCode; import org.breedinginsight.api.v1.controller.metadata.AddMetadata; import org.breedinginsight.model.job.Job; import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.job.JobService; import javax.inject.Inject; +import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -48,11 +60,16 @@ public JobController(SecurityService securityService, JobService jobService) { @Produces(MediaType.APPLICATION_JSON) @AddMetadata @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) - public HttpResponse>> getProgramUploads(@PathVariable UUID programId) { + public HttpResponse>> getProgramJobs(@PathVariable UUID programId) { log.debug(String.format("fetching jobs for program: %s", programId)); try { AuthenticatedUser actingUser = securityService.getUser(); - Response> response = new Response(jobService.getProgramJobs(programId)); + var programJobs = jobService.getProgramJobs(programId); + List metadataStatus = new ArrayList<>(); + metadataStatus.add(new Status(StatusCode.INFO, "Successful Query")); + Pagination pagination = new Pagination(programJobs.size(), programJobs.size(), 1, 0); + Metadata metadata = new Metadata(pagination, metadataStatus); + Response> response = new Response<>(metadata, new DataResponse<>(programJobs)); return HttpResponse.ok(response); } catch (DoesNotExistException e) { log.info(e.getMessage(), e); From ae02f01e245f9f851a8ff849e0bc261fa2510d53 Mon Sep 17 00:00:00 2001 From: timparsons Date: Thu, 26 May 2022 23:31:52 -0400 Subject: [PATCH 4/6] [BI-1459] - Adding tests for jobs endpoint Had to bump up testcontainers to 1.15.3, and make sure the jna dependency was at 5.7.0 to support running unit test on ARM processors --- pom.xml | 7 +- .../JobControllerIntegrationTest.java | 153 ++++++++++++++++++ .../sql/JobControllerIntegrationTest.sql | 30 ++++ 3 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/breedinginsight/api/v1/controller/JobControllerIntegrationTest.java create mode 100644 src/test/resources/sql/JobControllerIntegrationTest.sql diff --git a/pom.xml b/pom.xml index 45d2a243d..66f602440 100644 --- a/pom.xml +++ b/pom.xml @@ -139,6 +139,11 @@ pom import + + net.java.dev.jna + jna + 5.7.0 + @@ -296,7 +301,7 @@ org.testcontainers testcontainers - 1.15.2 + 1.15.3 test diff --git a/src/test/java/org/breedinginsight/api/v1/controller/JobControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/JobControllerIntegrationTest.java new file mode 100644 index 000000000..fdf7ab39f --- /dev/null +++ b/src/test/java/org/breedinginsight/api/v1/controller/JobControllerIntegrationTest.java @@ -0,0 +1,153 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.api.v1.controller; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.kowalski.fannypack.FannyPack; +import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; +import io.micronaut.http.client.RxHttpClient; +import io.micronaut.http.client.annotation.Client; +import io.micronaut.http.netty.cookies.NettyCookie; +import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.annotation.MockBean; +import io.reactivex.Flowable; +import org.breedinginsight.DatabaseTest; +import org.breedinginsight.daos.ProgramDAO; +import org.breedinginsight.daos.UserDAO; +import org.breedinginsight.model.Program; +import org.breedinginsight.model.ProgramBrAPIEndpoints; +import org.breedinginsight.model.User; +import org.breedinginsight.services.ProgramService; +import org.breedinginsight.services.exceptions.DoesNotExistException; +import org.jooq.DSLContext; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; + +import javax.inject.Inject; + +import java.util.Optional; +import java.util.UUID; + +import static io.micronaut.http.HttpRequest.GET; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@MicronautTest +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class JobControllerIntegrationTest extends DatabaseTest { + + private User testUser; + private Program program; + + @MockBean(ProgramService.class) + ProgramService programService() { + return mock(ProgramService.class); + } + + @Inject + private ProgramService programService; + + @Inject + @Client("/${micronaut.bi.api.version}") + private RxHttpClient client; + + @Inject + private DSLContext dsl; + + @Inject + private ProgramDAO programDAO; + + @Inject + private UserDAO userDAO; + + @BeforeAll + public void setup() { + try { + var securityFp = FannyPack.fill("src/test/resources/sql/ProgramSecuredAnnotationRuleIntegrationTest.sql"); + dsl.execute(securityFp.get("InsertPrograms")); + + + var programs = programDAO.getAll(); + program = programs.get(0); + + // Insert system roles + testUser = userDAO.getUserByOrcId(TestTokenValidator.TEST_USER_ORCID) + .get(); + dsl.execute(securityFp.get("InsertSystemRoleAdmin"), + testUser.getId() + .toString()); + dsl.execute(securityFp.get("InsertProgramRolesBreeder"), + testUser.getId() + .toString(), + program.getId() + .toString()); + + var jobFp = FannyPack.fill("src/test/resources/sql/JobControllerIntegrationTest.sql"); + dsl.execute(jobFp.get("InsertJobs"), program.getId().toString(), program.getId().toString()); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + @AfterAll + public void finish() { super.stopContainers(); } + + @Test + public void fetchJobs() throws DoesNotExistException { + try { + when(programService.getById(program.getId())).thenReturn(Optional.of(program)); + when(programService.getBrapiEndpoints(any(UUID.class))).thenReturn(new ProgramBrAPIEndpoints()); + + Flowable> call = client.exchange( + GET(String.format("/programs/%s/jobs", program.getId().toString())) + .cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + ); + + HttpResponse response = call.blockingFirst(); + assertEquals(HttpStatus.OK, response.getStatus()); + + JsonObject result = JsonParser.parseString(response.body()) + .getAsJsonObject() + .getAsJsonObject("result"); + JsonArray data = result.getAsJsonArray("data"); + for (JsonElement obj : data) { + JsonObject job = (JsonObject) obj; + assertNotNull(job.get("statuscode")); + assertNotNull(job.get("statusMessage")); + assertNotNull(job.get("jobType")); + assertNotNull(job.get("createdAt")); + assertNotNull(job.get("createdByUser")); + assertNotNull(job.get("jobDetail")); + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + +} diff --git a/src/test/resources/sql/JobControllerIntegrationTest.sql b/src/test/resources/sql/JobControllerIntegrationTest.sql new file mode 100644 index 000000000..596c44bda --- /dev/null +++ b/src/test/resources/sql/JobControllerIntegrationTest.sql @@ -0,0 +1,30 @@ +-- name: CopyrightNotice +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +-- name: InsertJobs +INSERT INTO public.importer_progress (id, statuscode, message, body, total, finished, in_progress, created_at, updated_at, created_by, updated_by) VALUES ('d02090c3-e40d-45f4-9a63-b8c701c9531b', 202, 'Uploading to brapi service', null, 500, 100, 400, '2022-05-05 21:42:42 +00:00', '2022-05-05 21:42:42 +00:00', (select id from bi_user where orcid = '1111-2222-3333-4444'), (select id from bi_user where orcid = '1111-2222-3333-4444')); +INSERT INTO public.importer_progress (id, statuscode, message, body, total, finished, in_progress, created_at, updated_at, created_by, updated_by) VALUES ('066a37e4-c2e7-4d04-9175-7164c7dce70f', 200, 'Completed upload to brapi service', null, 17, 1, 0, '2022-05-17 14:19:33 +00:00', '2022-05-17 14:19:33 +00:00', (select id from bi_user where orcid = '1111-2222-3333-4444'), (select id from bi_user where orcid = '1111-2222-3333-4444')); + +INSERT INTO public.importer_import (id, program_id, user_id, importer_mapping_id, importer_progress_id, upload_file_name, file_data, modified_data, mapped_data, created_at, updated_at, created_by, updated_by) VALUES ('9aeeace2-7370-4b7d-a574-0ea799a342ef', ?::uuid, (select id from bi_user where orcid = '1111-2222-3333-4444'), (select id from importer_mapping where name = 'GermplasmTemplateMap'), '066a37e4-c2e7-4d04-9175-7164c7dce70f', 'germ import 2.xlsx', '[{"Name": "Gnome-1", "Source": "USDA", "Entry No": "1", "External UID": "", "Breeding Method": "UMM", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-2", "Source": "USDA", "Entry No": "2", "External UID": "", "Breeding Method": "UMM", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3", "Source": "Breeding Insight", "Entry No": "3", "External UID": "", "Breeding Method": "BPC", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "2", "Female Parent Entry No": "1"}, {"Name": "Gnome-3-1", "Source": "Breeding Insight", "Entry No": "4", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-2", "Source": "Breeding Insight", "Entry No": "5", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-3", "Source": "Breeding Insight", "Entry No": "6", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-4", "Source": "Breeding Insight", "Entry No": "7", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-5", "Source": "Breeding Insight", "Entry No": "8", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-6", "Source": "Breeding Insight", "Entry No": "9", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-7", "Source": "Breeding Insight", "Entry No": "10", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-11", "Source": "Theoretical Breeding Institute", "Entry No": "11", "External UID": "", "Breeding Method": "BCR", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "1", "Female Parent Entry No": "9"}, {"Name": "Gnome-11", "Source": "Theoretical Breeding Institute", "Entry No": "12", "External UID": "", "Breeding Method": "BCR", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "1", "Female Parent Entry No": "3"}, {"Name": "Gnome-11", "Source": "Theoretical Breeding Institute", "Entry No": "13", "External UID": "", "Breeding Method": "BCR", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "1", "Female Parent Entry No": "7"}]', null, '{"rows": [{"germplasm": {"id": "1580b261-f504-4a7e-bbc7-e5599f0b2f4b", "state": "NEW", "brAPIObject": {"seedSource": "USDA", "germplasmName": "Gnome-1 [MNTTIM-1]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Unknown maintenance method", "breedingMethodId": "af40db90-64ab-444d-a749-2f857bc90f64", "importEntryNumber": "1"}, "commonCropName": "test", "accessionNumber": "1", "defaultDisplayName": "Gnome-1", "externalReferences": [{"referenceID": "6a1269cb-6e7a-4b87-a353-c681c214bd69", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "7e665eb0-2f7b-4b14-85a4-50f5508de2a8", "state": "NEW", "brAPIObject": {"seedSource": "USDA", "germplasmName": "Gnome-2 [MNTTIM-2]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Unknown maintenance method", "breedingMethodId": "af40db90-64ab-444d-a749-2f857bc90f64", "importEntryNumber": "2"}, "commonCropName": "test", "accessionNumber": "2", "defaultDisplayName": "Gnome-2", "externalReferences": [{"referenceID": "bcc3fab6-04ed-4e2f-b0b0-9e9b247462ef", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "eddb03ff-09c5-481d-9c1c-8fc609d432e5", "state": "NEW", "brAPIObject": {"pedigree": "Gnome-1 [MNTTIM-1]/Gnome-2 [MNTTIM-2]", "seedSource": "Breeding Insight", "germplasmName": "Gnome-3 [MNTTIM-3]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Biparental cross", "breedingMethodId": "aee4d3a3-0df8-422f-b052-d9f0b81e5b4d", "importEntryNumber": "3", "maleParentEntryNo": "2", "femaleParentEntryNo": "1"}, "commonCropName": "test", "accessionNumber": "3", "defaultDisplayName": "Gnome-3", "externalReferences": [{"referenceID": "24c3164e-0b37-44b4-8b18-9118ca9b2949", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "42ff9b3e-3f04-42f3-909b-2aaa158457e5", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-1 [MNTTIM-4]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "4"}, "commonCropName": "test", "accessionNumber": "4", "defaultDisplayName": "Gnome-3-1", "externalReferences": [{"referenceID": "c271722b-488b-41c8-9671-73ac008be522", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "883cef8e-34c9-43f7-8062-d7d80c8a65fd", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-2 [MNTTIM-5]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "5"}, "commonCropName": "test", "accessionNumber": "5", "defaultDisplayName": "Gnome-3-2", "externalReferences": [{"referenceID": "6bb014ce-0c5f-480c-a1e2-9b87a914a733", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "6215c013-2ed9-43c1-a964-15f87024da36", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-3 [MNTTIM-6]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "6"}, "commonCropName": "test", "accessionNumber": "6", "defaultDisplayName": "Gnome-3-3", "externalReferences": [{"referenceID": "988fe16a-6308-4146-9cae-be9d0cd9c295", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "bd62dec0-25d3-4bef-b9f7-5af634f78366", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-4 [MNTTIM-7]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "7"}, "commonCropName": "test", "accessionNumber": "7", "defaultDisplayName": "Gnome-3-4", "externalReferences": [{"referenceID": "28e6482a-2804-4aa8-b98d-6c4a56f8d8d2", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "c0067078-7a6d-4c99-b6ee-ab220feccddd", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-5 [MNTTIM-8]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "8"}, "commonCropName": "test", "accessionNumber": "8", "defaultDisplayName": "Gnome-3-5", "externalReferences": [{"referenceID": "e7c25b55-61f5-4845-9080-d2243171f70b", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "cdb38aac-51fc-4ea7-9b38-8072258ceac5", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-6 [MNTTIM-9]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "9"}, "commonCropName": "test", "accessionNumber": "9", "defaultDisplayName": "Gnome-3-6", "externalReferences": [{"referenceID": "ade6b8ca-b2e0-49cc-ac09-09476b1416e7", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "3f6c7d4b-fca2-4b22-aa6a-aadb347cd625", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-7 [MNTTIM-10]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "10"}, "commonCropName": "test", "accessionNumber": "10", "defaultDisplayName": "Gnome-3-7", "externalReferences": [{"referenceID": "6cd34ea3-86b0-41a2-aef0-57c101bd68fb", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "68a72f81-42b5-4425-8034-eef7d6921928", "state": "EXISTING", "brAPIObject": {"pedigree": "Gnome-3-6 [MNTTIM-9]/Gnome-1 [MNTTIM-1]", "seedSource": "Theoretical Breeding Institute", "germplasmName": "Gnome-11 [MNTTIM-11]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Backcross", "breedingMethodId": "2ac64ec4-19af-4b4a-946f-9b1be0cc1730", "importEntryNumber": "11", "maleParentEntryNo": "1", "femaleParentEntryNo": "9"}, "commonCropName": "test", "accessionNumber": "11", "defaultDisplayName": "Gnome-11", "externalReferences": [{"referenceID": "354faf95-682c-4a62-90f4-4f6c9c2d4191", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "25d84084-45a6-4d93-a683-004f95d3dc3e", "state": "EXISTING", "brAPIObject": {"pedigree": "Gnome-3 [MNTTIM-3]/Gnome-1 [MNTTIM-1]", "seedSource": "Theoretical Breeding Institute", "germplasmName": "Gnome-11 [MNTTIM-12]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Backcross", "breedingMethodId": "2ac64ec4-19af-4b4a-946f-9b1be0cc1730", "importEntryNumber": "12", "maleParentEntryNo": "1", "femaleParentEntryNo": "3"}, "commonCropName": "test", "accessionNumber": "12", "defaultDisplayName": "Gnome-11", "externalReferences": [{"referenceID": "936a608f-0e2b-4cee-b348-dbbd57cbdf65", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "569fd3a0-1960-45e0-86d4-5157e21e8130", "state": "EXISTING", "brAPIObject": {"pedigree": "Gnome-3-4 [MNTTIM-7]/Gnome-1 [MNTTIM-1]", "seedSource": "Theoretical Breeding Institute", "germplasmName": "Gnome-11 [MNTTIM-13]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Backcross", "breedingMethodId": "2ac64ec4-19af-4b4a-946f-9b1be0cc1730", "importEntryNumber": "13", "maleParentEntryNo": "1", "femaleParentEntryNo": "7"}, "commonCropName": "test", "accessionNumber": "13", "defaultDisplayName": "Gnome-11", "externalReferences": [{"referenceID": "4e708554-e088-48ce-a16d-43f1778549fa", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}], "statistics": {"Germplasm": {"newObjectCount": 13}, "Pedigree Connections": {"newObjectCount": 4}}}', '2022-05-17 14:19:33 +00:00', '2022-05-17 14:19:33 +00:00', (select id from bi_user where orcid = '1111-2222-3333-4444'), (select id from bi_user where orcid = '1111-2222-3333-4444')); + +INSERT INTO public.importer_import (id, program_id, user_id, importer_mapping_id, importer_progress_id, upload_file_name, file_data, modified_data, mapped_data, created_at, updated_at, created_by, updated_by) VALUES ('210c7175-9d7a-454c-b35f-c8aa0ee0a31e', ?::uuid, (select id from bi_user where orcid = '1111-2222-3333-4444'), (select id from importer_mapping where name = 'GermplasmTemplateMap'), 'd02090c3-e40d-45f4-9a63-b8c701c9531b', 'germ import 2.xlsx', '[{"Name": "Gnome-1", "Source": "USDA", "Entry No": "1", "External UID": "", "Breeding Method": "UMM", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-2", "Source": "USDA", "Entry No": "2", "External UID": "", "Breeding Method": "UMM", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3", "Source": "Breeding Insight", "Entry No": "3", "External UID": "", "Breeding Method": "BPC", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "2", "Female Parent Entry No": "1"}, {"Name": "Gnome-3-1", "Source": "Breeding Insight", "Entry No": "4", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-2", "Source": "Breeding Insight", "Entry No": "5", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-3", "Source": "Breeding Insight", "Entry No": "6", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-4", "Source": "Breeding Insight", "Entry No": "7", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-5", "Source": "Breeding Insight", "Entry No": "8", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-6", "Source": "Breeding Insight", "Entry No": "9", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-3-7", "Source": "Breeding Insight", "Entry No": "10", "External UID": "", "Breeding Method": "CFV", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "", "Female Parent Entry No": ""}, {"Name": "Gnome-11", "Source": "Theoretical Breeding Institute", "Entry No": "11", "External UID": "", "Breeding Method": "BCR", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "1", "Female Parent Entry No": "9"}, {"Name": "Gnome-11", "Source": "Theoretical Breeding Institute", "Entry No": "12", "External UID": "", "Breeding Method": "BCR", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "1", "Female Parent Entry No": "3"}, {"Name": "Gnome-11", "Source": "Theoretical Breeding Institute", "Entry No": "13", "External UID": "", "Breeding Method": "BCR", "Male Parent GID": "", "Female Parent GID": "", "Male Parent Entry No": "1", "Female Parent Entry No": "7"}]', null, '{"rows": [{"germplasm": {"id": "1580b261-f504-4a7e-bbc7-e5599f0b2f4b", "state": "NEW", "brAPIObject": {"seedSource": "USDA", "germplasmName": "Gnome-1 [MNTTIM-1]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Unknown maintenance method", "breedingMethodId": "af40db90-64ab-444d-a749-2f857bc90f64", "importEntryNumber": "1"}, "commonCropName": "test", "accessionNumber": "1", "defaultDisplayName": "Gnome-1", "externalReferences": [{"referenceID": "6a1269cb-6e7a-4b87-a353-c681c214bd69", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "7e665eb0-2f7b-4b14-85a4-50f5508de2a8", "state": "NEW", "brAPIObject": {"seedSource": "USDA", "germplasmName": "Gnome-2 [MNTTIM-2]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Unknown maintenance method", "breedingMethodId": "af40db90-64ab-444d-a749-2f857bc90f64", "importEntryNumber": "2"}, "commonCropName": "test", "accessionNumber": "2", "defaultDisplayName": "Gnome-2", "externalReferences": [{"referenceID": "bcc3fab6-04ed-4e2f-b0b0-9e9b247462ef", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "eddb03ff-09c5-481d-9c1c-8fc609d432e5", "state": "NEW", "brAPIObject": {"pedigree": "Gnome-1 [MNTTIM-1]/Gnome-2 [MNTTIM-2]", "seedSource": "Breeding Insight", "germplasmName": "Gnome-3 [MNTTIM-3]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Biparental cross", "breedingMethodId": "aee4d3a3-0df8-422f-b052-d9f0b81e5b4d", "importEntryNumber": "3", "maleParentEntryNo": "2", "femaleParentEntryNo": "1"}, "commonCropName": "test", "accessionNumber": "3", "defaultDisplayName": "Gnome-3", "externalReferences": [{"referenceID": "24c3164e-0b37-44b4-8b18-9118ca9b2949", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "42ff9b3e-3f04-42f3-909b-2aaa158457e5", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-1 [MNTTIM-4]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "4"}, "commonCropName": "test", "accessionNumber": "4", "defaultDisplayName": "Gnome-3-1", "externalReferences": [{"referenceID": "c271722b-488b-41c8-9671-73ac008be522", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "883cef8e-34c9-43f7-8062-d7d80c8a65fd", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-2 [MNTTIM-5]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "5"}, "commonCropName": "test", "accessionNumber": "5", "defaultDisplayName": "Gnome-3-2", "externalReferences": [{"referenceID": "6bb014ce-0c5f-480c-a1e2-9b87a914a733", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "6215c013-2ed9-43c1-a964-15f87024da36", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-3 [MNTTIM-6]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "6"}, "commonCropName": "test", "accessionNumber": "6", "defaultDisplayName": "Gnome-3-3", "externalReferences": [{"referenceID": "988fe16a-6308-4146-9cae-be9d0cd9c295", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "bd62dec0-25d3-4bef-b9f7-5af634f78366", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-4 [MNTTIM-7]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "7"}, "commonCropName": "test", "accessionNumber": "7", "defaultDisplayName": "Gnome-3-4", "externalReferences": [{"referenceID": "28e6482a-2804-4aa8-b98d-6c4a56f8d8d2", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "c0067078-7a6d-4c99-b6ee-ab220feccddd", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-5 [MNTTIM-8]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "8"}, "commonCropName": "test", "accessionNumber": "8", "defaultDisplayName": "Gnome-3-5", "externalReferences": [{"referenceID": "e7c25b55-61f5-4845-9080-d2243171f70b", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "cdb38aac-51fc-4ea7-9b38-8072258ceac5", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-6 [MNTTIM-9]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "9"}, "commonCropName": "test", "accessionNumber": "9", "defaultDisplayName": "Gnome-3-6", "externalReferences": [{"referenceID": "ade6b8ca-b2e0-49cc-ac09-09476b1416e7", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "3f6c7d4b-fca2-4b22-aa6a-aadb347cd625", "state": "NEW", "brAPIObject": {"seedSource": "Breeding Insight", "germplasmName": "Gnome-3-7 [MNTTIM-10]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Clone formation (Veg)", "breedingMethodId": "48409513-d05d-458a-acf6-a5c501734145", "importEntryNumber": "10"}, "commonCropName": "test", "accessionNumber": "10", "defaultDisplayName": "Gnome-3-7", "externalReferences": [{"referenceID": "6cd34ea3-86b0-41a2-aef0-57c101bd68fb", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "68a72f81-42b5-4425-8034-eef7d6921928", "state": "EXISTING", "brAPIObject": {"pedigree": "Gnome-3-6 [MNTTIM-9]/Gnome-1 [MNTTIM-1]", "seedSource": "Theoretical Breeding Institute", "germplasmName": "Gnome-11 [MNTTIM-11]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Backcross", "breedingMethodId": "2ac64ec4-19af-4b4a-946f-9b1be0cc1730", "importEntryNumber": "11", "maleParentEntryNo": "1", "femaleParentEntryNo": "9"}, "commonCropName": "test", "accessionNumber": "11", "defaultDisplayName": "Gnome-11", "externalReferences": [{"referenceID": "354faf95-682c-4a62-90f4-4f6c9c2d4191", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "25d84084-45a6-4d93-a683-004f95d3dc3e", "state": "EXISTING", "brAPIObject": {"pedigree": "Gnome-3 [MNTTIM-3]/Gnome-1 [MNTTIM-1]", "seedSource": "Theoretical Breeding Institute", "germplasmName": "Gnome-11 [MNTTIM-12]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Backcross", "breedingMethodId": "2ac64ec4-19af-4b4a-946f-9b1be0cc1730", "importEntryNumber": "12", "maleParentEntryNo": "1", "femaleParentEntryNo": "3"}, "commonCropName": "test", "accessionNumber": "12", "defaultDisplayName": "Gnome-11", "externalReferences": [{"referenceID": "936a608f-0e2b-4cee-b348-dbbd57cbdf65", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}, {"germplasm": {"id": "569fd3a0-1960-45e0-86d4-5157e21e8130", "state": "EXISTING", "brAPIObject": {"pedigree": "Gnome-3-4 [MNTTIM-7]/Gnome-1 [MNTTIM-1]", "seedSource": "Theoretical Breeding Institute", "germplasmName": "Gnome-11 [MNTTIM-13]", "additionalInfo": {"createdBy": {"userId": "55e268e9-cc02-44e6-ad1e-d99ea9770830", "userName": "BI-DEV Admin"}, "createdDate": "17/05/2022 10:19:54", "breedingMethod": "Backcross", "breedingMethodId": "2ac64ec4-19af-4b4a-946f-9b1be0cc1730", "importEntryNumber": "13", "maleParentEntryNo": "1", "femaleParentEntryNo": "7"}, "commonCropName": "test", "accessionNumber": "13", "defaultDisplayName": "Gnome-11", "externalReferences": [{"referenceID": "4e708554-e088-48ce-a16d-43f1778549fa", "referenceSource": "breedinginsight.org"}, {"referenceID": "ee801336-c885-44f1-873f-666ec6e0740a", "referenceSource": "breedinginsight.org/programs"}]}}}], "statistics": {"Germplasm": {"newObjectCount": 13}, "Pedigree Connections": {"newObjectCount": 4}}}', '2022-05-18 14:19:33 +00:00', '2022-05-18 14:19:33 +00:00', (select id from bi_user where orcid = '1111-2222-3333-4444'), (select id from bi_user where orcid = '1111-2222-3333-4444')); + + + + From 302ca8e69f0ea67015766fac06326fbd9e678aac Mon Sep 17 00:00:00 2001 From: timparsons Date: Wed, 1 Jun 2022 16:08:02 -0400 Subject: [PATCH 5/6] [BI-1459] - Changing error severity to be in line with other log messages --- .../brapps/importer/controllers/UploadController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java index 6c38b8471..a0da96dd6 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java @@ -100,7 +100,7 @@ public HttpResponse> getUploadData(@PathVariable UUID p return HttpResponse.ok(response); } } catch (DoesNotExistException e) { - log.info(e.getMessage(), e); + log.error(e.getMessage(), e); return HttpResponse.notFound(); } } From e0a8c76f2d0510bb0c81c07694a688595ec97482 Mon Sep 17 00:00:00 2001 From: timparsons Date: Tue, 7 Jun 2022 09:28:49 -0400 Subject: [PATCH 6/6] [BI-1459] - Adding documentation on JobDetail --- .../breedinginsight/brapps/importer/model/ImportUpload.java | 1 - src/main/java/org/breedinginsight/model/job/JobDetail.java | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java b/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java index 65ec0cbfd..ab0272ba8 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/ImportUpload.java @@ -31,7 +31,6 @@ import org.breedinginsight.dao.db.tables.pojos.ImporterImportEntity; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; -import org.breedinginsight.model.job.JobDetail; import org.jooq.Record; import tech.tablesaw.api.Table; diff --git a/src/main/java/org/breedinginsight/model/job/JobDetail.java b/src/main/java/org/breedinginsight/model/job/JobDetail.java index bb7e1f8e6..63b53b3a6 100644 --- a/src/main/java/org/breedinginsight/model/job/JobDetail.java +++ b/src/main/java/org/breedinginsight/model/job/JobDetail.java @@ -17,6 +17,9 @@ package org.breedinginsight.model.job; +/** + * Represents an object that contains the details about a specific asynchronous job. + */ public interface JobDetail { String getJobType(); }