Skip to content

Commit 56ce376

Browse files
committed
Make improvements for compatibility with candidates service.
1 parent ba05ac7 commit 56ce376

File tree

4 files changed

+93
-20
lines changed

4 files changed

+93
-20
lines changed

src/main/kotlin/io/sdkman/plugins/Routing.kt

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,38 @@ fun Application.configureRouting(repo: VersionsRepository) {
2525

2626
routing {
2727
get("/versions/{candidate}") {
28-
call.parameters["candidate"].toOption().map { candidateId ->
29-
val visible = call.request.visibleQueryParam()
30-
val versions = repo.read(candidateId, visible)
31-
call.respond(HttpStatusCode.OK, versions)
32-
}.getOrElse {
33-
throw IllegalArgumentException("Candidate not found")
34-
}
35-
}
36-
get("/versions/{candidate}/{platform}") {
3728
option {
3829
val candidateId = call.parameters["candidate"].toOption().bind()
39-
val platformId = call.parameters["platform"].toOption().bind()
4030
val visible = call.request.visibleQueryParam()
41-
val versions = repo.read(candidateId, Platform.findByPlatformId(platformId), visible)
31+
val platform = call.request.queryParameters["platform"].toOption()
32+
.map { Platform.findByPlatformId(it) }
33+
val vendor = call.request.queryParameters["vendor"].toOption()
34+
val versions = repo.read(candidateId, platform, vendor, visible)
4235
call.respond(HttpStatusCode.OK, versions)
4336
}.getOrElse {
4437
throw IllegalArgumentException("Candidate or platform not found")
4538
}
4639
}
40+
get("/versions/{candidate}/{version}") {
41+
option {
42+
val candidateId = call.parameters["candidate"].toOption().bind()
43+
val versionId = call.parameters["version"].toOption().bind()
44+
val platform = call.request.queryParameters["platform"].toOption()
45+
.map { Platform.findByPlatformId(it) }
46+
.getOrElse { Platform.UNIVERSAL }
47+
val vendor = call.request.queryParameters["vendor"].toOption().getOrElse { "NONE" }
48+
val maybeVersion = repo.read(
49+
candidate = candidateId,
50+
version = versionId,
51+
platform = platform,
52+
vendor = vendor
53+
)
54+
maybeVersion.fold(
55+
{ call.respond(HttpStatusCode.NotFound) },
56+
{ call.respond(HttpStatusCode.OK, it) }
57+
)
58+
}.getOrElse { call.respond(HttpStatusCode.BadRequest) }
59+
}
4760
authenticate("auth-basic") {
4861
post("/versions") {
4962
call.receive<Version>()

src/main/kotlin/io/sdkman/repos/VersionsRepository.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.sdkman.repos
22

33
import arrow.core.Option
4+
import arrow.core.firstOrNone
45
import arrow.core.getOrElse
56
import arrow.core.toOption
67
import io.sdkman.domain.Platform
@@ -46,21 +47,34 @@ class VersionsRepository {
4647
)
4748
}
4849

49-
suspend fun read(candidate: String, visible: Option<Boolean>): List<Version> = dbQuery {
50+
suspend fun read(
51+
candidate: String,
52+
platform: Option<Platform>,
53+
vendor: Option<String>,
54+
visible: Option<Boolean>
55+
): List<Version> = dbQuery {
5056
Versions.select {
51-
Versions.candidate eq candidate and
57+
(Versions.candidate eq candidate) and
58+
platform.map { Versions.platform eq it.name }.getOrElse { Op.TRUE } and
59+
vendor.map { Versions.vendor eq it }.getOrElse { Op.TRUE } and
5260
visible.map { Versions.visible eq it }.getOrElse { Op.TRUE }
5361
}.asVersions()
5462
.sortedWith(compareBy({ it.candidate }, { it.version }, { it.vendor }, { it.platform }))
5563
}
5664

57-
suspend fun read(candidate: String, platform: Platform, visible: Option<Boolean>): List<Version> = dbQuery {
65+
suspend fun read(
66+
candidate: String,
67+
version: String,
68+
platform: Platform,
69+
vendor: String
70+
): Option<Version> = dbQuery {
5871
Versions.select {
5972
(Versions.candidate eq candidate) and
73+
(Versions.version eq version) and
6074
(Versions.platform eq platform.name) and
61-
visible.map { Versions.visible eq it }.getOrElse { Op.TRUE }
75+
(Versions.vendor eq vendor)
6276
}.asVersions()
63-
.sortedWith(compareBy({ it.candidate }, { it.version }, { it.vendor }, { it.platform }))
77+
.firstOrNone()
6478
}
6579

6680
fun create(cv: Version): InsertStatement<Number> = transaction {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.sdkman
2+
3+
import io.kotest.core.spec.style.ShouldSpec
4+
import io.kotest.matchers.shouldBe
5+
import io.ktor.client.request.*
6+
import io.ktor.client.statement.*
7+
import io.ktor.http.*
8+
import io.sdkman.domain.Platform
9+
import io.sdkman.domain.Version
10+
import io.sdkman.support.insertVersions
11+
import io.sdkman.support.toJson
12+
import io.sdkman.support.withCleanDatabase
13+
import io.sdkman.support.withTestApplication
14+
import kotlinx.serialization.json.Json
15+
import kotlinx.serialization.json.JsonObject
16+
17+
class GetVersionApiSpec : ShouldSpec({
18+
19+
should("GET a UNIVERSAL version for a candidate") {
20+
val kotlin210Universal = Version(
21+
candidate = "kotlin",
22+
version = "2.1.0",
23+
platform = Platform.UNIVERSAL,
24+
url = "https://kotlin-2.1.0-tem",
25+
visible = true,
26+
vendor = "NONE"
27+
)
28+
29+
withCleanDatabase {
30+
insertVersions(kotlin210Universal)
31+
withTestApplication {
32+
client.get("/versions/kotlin/2.1.0").apply {
33+
status shouldBe HttpStatusCode.OK
34+
Json.decodeFromString<JsonObject>(bodyAsText()) shouldBe kotlin210Universal.toJson()
35+
}
36+
}
37+
}
38+
}
39+
})

src/test/kotlin/io/sdkman/GetVersionsApiSpec.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ class GetVersionsApiSpec : ShouldSpec({
128128
withCleanDatabase {
129129
insertVersions(java17universal, java21universal)
130130
withTestApplication {
131-
client.get("/versions/java/universal").apply {
131+
client.get("/versions/java") {
132+
url { parameters.append("platform", "universal") }
133+
}.apply {
132134
status shouldBe HttpStatusCode.OK
133135
Json.decodeFromString<JsonArray>(bodyAsText()) shouldBe JsonArray(
134136
listOf(
@@ -178,7 +180,9 @@ class GetVersionsApiSpec : ShouldSpec({
178180
withCleanDatabase {
179181
insertVersions(java17linuxArm64, java21linuxArm64, java17linuxX64, java21linuxX64)
180182
withTestApplication {
181-
client.get("/versions/java/linuxarm64").apply {
183+
client.get("/versions/java") {
184+
url { parameters.append("platform", "linuxarm64") }
185+
}.apply {
182186
status shouldBe HttpStatusCode.OK
183187
Json.decodeFromString<JsonArray>(bodyAsText()) shouldBe JsonArray(
184188
listOf(
@@ -187,7 +191,9 @@ class GetVersionsApiSpec : ShouldSpec({
187191
)
188192
)
189193
}
190-
client.get("/versions/java/linuxx64").apply {
194+
client.get("/versions/java") {
195+
url { parameters.append("platform", "linuxx64") }
196+
}.apply {
191197
status shouldBe HttpStatusCode.OK
192198
Json.decodeFromString<JsonArray>(bodyAsText()) shouldBe JsonArray(
193199
listOf(
@@ -226,8 +232,9 @@ class GetVersionsApiSpec : ShouldSpec({
226232
withCleanDatabase {
227233
insertVersions(java17linuxX64, java21linuxX64)
228234
withTestApplication {
229-
client.get("/versions/java/universal") {
235+
client.get("/versions/java") {
230236
url {
237+
parameters.append("platform", "universal")
231238
parameters.append("visible", visible)
232239
}
233240
}.apply {

0 commit comments

Comments
 (0)