diff --git a/prime-router/src/main/kotlin/history/azure/ReportFileFunction.kt b/prime-router/src/main/kotlin/history/azure/ReportFileFunction.kt index cf88c750881..062f60a47f0 100644 --- a/prime-router/src/main/kotlin/history/azure/ReportFileFunction.kt +++ b/prime-router/src/main/kotlin/history/azure/ReportFileFunction.kt @@ -8,6 +8,7 @@ import gov.cdc.prime.router.CustomerStatus import gov.cdc.prime.router.RESTTransportType import gov.cdc.prime.router.azure.DataAccessTransaction import gov.cdc.prime.router.azure.HttpUtilities +import gov.cdc.prime.router.azure.SubmissionTableService import gov.cdc.prime.router.azure.WorkflowEngine import gov.cdc.prime.router.azure.db.tables.pojos.Action import gov.cdc.prime.router.history.ReportHistory @@ -162,9 +163,15 @@ abstract class ReportFileFunction( logger.error("Unable to fetch history for ID $id", e) return HttpUtilities.internalErrorResponse(request) } catch (ex: IllegalStateException) { - logger.error(ex) - // Errors above are actionId or UUID not found errors. - return HttpUtilities.notFoundResponse(request, ex.message) + val submission = SubmissionTableService.getInstance().getSubmission(id, "Received") + + return if (submission == null) { + logger.error(ex) + // Errors above are actionId or UUID not found errors. + HttpUtilities.notFoundResponse(request, ex.message) + } else { + HttpUtilities.okJSONResponse(request, submission) + } } } diff --git a/prime-router/src/test/kotlin/history/azure/SubmissionFunctionIntegrationTests.kt b/prime-router/src/test/kotlin/history/azure/SubmissionFunctionIntegrationTests.kt index 34bd4b30719..421070fcf08 100644 --- a/prime-router/src/test/kotlin/history/azure/SubmissionFunctionIntegrationTests.kt +++ b/prime-router/src/test/kotlin/history/azure/SubmissionFunctionIntegrationTests.kt @@ -3,6 +3,7 @@ package gov.cdc.prime.router.history.azure import assertk.assertThat import assertk.assertions.isEqualTo import assertk.assertions.isNotNull +import gov.cdc.prime.reportstream.shared.Submission import gov.cdc.prime.router.ActionLog import gov.cdc.prime.router.ActionLogLevel import gov.cdc.prime.router.FileSettings @@ -11,6 +12,7 @@ import gov.cdc.prime.router.Metadata import gov.cdc.prime.router.MimeFormat import gov.cdc.prime.router.Topic import gov.cdc.prime.router.azure.MockHttpRequestMessage +import gov.cdc.prime.router.azure.SubmissionTableService import gov.cdc.prime.router.azure.WorkflowEngine import gov.cdc.prime.router.azure.db.enums.TaskAction import gov.cdc.prime.router.common.BaseEngine @@ -26,6 +28,7 @@ import gov.cdc.prime.router.tokens.oktaSystemAdminGroup import gov.cdc.prime.router.unittest.UnitTestUtils import io.mockk.clearAllMocks import io.mockk.every +import io.mockk.mockk import io.mockk.mockkObject import io.mockk.unmockkAll import org.junit.jupiter.api.AfterEach @@ -33,6 +36,8 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.testcontainers.junit.jupiter.Testcontainers +import java.time.OffsetDateTime +import java.time.ZoneOffset @Testcontainers @ExtendWith(ReportStreamTestDatabaseSetupExtension::class) @@ -69,6 +74,40 @@ class SubmissionFunctionIntegrationTests { assertThat(historyNode.get("warnings").size()).isEqualTo(0) } + @Test + fun `it should return a history for a submission received by the submissions microservice`() { + val timestamp = OffsetDateTime.now(ZoneOffset.UTC) + val submissionId = "some-submission-id" + val submissionTableService = mockk() + every { submissionTableService.getSubmission(any(), any()) } returns Submission( + submissionId, + "Received", + "some-url", + "some-detail", + timestamp + ) + + mockkObject(SubmissionTableService.Companion) + every { SubmissionTableService.getInstance() } returns submissionTableService + + val httpRequestMessage = MockHttpRequestMessage() + + val func = setupSubmissionFunction() + + val history = func.getReportDetailedHistory(httpRequestMessage, submissionId) + assertThat(history).isNotNull() + + val historyNode = JacksonMapperUtilities.defaultMapper.readTree(history.body.toString()) + assertThat(historyNode.fieldNames().asSequence().toList()).isEqualTo( + listOf("submissionId", "overallStatus", "timestamp") + ) + assertThat(historyNode.get("submissionId").asText()).isEqualTo(submissionId) + assertThat(historyNode.get("overallStatus").asText()).isEqualTo("Received") + assertThat(historyNode.get("timestamp").asText()).isEqualTo( + timestamp.format(JacksonMapperUtilities.timestampFormatter) + ) + } + @Test fun `it should return a history for partially delivered submission`() { val submittedReport = reportGraph { diff --git a/shared/src/main/kotlin/gov/cdc/prime/reportstream/shared/Submission.kt b/shared/src/main/kotlin/gov/cdc/prime/reportstream/shared/Submission.kt index a16924e6e6a..33b44311ee9 100644 --- a/shared/src/main/kotlin/gov/cdc/prime/reportstream/shared/Submission.kt +++ b/shared/src/main/kotlin/gov/cdc/prime/reportstream/shared/Submission.kt @@ -1,6 +1,10 @@ package gov.cdc.prime.reportstream.shared import com.azure.data.tables.models.TableEntity +import com.fasterxml.jackson.annotation.JsonIgnore +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonPropertyOrder +import java.time.OffsetDateTime /** * Represents a submission entity to be stored in Azure Table Storage. @@ -10,11 +14,16 @@ import com.azure.data.tables.models.TableEntity * @property bodyURL The URL pointing to the body of the submission. * @property detail Optional additional details about the submission. */ +@JsonPropertyOrder(value = ["submissionId", "overallStatus", "timestamp"]) data class Submission( val submissionId: String, + @JsonProperty("overallStatus") val status: String, + @JsonIgnore val bodyURL: String, + @JsonIgnore val detail: String? = null, + val timestamp: OffsetDateTime? = null ) { companion object { /** @@ -28,7 +37,8 @@ data class Submission( submissionId = tableEntity.partitionKey, status = tableEntity.rowKey, bodyURL = tableEntity.getProperty("body_url") as String, - detail = tableEntity.getProperty("detail") as String? + detail = tableEntity.getProperty("detail") as String?, + timestamp = tableEntity.timestamp ) } }