56 lines
1.7 KiB
Kotlin
56 lines
1.7 KiB
Kotlin
package dev.inmo.postssystem.features.auth.client
|
|
|
|
import dev.inmo.postssystem.features.auth.common.*
|
|
import dev.inmo.postssystem.features.users.common.User
|
|
import dev.inmo.micro_utils.ktor.client.UnifiedRequester
|
|
import dev.inmo.micro_utils.ktor.common.buildStandardUrl
|
|
import io.ktor.client.HttpClient
|
|
import io.ktor.client.request.HttpRequestBuilder
|
|
import kotlinx.serialization.builtins.nullable
|
|
|
|
class ClientAuthFeature(
|
|
private val requester: UnifiedRequester,
|
|
baseUrl: String
|
|
) : AuthFeature {
|
|
private val rootUrl = buildStandardUrl(baseUrl.dropLastWhile { it == '/' }, authRootPathPart)
|
|
private val fullAuthPath = buildStandardUrl(
|
|
rootUrl,
|
|
authAuthPathPart
|
|
)
|
|
private val fullRefreshPath = buildStandardUrl(
|
|
rootUrl,
|
|
authRefreshPathPart
|
|
)
|
|
private val fullGetMePath = buildStandardUrl(
|
|
rootUrl,
|
|
authGetMePathPart
|
|
)
|
|
|
|
constructor(client: HttpClient, rootUrl: String): this(
|
|
UnifiedRequester(client),
|
|
rootUrl
|
|
)
|
|
|
|
override suspend fun auth(creds: AuthCreds): AuthTokenInfo? = requester.unipost(
|
|
fullAuthPath,
|
|
AuthCreds.serializer() to creds,
|
|
AuthTokenInfo.serializer().nullable
|
|
)
|
|
|
|
override suspend fun refresh(refresh: RefreshToken): AuthTokenInfo? = requester.unipost(
|
|
fullRefreshPath,
|
|
RefreshToken.serializer() to refresh,
|
|
AuthTokenInfo.serializer().nullable
|
|
)
|
|
|
|
override suspend fun getMe(authToken: AuthToken): User? = requester.unipost(
|
|
fullGetMePath,
|
|
AuthToken.serializer() to authToken,
|
|
User.serializer().nullable
|
|
)
|
|
|
|
fun isAuthRequest(builder: HttpRequestBuilder): Boolean = builder.url.buildString().let {
|
|
it == fullAuthPath || it == fullRefreshPath
|
|
}
|
|
}
|