diff --git a/backend/src/main/kotlin/org/loculus/backend/controller/SubmissionController.kt b/backend/src/main/kotlin/org/loculus/backend/controller/SubmissionController.kt index 5b1c16cb3..979422d86 100644 --- a/backend/src/main/kotlin/org/loculus/backend/controller/SubmissionController.kt +++ b/backend/src/main/kotlin/org/loculus/backend/controller/SubmissionController.kt @@ -352,7 +352,7 @@ open class SubmissionController( ) @ApiResponse( responseCode = "423", - description = "Locked. The metadata is currently being processed.", + description = "Locked. New sequence entries are currently being uploaded.", ) @GetMapping("/get-original-metadata", produces = [MediaType.APPLICATION_JSON_VALUE]) fun getOriginalMetadata( @@ -375,7 +375,7 @@ open class SubmissionController( headers.add(HttpHeaders.CONTENT_ENCODING, compression.compressionName) } - val stillProcessing = submissionDatabaseService.checkIfStillProcessingSubmittedData() + val stillProcessing = submitModel.checkIfStillProcessingSubmittedData() if (stillProcessing) { return ResponseEntity.status(HttpStatus.LOCKED).build() } diff --git a/backend/src/main/kotlin/org/loculus/backend/model/SubmitModel.kt b/backend/src/main/kotlin/org/loculus/backend/model/SubmitModel.kt index 4037ce14c..8b2105896 100644 --- a/backend/src/main/kotlin/org/loculus/backend/model/SubmitModel.kt +++ b/backend/src/main/kotlin/org/loculus/backend/model/SubmitModel.kt @@ -17,11 +17,14 @@ import org.loculus.backend.controller.UnprocessableEntityException import org.loculus.backend.service.datauseterms.DataUseTermsPreconditionValidator import org.loculus.backend.service.groupmanagement.GroupManagementPreconditionValidator import org.loculus.backend.service.submission.CompressionAlgorithm +import org.loculus.backend.service.submission.MetadataUploadAuxTable +import org.loculus.backend.service.submission.SequenceUploadAuxTable import org.loculus.backend.service.submission.UploadDatabaseService import org.loculus.backend.utils.FastaReader import org.loculus.backend.utils.metadataEntryStreamAsSequence import org.loculus.backend.utils.revisionEntryStreamAsSequence import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional import org.springframework.web.multipart.MultipartFile import java.io.BufferedInputStream import java.io.File @@ -313,4 +316,13 @@ class SubmitModel( throw UnprocessableEntityException(metadataNotPresentErrorText + sequenceNotPresentErrorText) } } + + @Transactional(readOnly = true) + fun checkIfStillProcessingSubmittedData(): Boolean { + val metadataInAuxTable: Boolean = + MetadataUploadAuxTable.select(MetadataUploadAuxTable.submissionIdColumn).count() > 0 + val sequencesInAuxTable: Boolean = + SequenceUploadAuxTable.select(SequenceUploadAuxTable.sequenceSubmissionIdColumn).count() > 0 + return metadataInAuxTable || sequencesInAuxTable + } } diff --git a/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt b/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt index 6a8dd98f4..cbbe342bc 100644 --- a/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt +++ b/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt @@ -950,14 +950,6 @@ open class SubmissionDatabaseService( ) } - fun checkIfStillProcessingSubmittedData(): Boolean { - val metadataInAuxTable: Boolean = - MetadataUploadAuxTable.select(MetadataUploadAuxTable.submissionIdColumn).count() > 0 - val sequencesInAuxTable: Boolean = - SequenceUploadAuxTable.select(SequenceUploadAuxTable.sequenceSubmissionIdColumn).count() > 0 - return metadataInAuxTable || sequencesInAuxTable - } - fun streamOriginalMetadata( authenticatedUser: AuthenticatedUser, organism: Organism, diff --git a/backend/src/main/kotlin/org/loculus/backend/service/submission/UploadDatabaseService.kt b/backend/src/main/kotlin/org/loculus/backend/service/submission/UploadDatabaseService.kt index 0d4ddd86d..f21ef89c9 100644 --- a/backend/src/main/kotlin/org/loculus/backend/service/submission/UploadDatabaseService.kt +++ b/backend/src/main/kotlin/org/loculus/backend/service/submission/UploadDatabaseService.kt @@ -7,7 +7,6 @@ import org.jetbrains.exposed.sql.VarCharColumnType import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.batchInsert import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.statements.StatementType import org.jetbrains.exposed.sql.transactions.transaction diff --git a/backend/src/test/kotlin/org/loculus/backend/controller/submission/GetOriginalMetadataEndpointTest.kt b/backend/src/test/kotlin/org/loculus/backend/controller/submission/GetOriginalMetadataEndpointTest.kt index d0b0b4a9d..d6b6f4ad5 100644 --- a/backend/src/test/kotlin/org/loculus/backend/controller/submission/GetOriginalMetadataEndpointTest.kt +++ b/backend/src/test/kotlin/org/loculus/backend/controller/submission/GetOriginalMetadataEndpointTest.kt @@ -2,13 +2,18 @@ package org.loculus.backend.controller.submission import com.fasterxml.jackson.module.kotlin.readValue import com.github.luben.zstd.ZstdInputStream +import io.mockk.every +import io.mockk.mockk +import kotlinx.datetime.LocalDateTime import org.hamcrest.CoreMatchers.`is` import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.hasSize import org.hamcrest.Matchers.not import org.junit.jupiter.api.Test import org.loculus.backend.api.AccessionVersionOriginalMetadata +import org.loculus.backend.api.Organism import org.loculus.backend.api.Status +import org.loculus.backend.auth.AuthenticatedUser import org.loculus.backend.controller.DEFAULT_ORGANISM import org.loculus.backend.controller.EndpointTest import org.loculus.backend.controller.OTHER_ORGANISM @@ -18,6 +23,8 @@ import org.loculus.backend.controller.groupmanagement.GroupManagementControllerC import org.loculus.backend.controller.groupmanagement.andGetGroupId import org.loculus.backend.controller.jacksonObjectMapper import org.loculus.backend.controller.submission.SubmitFiles.DefaultFiles +import org.loculus.backend.service.submission.UploadDatabaseService +import org.loculus.backend.utils.MetadataEntry import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.HttpHeaders import org.springframework.http.MediaType @@ -33,6 +40,7 @@ class GetOriginalMetadataEndpointTest( @Autowired val convenienceClient: SubmissionConvenienceClient, @Autowired val submissionControllerClient: SubmissionControllerClient, @Autowired val groupManagementClient: GroupManagementControllerClient, + @Autowired val uploadDatabaseService: UploadDatabaseService, ) { @Test fun `GIVEN invalid authorization token THEN returns 401 Unauthorized`() { @@ -148,4 +156,28 @@ class GetOriginalMetadataEndpointTest( val responseAccessionVersions = responseBody.map { it.displayAccessionVersion() }.toSet() assertThat(responseAccessionVersions, `is`(expectedAccessionVersions)) } + + @Test + fun `GIVEN there are sequences currently being uploaded THEN returns locked`() { + val uploadId = "upload id" + val mockUser = mockk() + every { mockUser.username }.returns("username") + + uploadDatabaseService.batchInsertMetadataInAuxTable( + uploadId = uploadId, + authenticatedUser = mockUser, + groupId = 1, + submittedOrganism = Organism("organism"), + uploadedMetadataBatch = listOf(MetadataEntry("submission id", mapOf("key" to "value"))), + uploadedAt = LocalDateTime(2024, 1, 1, 1, 1, 1), + ) + + submissionControllerClient.getOriginalMetadata() + .andExpect(status().isLocked) + + uploadDatabaseService.deleteUploadData(uploadId) + + submissionControllerClient.getOriginalMetadata() + .andExpect(status().isOk) + } }