mirror of
https://github.com/ReVanced/revanced-api.git
synced 2026-01-17 16:33:57 +00:00
Compare commits
4 Commits
v1.2.0-dev
...
v1.3.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84ea5e4a41 | ||
|
|
491533d3f4 | ||
|
|
ef5f0b5ddd | ||
|
|
c0dc763f99 |
22
CHANGELOG.md
22
CHANGELOG.md
@@ -1,3 +1,25 @@
|
|||||||
|
# [1.3.0-dev.1](https://github.com/ReVanced/revanced-api/compare/v1.2.0...v1.3.0-dev.1) (2024-09-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Add missing parameter and response documentation ([491533d](https://github.com/ReVanced/revanced-api/commit/491533d3f44ccd716eee80123d0875a05eb9435b))
|
||||||
|
|
||||||
|
# [1.2.0](https://github.com/ReVanced/revanced-api/compare/v1.1.0...v1.2.0) (2024-09-06)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Add back deprecated routes for backwards compatibility ([9f0eb5b](https://github.com/ReVanced/revanced-api/commit/9f0eb5bfe9d0436e76462b9c094f8b1158e04a44))
|
||||||
|
* Make sure, expected paths in configuration exist ([32bedb7](https://github.com/ReVanced/revanced-api/commit/32bedb7fad3eef8116625964e5e1f0a2543ea2a4))
|
||||||
|
* Return correct GPG keys url ([#187](https://github.com/ReVanced/revanced-api/issues/187)) ([74e5389](https://github.com/ReVanced/revanced-api/commit/74e53891a17bd3f76f358477e4228550e6f70149))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Move /latest routes to parent ([4e8e83d](https://github.com/ReVanced/revanced-api/commit/4e8e83db1a20c76a81967af4e7e3a8634649790a))
|
||||||
|
* Respond to all ping request methods ([df116bd](https://github.com/ReVanced/revanced-api/commit/df116bd22134c8222c72b28e9387bc9871d3473e))
|
||||||
|
|
||||||
# [1.2.0-dev.4](https://github.com/ReVanced/revanced-api/compare/v1.2.0-dev.3...v1.2.0-dev.4) (2024-09-06)
|
# [1.2.0-dev.4](https://github.com/ReVanced/revanced-api/compare/v1.2.0-dev.3...v1.2.0-dev.4) (2024-09-06)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
org.gradle.caching = true
|
org.gradle.caching = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 1.2.0-dev.4
|
version = 1.3.0-dev.1
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package app.revanced.api.configuration
|
package app.revanced.api.configuration
|
||||||
|
|
||||||
|
import io.bkbn.kompendium.core.metadata.MethodInfo
|
||||||
import io.bkbn.kompendium.core.plugin.NotarizedRoute
|
import io.bkbn.kompendium.core.plugin.NotarizedRoute
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
import io.ktor.http.content.*
|
import io.ktor.http.content.*
|
||||||
@@ -40,3 +41,11 @@ internal fun Route.staticFiles(
|
|||||||
extensions("json")
|
extensions("json")
|
||||||
},
|
},
|
||||||
) = staticFiles(remotePath, dir.toFile(), null, block)
|
) = staticFiles(remotePath, dir.toFile(), null, block)
|
||||||
|
|
||||||
|
internal fun MethodInfo.Builder<*>.canRespondUnauthorized() {
|
||||||
|
canRespond {
|
||||||
|
responseCode(HttpStatusCode.Unauthorized)
|
||||||
|
description("Unauthorized")
|
||||||
|
responseType<Unit>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package app.revanced.api.configuration.routes
|
package app.revanced.api.configuration.routes
|
||||||
|
|
||||||
|
import app.revanced.api.configuration.canRespondUnauthorized
|
||||||
import app.revanced.api.configuration.installCache
|
import app.revanced.api.configuration.installCache
|
||||||
import app.revanced.api.configuration.installNotarizedRoute
|
import app.revanced.api.configuration.installNotarizedRoute
|
||||||
import app.revanced.api.configuration.respondOrNotFound
|
import app.revanced.api.configuration.respondOrNotFound
|
||||||
@@ -8,10 +9,7 @@ import app.revanced.api.configuration.schema.APIAnnouncementArchivedAt
|
|||||||
import app.revanced.api.configuration.schema.APIResponseAnnouncement
|
import app.revanced.api.configuration.schema.APIResponseAnnouncement
|
||||||
import app.revanced.api.configuration.schema.APIResponseAnnouncementId
|
import app.revanced.api.configuration.schema.APIResponseAnnouncementId
|
||||||
import app.revanced.api.configuration.services.AnnouncementService
|
import app.revanced.api.configuration.services.AnnouncementService
|
||||||
import io.bkbn.kompendium.core.metadata.DeleteInfo
|
import io.bkbn.kompendium.core.metadata.*
|
||||||
import io.bkbn.kompendium.core.metadata.GetInfo
|
|
||||||
import io.bkbn.kompendium.core.metadata.PatchInfo
|
|
||||||
import io.bkbn.kompendium.core.metadata.PostInfo
|
|
||||||
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
|
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
|
||||||
import io.bkbn.kompendium.oas.payload.Parameter
|
import io.bkbn.kompendium.oas.payload.Parameter
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
@@ -138,9 +136,19 @@ internal fun Route.announcementsRoute() = route("announcements") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val authHeaderParameter = Parameter(
|
||||||
|
name = "Authorization",
|
||||||
|
`in` = Parameter.Location.header,
|
||||||
|
schema = TypeDefinition.STRING,
|
||||||
|
required = true,
|
||||||
|
examples = mapOf("Bearer authentication" to Parameter.Example("Bearer abc123")),
|
||||||
|
)
|
||||||
|
|
||||||
private fun Route.installAnnouncementRouteDocumentation() = installNotarizedRoute {
|
private fun Route.installAnnouncementRouteDocumentation() = installNotarizedRoute {
|
||||||
tags = setOf("Announcements")
|
tags = setOf("Announcements")
|
||||||
|
|
||||||
|
parameters = listOf(authHeaderParameter)
|
||||||
|
|
||||||
post = PostInfo.builder {
|
post = PostInfo.builder {
|
||||||
description("Create a new announcement")
|
description("Create a new announcement")
|
||||||
summary("Create announcement")
|
summary("Create announcement")
|
||||||
@@ -153,6 +161,7 @@ private fun Route.installAnnouncementRouteDocumentation() = installNotarizedRout
|
|||||||
responseCode(HttpStatusCode.OK)
|
responseCode(HttpStatusCode.OK)
|
||||||
responseType<Unit>()
|
responseType<Unit>()
|
||||||
}
|
}
|
||||||
|
canRespondUnauthorized()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,6 +248,7 @@ private fun Route.installAnnouncementArchiveRouteDocumentation() = installNotari
|
|||||||
description = "The date and time the announcement to be archived",
|
description = "The date and time the announcement to be archived",
|
||||||
required = false,
|
required = false,
|
||||||
),
|
),
|
||||||
|
authHeaderParameter,
|
||||||
)
|
)
|
||||||
|
|
||||||
post = PostInfo.builder {
|
post = PostInfo.builder {
|
||||||
@@ -249,6 +259,7 @@ private fun Route.installAnnouncementArchiveRouteDocumentation() = installNotari
|
|||||||
responseCode(HttpStatusCode.OK)
|
responseCode(HttpStatusCode.OK)
|
||||||
responseType<Unit>()
|
responseType<Unit>()
|
||||||
}
|
}
|
||||||
|
canRespondUnauthorized()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,6 +274,7 @@ private fun Route.installAnnouncementUnarchiveRouteDocumentation() = installNota
|
|||||||
description = "The id of the announcement to unarchive",
|
description = "The id of the announcement to unarchive",
|
||||||
required = true,
|
required = true,
|
||||||
),
|
),
|
||||||
|
authHeaderParameter,
|
||||||
)
|
)
|
||||||
|
|
||||||
post = PostInfo.builder {
|
post = PostInfo.builder {
|
||||||
@@ -273,6 +285,7 @@ private fun Route.installAnnouncementUnarchiveRouteDocumentation() = installNota
|
|||||||
responseCode(HttpStatusCode.OK)
|
responseCode(HttpStatusCode.OK)
|
||||||
responseType<Unit>()
|
responseType<Unit>()
|
||||||
}
|
}
|
||||||
|
canRespondUnauthorized()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,6 +300,7 @@ private fun Route.installAnnouncementIdRouteDocumentation() = installNotarizedRo
|
|||||||
description = "The id of the announcement to update",
|
description = "The id of the announcement to update",
|
||||||
required = true,
|
required = true,
|
||||||
),
|
),
|
||||||
|
authHeaderParameter,
|
||||||
)
|
)
|
||||||
|
|
||||||
patch = PatchInfo.builder {
|
patch = PatchInfo.builder {
|
||||||
@@ -301,6 +315,7 @@ private fun Route.installAnnouncementIdRouteDocumentation() = installNotarizedRo
|
|||||||
responseCode(HttpStatusCode.OK)
|
responseCode(HttpStatusCode.OK)
|
||||||
responseType<Unit>()
|
responseType<Unit>()
|
||||||
}
|
}
|
||||||
|
canRespondUnauthorized()
|
||||||
}
|
}
|
||||||
|
|
||||||
delete = DeleteInfo.builder {
|
delete = DeleteInfo.builder {
|
||||||
@@ -311,6 +326,7 @@ private fun Route.installAnnouncementIdRouteDocumentation() = installNotarizedRo
|
|||||||
responseCode(HttpStatusCode.OK)
|
responseCode(HttpStatusCode.OK)
|
||||||
responseType<Unit>()
|
responseType<Unit>()
|
||||||
}
|
}
|
||||||
|
canRespondUnauthorized()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import app.revanced.api.configuration.*
|
|||||||
import app.revanced.api.configuration.installCache
|
import app.revanced.api.configuration.installCache
|
||||||
import app.revanced.api.configuration.installNoCache
|
import app.revanced.api.configuration.installNoCache
|
||||||
import app.revanced.api.configuration.installNotarizedRoute
|
import app.revanced.api.configuration.installNotarizedRoute
|
||||||
|
import app.revanced.api.configuration.repository.ConfigurationRepository
|
||||||
import app.revanced.api.configuration.respondOrNotFound
|
import app.revanced.api.configuration.respondOrNotFound
|
||||||
import app.revanced.api.configuration.schema.APIAbout
|
import app.revanced.api.configuration.schema.APIAbout
|
||||||
import app.revanced.api.configuration.schema.APIContributable
|
import app.revanced.api.configuration.schema.APIContributable
|
||||||
@@ -12,12 +13,15 @@ import app.revanced.api.configuration.schema.APIRateLimit
|
|||||||
import app.revanced.api.configuration.services.ApiService
|
import app.revanced.api.configuration.services.ApiService
|
||||||
import app.revanced.api.configuration.services.AuthService
|
import app.revanced.api.configuration.services.AuthService
|
||||||
import io.bkbn.kompendium.core.metadata.*
|
import io.bkbn.kompendium.core.metadata.*
|
||||||
|
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
|
||||||
|
import io.bkbn.kompendium.oas.payload.Parameter
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
import io.ktor.server.application.*
|
import io.ktor.server.application.*
|
||||||
import io.ktor.server.auth.*
|
import io.ktor.server.auth.*
|
||||||
import io.ktor.server.plugins.ratelimit.*
|
import io.ktor.server.plugins.ratelimit.*
|
||||||
import io.ktor.server.response.*
|
import io.ktor.server.response.*
|
||||||
import io.ktor.server.routing.*
|
import io.ktor.server.routing.*
|
||||||
|
import kotlinx.serialization.json.Json.Default.configuration
|
||||||
import kotlin.time.Duration.Companion.days
|
import kotlin.time.Duration.Companion.days
|
||||||
import org.koin.ktor.ext.get as koinGet
|
import org.koin.ktor.ext.get as koinGet
|
||||||
|
|
||||||
@@ -165,16 +169,38 @@ private fun Route.installContributorsRouteDocumentation() = installNotarizedRout
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun Route.installTokenRouteDocumentation() = installNotarizedRoute {
|
private fun Route.installTokenRouteDocumentation() = installNotarizedRoute {
|
||||||
|
val configuration = koinGet<ConfigurationRepository>()
|
||||||
|
|
||||||
tags = setOf("API")
|
tags = setOf("API")
|
||||||
|
|
||||||
get = GetInfo.builder {
|
get = GetInfo.builder {
|
||||||
description("Get a new authorization token")
|
description("Get a new authorization token")
|
||||||
summary("Get authorization token")
|
summary("Get authorization token")
|
||||||
|
parameters(
|
||||||
|
Parameter(
|
||||||
|
name = "Authorization",
|
||||||
|
`in` = Parameter.Location.header,
|
||||||
|
schema = TypeDefinition.STRING,
|
||||||
|
required = true,
|
||||||
|
examples = mapOf(
|
||||||
|
"Digest access authentication" to Parameter.Example(
|
||||||
|
value = "Digest " +
|
||||||
|
"username=\"ReVanced\", " +
|
||||||
|
"realm=\"ReVanced\", " +
|
||||||
|
"nonce=\"abc123\", " +
|
||||||
|
"uri=\"/v${configuration.apiVersion}/token\", " +
|
||||||
|
"algorithm=SHA-256, " +
|
||||||
|
"response=\"yxz456\"",
|
||||||
|
),
|
||||||
|
), // Provide an example for the header
|
||||||
|
),
|
||||||
|
)
|
||||||
response {
|
response {
|
||||||
description("The authorization token")
|
description("The authorization token")
|
||||||
mediaTypes("application/json")
|
mediaTypes("application/json")
|
||||||
responseCode(HttpStatusCode.OK)
|
responseCode(HttpStatusCode.OK)
|
||||||
responseType<String>()
|
responseType<String>()
|
||||||
}
|
}
|
||||||
|
canRespondUnauthorized()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user