Skip to content

Commit c25bc8b

Browse files
committed
feat: Add support for prereleases
1 parent 8a957cd commit c25bc8b

File tree

7 files changed

+62
-20
lines changed

7 files changed

+62
-20
lines changed

Diff for: src/main/kotlin/app/revanced/api/configuration/repository/BackendRepository.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,14 @@ abstract class BackendRepository internal constructor(
135135
* @property tag The tag of the release.
136136
* @property assets The assets of the release.
137137
* @property createdAt The date and time the release was created.
138+
* @property prerelease Whether the release is a prerelease.
138139
* @property releaseNote The release note of the release.
139140
*/
140141
class BackendRelease(
141142
val tag: String,
142143
val releaseNote: String,
143144
val createdAt: LocalDateTime,
145+
val prerelease: Boolean,
144146
// Using a list instead of a set because set semantics are unnecessary here.
145147
val assets: List<BackendAsset>,
146148
) {
@@ -180,13 +182,13 @@ abstract class BackendRepository internal constructor(
180182
*
181183
* @param owner The owner of the repository.
182184
* @param repository The name of the repository.
183-
* @param tag The tag of the release. If null, the latest release is returned.
185+
* @param prerelease Whether to get a prerelease.
184186
* @return The release.
185187
*/
186188
abstract suspend fun release(
187189
owner: String,
188190
repository: String,
189-
tag: String? = null,
191+
prerelease: Boolean,
190192
): BackendOrganization.BackendRepository.BackendRelease
191193

192194
/**

Diff for: src/main/kotlin/app/revanced/api/configuration/repository/GitHubBackendRepository.kt

+7-7
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ class GitHubBackendRepository : BackendRepository("https://api.github.com", "htt
2424
override suspend fun release(
2525
owner: String,
2626
repository: String,
27-
tag: String?,
27+
prerelease: Boolean,
2828
): BackendRelease {
29-
val release: GitHubRelease = if (tag != null) {
30-
client.get(Releases.Tag(owner, repository, tag)).body()
29+
val release: GitHubRelease = if (prerelease) {
30+
client.get(Releases(owner, repository)).body<List<GitHubRelease>>().first { it.prerelease }
3131
} else {
3232
client.get(Releases.Latest(owner, repository)).body()
3333
}
@@ -36,6 +36,7 @@ class GitHubBackendRepository : BackendRepository("https://api.github.com", "htt
3636
tag = release.tagName,
3737
releaseNote = release.body,
3838
createdAt = release.createdAt.toLocalDateTime(TimeZone.UTC),
39+
prerelease = release.prerelease,
3940
assets = release.assets.map {
4041
BackendAsset(
4142
name = it.name,
@@ -163,6 +164,7 @@ class GitHubOrganization {
163164
// Using a list instead of a set because set semantics are unnecessary here.
164165
val assets: List<GitHubAsset>,
165166
val createdAt: Instant,
167+
val prerelease: Boolean,
166168
val body: String,
167169
) {
168170
@Serializable
@@ -200,10 +202,8 @@ class Organization {
200202
@Resource("/repos/{owner}/{repo}/contributors")
201203
class Contributors(val owner: String, val repo: String, @SerialName("per_page") val perPage: Int = 100)
202204

203-
class Releases {
204-
@Resource("/repos/{owner}/{repo}/releases/tags/{tag}")
205-
class Tag(val owner: String, val repo: String, val tag: String)
206-
205+
@Resource("/repos/{owner}/{repo}/releases")
206+
class Releases(val owner: String, val repo: String) {
207207
@Resource("/repos/{owner}/{repo}/releases/latest")
208208
class Latest(val owner: String, val repo: String)
209209
}

Diff for: src/main/kotlin/app/revanced/api/configuration/routes/ManagerRoute.kt

+18-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import app.revanced.api.configuration.ApiReleaseVersion
55
import app.revanced.api.configuration.installNotarizedRoute
66
import app.revanced.api.configuration.services.ManagerService
77
import io.bkbn.kompendium.core.metadata.GetInfo
8+
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
9+
import io.bkbn.kompendium.oas.payload.Parameter
810
import io.ktor.http.*
911
import io.ktor.server.application.*
1012
import io.ktor.server.plugins.ratelimit.*
@@ -19,25 +21,38 @@ internal fun Route.managerRoute() = route("manager") {
1921

2022
rateLimit(RateLimitName("weak")) {
2123
get {
22-
call.respond(managerService.latestRelease())
24+
val prerelease = call.parameters["prerelease"]?.toBoolean() ?: false
25+
26+
call.respond(managerService.latestRelease(prerelease))
2327
}
2428

2529
route("version") {
2630
installManagerVersionRouteDocumentation()
2731

2832
get {
29-
call.respond(managerService.latestVersion())
33+
val prerelease = call.parameters["prerelease"]?.toBoolean() ?: false
34+
35+
call.respond(managerService.latestVersion(prerelease))
3036
}
3137
}
3238
}
3339
}
3440

41+
private val prereleaseParameter = Parameter(
42+
name = "prerelease",
43+
`in` = Parameter.Location.query,
44+
schema = TypeDefinition.STRING,
45+
description = "Whether to get the current manager prerelease",
46+
required = false,
47+
)
48+
3549
private fun Route.installManagerRouteDocumentation() = installNotarizedRoute {
3650
tags = setOf("Manager")
3751

3852
get = GetInfo.builder {
3953
description("Get the current manager release")
4054
summary("Get current manager release")
55+
parameters(prereleaseParameter)
4156
response {
4257
description("The latest manager release")
4358
mediaTypes("application/json")
@@ -53,6 +68,7 @@ private fun Route.installManagerVersionRouteDocumentation() = installNotarizedRo
5368
get = GetInfo.builder {
5469
description("Get the current manager release version")
5570
summary("Get current manager release version")
71+
parameters(prereleaseParameter)
5672
response {
5773
description("The current manager release version")
5874
mediaTypes("application/json")

Diff for: src/main/kotlin/app/revanced/api/configuration/routes/PatchesRoute.kt

+22-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import app.revanced.api.configuration.installCache
77
import app.revanced.api.configuration.installNotarizedRoute
88
import app.revanced.api.configuration.services.PatchesService
99
import io.bkbn.kompendium.core.metadata.GetInfo
10+
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
11+
import io.bkbn.kompendium.oas.payload.Parameter
1012
import io.ktor.http.*
1113
import io.ktor.server.application.*
1214
import io.ktor.server.plugins.ratelimit.*
@@ -22,14 +24,18 @@ internal fun Route.patchesRoute() = route("patches") {
2224

2325
rateLimit(RateLimitName("weak")) {
2426
get {
25-
call.respond(patchesService.latestRelease())
27+
val prerelease = call.parameters["prerelease"]?.toBoolean() ?: false
28+
29+
call.respond(patchesService.latestRelease(prerelease))
2630
}
2731

2832
route("version") {
2933
installPatchesVersionRouteDocumentation()
3034

3135
get {
32-
call.respond(patchesService.latestVersion())
36+
val prerelease = call.parameters["prerelease"]?.toBoolean() ?: false
37+
38+
call.respond(patchesService.latestVersion(prerelease))
3339
}
3440
}
3541
}
@@ -39,7 +45,9 @@ internal fun Route.patchesRoute() = route("patches") {
3945
installPatchesListRouteDocumentation()
4046

4147
get {
42-
call.respondBytes(ContentType.Application.Json) { patchesService.list() }
48+
val prerelease = call.parameters["prerelease"]?.toBoolean() ?: false
49+
50+
call.respondBytes(ContentType.Application.Json) { patchesService.list(prerelease) }
4351
}
4452
}
4553
}
@@ -57,12 +65,21 @@ internal fun Route.patchesRoute() = route("patches") {
5765
}
5866
}
5967

68+
private val prereleaseParameter = Parameter(
69+
name = "prerelease",
70+
`in` = Parameter.Location.query,
71+
schema = TypeDefinition.STRING,
72+
description = "Whether to get the current patches prerelease",
73+
required = false,
74+
)
75+
6076
private fun Route.installPatchesRouteDocumentation() = installNotarizedRoute {
6177
tags = setOf("Patches")
6278

6379
get = GetInfo.builder {
6480
description("Get the current patches release")
6581
summary("Get current patches release")
82+
parameters(prereleaseParameter)
6683
response {
6784
description("The current patches release")
6885
mediaTypes("application/json")
@@ -78,6 +95,7 @@ private fun Route.installPatchesVersionRouteDocumentation() = installNotarizedRo
7895
get = GetInfo.builder {
7996
description("Get the current patches release version")
8097
summary("Get current patches release version")
98+
parameters(prereleaseParameter)
8199
response {
82100
description("The current patches release version")
83101
mediaTypes("application/json")
@@ -93,6 +111,7 @@ private fun Route.installPatchesListRouteDocumentation() = installNotarizedRoute
93111
get = GetInfo.builder {
94112
description("Get the list of patches from the current patches release")
95113
summary("Get list of patches from current patches release")
114+
parameters(prereleaseParameter)
96115
response {
97116
description("The list of patches")
98117
mediaTypes("application/json")

Diff for: src/main/kotlin/app/revanced/api/configuration/services/ManagerService.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ internal class ManagerService(
1010
private val backendRepository: BackendRepository,
1111
private val configurationRepository: ConfigurationRepository,
1212
) {
13-
suspend fun latestRelease(): ApiRelease {
13+
suspend fun latestRelease(prerelease: Boolean): ApiRelease {
1414
val managerRelease = backendRepository.release(
1515
configurationRepository.organization,
1616
configurationRepository.manager.repository,
17+
prerelease,
1718
)
1819

1920
return ApiRelease(
@@ -24,10 +25,11 @@ internal class ManagerService(
2425
)
2526
}
2627

27-
suspend fun latestVersion(): ApiReleaseVersion {
28+
suspend fun latestVersion(prerelease: Boolean): ApiReleaseVersion {
2829
val managerRelease = backendRepository.release(
2930
configurationRepository.organization,
3031
configurationRepository.manager.repository,
32+
prerelease,
3133
)
3234

3335
return ApiReleaseVersion(managerRelease.tag)

Diff for: src/main/kotlin/app/revanced/api/configuration/services/PatchesService.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ internal class PatchesService(
1919
private val backendRepository: BackendRepository,
2020
private val configurationRepository: ConfigurationRepository,
2121
) {
22-
suspend fun latestRelease(): ApiRelease {
22+
suspend fun latestRelease(prerelease: Boolean): ApiRelease {
2323
val patchesRelease = backendRepository.release(
2424
configurationRepository.organization,
2525
configurationRepository.patches.repository,
26+
prerelease,
2627
)
2728

2829
return ApiRelease(
@@ -34,10 +35,11 @@ internal class PatchesService(
3435
)
3536
}
3637

37-
suspend fun latestVersion(): ApiReleaseVersion {
38+
suspend fun latestVersion(prerelease: Boolean): ApiReleaseVersion {
3839
val patchesRelease = backendRepository.release(
3940
configurationRepository.organization,
4041
configurationRepository.patches.repository,
42+
prerelease,
4143
)
4244

4345
return ApiReleaseVersion(patchesRelease.tag)
@@ -48,10 +50,11 @@ internal class PatchesService(
4850
.maximumSize(1)
4951
.build<String, ByteArray>()
5052

51-
suspend fun list(): ByteArray {
53+
suspend fun list(prerelease: Boolean): ByteArray {
5254
val patchesRelease = backendRepository.release(
5355
configurationRepository.organization,
5456
configurationRepository.patches.repository,
57+
prerelease,
5558
)
5659

5760
return withContext(Dispatchers.IO) {

Diff for: src/main/kotlin/app/revanced/api/configuration/services/SignatureService.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import java.security.MessageDigest
1212
internal class SignatureService {
1313
private val signatureCache = Caffeine
1414
.newBuilder()
15-
.maximumSize(1) // 1 because currently only the latest patches is needed.
15+
.maximumSize(2) // 2 because currently only the latest release and prerelease patches are needed.
1616
.build<ByteArray, Boolean>() // Hash -> Verified.
1717

1818
fun verify(

0 commit comments

Comments
 (0)