diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java index b925d6e7..f7fc21ef 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java @@ -122,6 +122,18 @@ public ResponseEntity downloadData( private String submitJob(String jobName, String jobQueue, String jobDefinition, Map parameters) { + // Filter out null or empty parameter values before submitting to AWS Batch. + // AWS Batch returns "Parameter values must be provided" when the job definition + // declares parameters but some submitted values are null/empty. + if (parameters != null) { + var suggestedCitation = parameters.get(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue()); + // empty suggested citation is acceptable since it may be from external orgs + if (suggestedCitation == null || suggestedCitation.isEmpty()) { + log.warn("Suggested citation is null or empty for job '{}'. Submitting with unavailable as value.", jobName); + parameters.replace(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(), "unavailable"); + } + } + SubmitJobRequest submitJobRequest = SubmitJobRequest.builder() .jobName(jobName) .jobQueue(jobQueue) diff --git a/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java b/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java index 04635177..3b683a0f 100644 --- a/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java +++ b/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import au.org.aodn.ogcapi.server.core.model.enumeration.DatasetDownloadEnums; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -92,4 +93,27 @@ public void testDownloadDataCapturesSubmitJobRequest() throws JsonProcessingExce assertEquals("non-specified", captured.parameters().get("multi_polygon")); assertEquals(ResponseEntity.ok("Job submitted with ID: " + jobId), response); } + + @Test + public void submitJobReplacesEmptySuggestedCitationWithUnavailable() throws JsonProcessingException { + // Arrange + String jobId = "67890"; + SubmitJobResponse submitJobResponse = SubmitJobResponse.builder().jobId(jobId).build(); + when(batchClient.submitJob(any(SubmitJobRequest.class))).thenReturn(submitJobResponse); + // polygons set to 'non-specified' to avoid objectMapper serialization + + // Act: pass empty suggestedCitation + ResponseEntity response = restServices.downloadData( + "test-uuid", "test-dname","2023-01-01", "2023-01-31", "non-specified", "test@example.com", + "Test Ocean Data Collection", "https://metadata.imas.utas.edu.au/.../test-uuid-123", "", "geotiff"); + + // Capture the submitted request + ArgumentCaptor captor = ArgumentCaptor.forClass(SubmitJobRequest.class); + verify(batchClient, times(1)).submitJob(captor.capture()); + SubmitJobRequest captured = captor.getValue(); + + String suggestedKey = DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(); + assertEquals("unavailable", captured.parameters().get(suggestedKey)); + assertEquals(ResponseEntity.ok("Job submitted with ID: " + jobId), response); + } }