feat(api): expose response info in requests

This commit is contained in:
Cilly Leang 2026-02-16 17:32:39 +11:00
parent 48b69c88a9
commit db1f469a4f
Signed by: cilly
GPG key ID: 6500251E087653C9
3 changed files with 20 additions and 5 deletions

View file

@ -0,0 +1,15 @@
package moe.lava.neon.api
import io.ktor.client.call.body
import io.ktor.client.statement.HttpResponse
import io.ktor.util.reflect.TypeInfo
import io.ktor.util.reflect.typeInfo
class ApiResponse<T>(
val response: HttpResponse,
private val bodyType: TypeInfo,
) {
suspend fun body() = response.body(bodyType) as T
}
inline fun <reified T> HttpResponse.wrap() = ApiResponse<T>(this, typeInfo<T>())

View file

@ -1,6 +1,5 @@
package moe.lava.neon.api.endpoints
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.header
import io.ktor.client.request.parameter
@ -8,6 +7,7 @@ import io.ktor.client.request.post
import io.ktor.client.request.setBody
import kotlinx.serialization.Serializable
import moe.lava.neon.api.ApiClient
import moe.lava.neon.api.wrap
@Serializable
data class ExperimentResponse(
@ -35,7 +35,7 @@ data class LoginResponse(
suspend fun ApiClient.getExperiments() = client.get("experiments") {
parameter("with_guild_experiments", "true")
}.body<ExperimentResponse>()
}.wrap<ExperimentResponse>()
suspend fun ApiClient.login(email: String, password: String, fingerprint: String) = client.post("auth/login") {
header("X-Fingerprint", fingerprint)
@ -43,4 +43,4 @@ suspend fun ApiClient.login(email: String, password: String, fingerprint: String
login = email,
password = password,
))
}.body<LoginResponse>()
}.wrap<LoginResponse>()

View file

@ -30,14 +30,14 @@ class AuthRepository internal constructor(
): AuthResponse {
try {
if (fingerprint == null) {
fingerprint = api.getExperiments().fingerprint
fingerprint = api.getExperiments().body().fingerprint
}
val login = api.login(
email = email,
password = password,
fingerprint = fingerprint!!,
)
).body()
logger.i { "Login success $login" }
this.token = login.token