76 lines
2.0 KiB
Kotlin
76 lines
2.0 KiB
Kotlin
package dev.inmo.postssystem.features.auth.common
|
|
|
|
import com.benasher44.uuid.uuid4
|
|
import dev.inmo.postssystem.features.users.common.Username
|
|
import kotlinx.serialization.*
|
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
|
import kotlinx.serialization.encoding.Decoder
|
|
import kotlinx.serialization.encoding.Encoder
|
|
import kotlin.jvm.JvmInline
|
|
|
|
@Serializable(AuthKeySerializer::class)
|
|
sealed interface AuthKey
|
|
|
|
@Serializable
|
|
private data class AuthKeySurrogate(
|
|
val authCreds: AuthCreds?,
|
|
val token: AuthToken?,
|
|
val refreshToken: RefreshToken?
|
|
)
|
|
|
|
@Serializer(AuthKey::class)
|
|
object AuthKeySerializer : KSerializer<AuthKey> {
|
|
override val descriptor: SerialDescriptor
|
|
get() = AuthKeySurrogate.serializer().descriptor
|
|
|
|
override fun deserialize(decoder: Decoder): AuthKey {
|
|
val surrogate = AuthKeySurrogate.serializer().deserialize(decoder)
|
|
when {
|
|
surrogate.authCreds != null -> return surrogate.authCreds
|
|
surrogate.token != null -> return surrogate.token
|
|
surrogate.refreshToken != null -> return surrogate.refreshToken
|
|
}
|
|
error("Unsupported version of auth key surrogate")
|
|
}
|
|
|
|
override fun serialize(encoder: Encoder, value: AuthKey) {
|
|
AuthKeySurrogate.serializer().serialize(
|
|
encoder,
|
|
AuthKeySurrogate(
|
|
value as? AuthCreds,
|
|
value as? AuthToken,
|
|
value as? RefreshToken
|
|
)
|
|
)
|
|
}
|
|
|
|
}
|
|
|
|
@Serializable
|
|
@SerialName("authcreds")
|
|
data class AuthCreds(
|
|
val username: Username,
|
|
val password: String
|
|
): AuthKey
|
|
|
|
|
|
@Serializable
|
|
@SerialName("token")
|
|
@JvmInline
|
|
value class AuthToken(val string: String = uuid4().toString()): AuthKey {
|
|
override fun toString(): String = string
|
|
}
|
|
|
|
@Serializable
|
|
@SerialName("refresh")
|
|
@JvmInline
|
|
value class RefreshToken(val string: String = uuid4().toString()): AuthKey {
|
|
override fun toString(): String = string
|
|
}
|
|
|
|
@Serializable
|
|
data class AuthTokenInfo(
|
|
val token: AuthToken,
|
|
val refresh: RefreshToken
|
|
)
|