Skip to content

Commit 575070a

Browse files
author
Jonas Kellerer
committed
feat: add alignedNucleotideSequence, aminoAcidSequence endpoints
1 parent 67a9aa9 commit 575070a

38 files changed

+1533
-248
lines changed

.idea/runConfigurations/LapisV2Open.xml

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations/LapisV2Protected.xml

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lapis2/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,9 @@ openApi {
7979
apiDocsUrl.set("http://localhost:8080/api-docs")
8080
customBootRun {
8181
args.set([
82-
"--silo.url=does.not.matter.here",
83-
"--lapis.databaseConfig.path=../siloLapisTests/testData/testDatabaseConfig.yaml"
82+
"--silo.url=does.not.matter.here",
83+
"--lapis.databaseConfig.path=../siloLapisTests/testData/testDatabaseConfig.yaml",
84+
"--referenceGenomeFilename=../siloLapisTests/testData/reference-genomes.json"
8485
])
8586
}
8687
}

lapis2/docker-compose.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@ services:
44
image: ghcr.io/genspectrum/lapis-v2:${LAPIS_TAG}
55
ports:
66
- "8080:8080"
7-
command: --silo.url=http://silo:8081 --lapis.databaseConfig.path=databaseConfig.yaml
7+
command: --silo.url=http://silo:8081 --lapis.databaseConfig.path=databaseConfig.yaml --referenceGenomeFilename=reference-genomes.json
88
volumes:
99
- type: bind
1010
source: ../siloLapisTests/testData/testDatabaseConfig.yaml
1111
target: /workspace/databaseConfig.yaml
1212
read_only: true
13+
- type: bind
14+
source: ../siloLapisTests/testData/reference-genomes.json
15+
target: /workspace/reference-genomes.json
16+
read_only: true
1317

1418
silo:
1519
image: ghcr.io/genspectrum/lapis-silo:${SILO_TAG}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package org.genspectrum.lapis
22

3+
import org.genspectrum.lapis.config.ReferenceGenome
34
import org.springframework.boot.autoconfigure.SpringBootApplication
45
import org.springframework.boot.runApplication
56

67
@SpringBootApplication
78
class Lapisv2Application
89

910
fun main(args: Array<String>) {
10-
runApplication<Lapisv2Application>(*args)
11+
val referenceGenomeArgs = ReferenceGenome.readFromFileFromProgramArgs(args).toSpringApplicationArgs()
12+
13+
runApplication<Lapisv2Application>(*(args + referenceGenomeArgs))
1114
}

lapis2/src/main/kotlin/org/genspectrum/lapis/LapisSpringConfig.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import com.fasterxml.jackson.module.kotlin.readValue
44
import mu.KotlinLogging
55
import org.genspectrum.lapis.auth.DataOpennessAuthorizationFilterFactory
66
import org.genspectrum.lapis.config.DatabaseConfig
7+
import org.genspectrum.lapis.config.NucleotideSequence
8+
import org.genspectrum.lapis.config.REFERENCE_GENOME_APPLICATION_ARG_PREFIX
9+
import org.genspectrum.lapis.config.ReferenceGenome
710
import org.genspectrum.lapis.config.SequenceFilterFields
811
import org.genspectrum.lapis.logging.RequestContext
912
import org.genspectrum.lapis.logging.RequestContextLogger
@@ -60,4 +63,11 @@ class LapisSpringConfig {
6063
fun dataOpennessAuthorizationFilter(
6164
dataOpennessAuthorizationFilterFactory: DataOpennessAuthorizationFilterFactory,
6265
) = dataOpennessAuthorizationFilterFactory.create()
66+
67+
@Bean
68+
fun referenceGenome(
69+
@Value("\${$REFERENCE_GENOME_APPLICATION_ARG_PREFIX}") nucleotideSegments: List<String>,
70+
): ReferenceGenome {
71+
return ReferenceGenome(nucleotideSegments.map { NucleotideSequence(it) })
72+
}
6373
}

lapis2/src/main/kotlin/org/genspectrum/lapis/OpenApiDocs.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import org.genspectrum.lapis.controller.ORDER_BY_FIELDS_SCHEMA
4242
import org.genspectrum.lapis.controller.ORDER_BY_PROPERTY
4343
import org.genspectrum.lapis.controller.REQUEST_SCHEMA_WITH_MIN_PROPORTION
4444
import org.genspectrum.lapis.controller.SEQUENCE_FILTERS_SCHEMA
45+
import org.genspectrum.lapis.controller.SEQUENCE_REQUEST_SCHEMA
4546
import org.genspectrum.lapis.request.AminoAcidInsertion
4647
import org.genspectrum.lapis.request.AminoAcidMutation
4748
import org.genspectrum.lapis.request.NucleotideInsertion
@@ -64,8 +65,9 @@ fun buildOpenApiSchema(sequenceFilterFields: SequenceFilterFields, databaseConfi
6465
Pair(AMINO_ACID_INSERTIONS_PROPERTY, aminoAcidInsertions()) +
6566
Pair(ORDER_BY_PROPERTY, orderByPostSchema()) +
6667
Pair(LIMIT_PROPERTY, limitSchema()) +
67-
Pair(OFFSET_PROPERTY, offsetSchema()) +
68-
Pair(FORMAT_PROPERTY, formatSchema())
68+
Pair(OFFSET_PROPERTY, offsetSchema())
69+
70+
val sequenceFiltersWithFormat = sequenceFilters + Pair(FORMAT_PROPERTY, formatSchema())
6971

7072
return OpenAPI()
7173
.components(
@@ -82,18 +84,24 @@ fun buildOpenApiSchema(sequenceFilterFields: SequenceFilterFields, databaseConfi
8284
Schema<String>()
8385
.type("object")
8486
.description("valid filters for sequence data")
85-
.properties(sequenceFilters + Pair(MIN_PROPORTION_PROPERTY, Schema<String>().type("number"))),
87+
.properties(
88+
sequenceFiltersWithFormat + Pair(MIN_PROPORTION_PROPERTY, Schema<String>().type("number")),
89+
),
8690
)
8791
.addSchemas(
8892
AGGREGATED_REQUEST_SCHEMA,
89-
requestSchemaWithFields(sequenceFilters, AGGREGATED_GROUP_BY_FIELDS_DESCRIPTION),
93+
requestSchemaWithFields(sequenceFiltersWithFormat, AGGREGATED_GROUP_BY_FIELDS_DESCRIPTION),
9094
)
9195
.addSchemas(
9296
DETAILS_REQUEST_SCHEMA,
93-
requestSchemaWithFields(sequenceFilters, DETAILS_FIELDS_DESCRIPTION),
97+
requestSchemaWithFields(sequenceFiltersWithFormat, DETAILS_FIELDS_DESCRIPTION),
9498
)
9599
.addSchemas(
96100
INSERTIONS_REQUEST_SCHEMA,
101+
requestSchemaForCommonSequenceFilters(sequenceFiltersWithFormat),
102+
)
103+
.addSchemas(
104+
SEQUENCE_REQUEST_SCHEMA,
97105
requestSchemaForCommonSequenceFilters(sequenceFilters),
98106
)
99107
.addSchemas(

lapis2/src/main/kotlin/org/genspectrum/lapis/auth/DataOpennessAuthorizationFilter.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@ import org.genspectrum.lapis.config.AccessKeysReader
99
import org.genspectrum.lapis.config.DatabaseConfig
1010
import org.genspectrum.lapis.config.OpennessLevel
1111
import org.genspectrum.lapis.controller.ACCESS_KEY_PROPERTY
12+
import org.genspectrum.lapis.controller.AGGREGATED_ROUTE
13+
import org.genspectrum.lapis.controller.AMINO_ACID_INSERTIONS_ROUTE
14+
import org.genspectrum.lapis.controller.AMINO_ACID_MUTATIONS_ROUTE
1215
import org.genspectrum.lapis.controller.LapisError
1316
import org.genspectrum.lapis.controller.LapisErrorResponse
17+
import org.genspectrum.lapis.controller.NUCLEOTIDE_INSERTIONS_ROUTE
18+
import org.genspectrum.lapis.controller.NUCLEOTIDE_MUTATIONS_ROUTE
1419
import org.genspectrum.lapis.util.CachedBodyHttpServletRequest
1520
import org.springframework.http.HttpStatus
1621
import org.springframework.http.MediaType
@@ -93,7 +98,13 @@ private class ProtectedDataAuthorizationFilter(
9398

9499
companion object {
95100
private val WHITELISTED_PATHS = listOf("/swagger-ui", "/api-docs")
96-
private val ENDPOINTS_THAT_SERVE_AGGREGATED_DATA = listOf("/aggregated", "/nucleotideMutations")
101+
private val ENDPOINTS_THAT_SERVE_AGGREGATED_DATA = listOf(
102+
AGGREGATED_ROUTE,
103+
NUCLEOTIDE_MUTATIONS_ROUTE,
104+
AMINO_ACID_MUTATIONS_ROUTE,
105+
NUCLEOTIDE_INSERTIONS_ROUTE,
106+
AMINO_ACID_INSERTIONS_ROUTE,
107+
)
97108
}
98109

99110
override fun isAuthorizedForEndpoint(request: CachedBodyHttpServletRequest): AuthorizationResult {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.genspectrum.lapis.config
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
4+
import com.fasterxml.jackson.annotation.JsonProperty
5+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
6+
import com.fasterxml.jackson.module.kotlin.readValue
7+
import java.io.File
8+
9+
const val REFERENCE_GENOME_APPLICATION_ARG_PREFIX = "referenceGenome.nucleotideSequences"
10+
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
class ReferenceGenome(
13+
@JsonProperty("nucleotide_sequences")
14+
val nucleotideSequences: List<NucleotideSequence>,
15+
) {
16+
fun isSingleSegmented(): Boolean {
17+
return nucleotideSequences.size == 1
18+
}
19+
20+
companion object {
21+
fun readFromFile(filename: String): ReferenceGenome {
22+
return jacksonObjectMapper().readValue(File(filename))
23+
}
24+
25+
private fun readFilenameFromProgramArgs(args: Array<String>): String {
26+
val referenceGenomeArg = args.find { it.startsWith("--referenceGenomeFilename=") }
27+
return referenceGenomeArg?.substringAfter("=") ?: throw IllegalArgumentException(
28+
"No reference genome filename specified. Please specify a reference genome filename using the " +
29+
"--referenceGenomeFilename argument.",
30+
)
31+
}
32+
33+
fun readFromFileFromProgramArgs(args: Array<String>): ReferenceGenome {
34+
return readFromFile(readFilenameFromProgramArgs(args))
35+
}
36+
}
37+
38+
fun toSpringApplicationArgs(): Array<String> {
39+
val nucleotideSequenceArgs =
40+
"--$REFERENCE_GENOME_APPLICATION_ARG_PREFIX=" + this.nucleotideSequences.joinToString(
41+
separator = ",",
42+
) {
43+
it.name
44+
}
45+
46+
return arrayOf(nucleotideSequenceArgs)
47+
}
48+
}
49+
50+
@JsonIgnoreProperties(ignoreUnknown = true)
51+
data class NucleotideSequence(
52+
val name: String,
53+
)

lapis2/src/main/kotlin/org/genspectrum/lapis/config/SingleSegmentedSequenceFeature.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)