diff --git a/backend/src/main/kotlin/org/loculus/backend/controller/DashboardController.kt b/backend/src/main/kotlin/org/loculus/backend/controller/DashboardController.kt new file mode 100644 index 0000000000..1a72e6a39b --- /dev/null +++ b/backend/src/main/kotlin/org/loculus/backend/controller/DashboardController.kt @@ -0,0 +1,31 @@ +package org.loculus.backend.controller + +import io.swagger.v3.oas.annotations.Operation +import io.swagger.v3.oas.annotations.security.SecurityRequirement +import org.loculus.backend.service.submission.PipelineVersionDashboardService +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + +data class PipelineVersionStats( + val pipelineVersion: Long, + val sequenceCount: Long, + val isCurrentVersion: Boolean +) + +data class PipelineVersionDashboard( + val stats: List, + val totalSequences: Long +) + +@RestController +@SecurityRequirement(name = "bearerAuth") +class PipelineVersionDashboardController( + private val pipelineVersionDashboardService: PipelineVersionDashboardService +) { + @Operation( + description = "Get statistics about how many sequences are processed with each pipeline version" + ) + @GetMapping("/pipeline-version-dashboard") + fun getPipelineVersionDashboard(): PipelineVersionDashboard = + pipelineVersionDashboardService.getPipelineVersionStats() +} diff --git a/backend/src/main/kotlin/org/loculus/backend/service/dashboard/DashboardControllerService.kt b/backend/src/main/kotlin/org/loculus/backend/service/dashboard/DashboardControllerService.kt new file mode 100644 index 0000000000..2aefcca86d --- /dev/null +++ b/backend/src/main/kotlin/org/loculus/backend/service/dashboard/DashboardControllerService.kt @@ -0,0 +1,50 @@ +package org.loculus.backend.service.submission + +import org.jetbrains.exposed.sql.JoinType +import org.jetbrains.exposed.sql.Query +import org.jetbrains.exposed.sql.and +import org.jetbrains.exposed.sql.SortOrder +import org.jetbrains.exposed.sql.selectAll +import org.loculus.backend.controller.PipelineVersionDashboard +import org.loculus.backend.controller.PipelineVersionStats +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +@Transactional(readOnly = true) +class PipelineVersionDashboardService( + private val submissionDatabaseService: SubmissionDatabaseService +) { + fun getPipelineVersionStats(): PipelineVersionDashboard { + // Join sequence entries with preprocessed data to get version stats + val query = SequenceEntriesPreprocessedDataTable + .join( + SequenceEntriesTable, + JoinType.INNER, + additionalConstraint = { + (SequenceEntriesPreprocessedDataTable.accessionColumn eq SequenceEntriesTable.accessionColumn) and + (SequenceEntriesPreprocessedDataTable.versionColumn eq SequenceEntriesTable.versionColumn) + } + ) + .selectAll() + + // Count sequences per pipeline version + val versionCounts = query + .groupBy { it[SequenceEntriesPreprocessedDataTable.pipelineVersionColumn] } + .mapValues { it.value.size.toLong() } + + val currentVersion = submissionDatabaseService.getCurrentProcessingPipelineVersion() + + val stats = versionCounts.map { (version, count) -> + PipelineVersionStats( + pipelineVersion = version, + sequenceCount = count, + isCurrentVersion = version == currentVersion + ) + }.sortedBy { it.pipelineVersion } + + val totalSequences = stats.sumOf { it.sequenceCount } + + return PipelineVersionDashboard(stats, totalSequences) + } +} \ No newline at end of file