core/features/roles/client/src/commonMain/kotlin/dev/inmo/postssystem/features/roles/client/ReadClientUsersRolesStorage.kt

71 lines
2.4 KiB
Kotlin

package dev.inmo.postssystem.features.roles.client
import dev.inmo.postssystem.features.roles.common.*
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.get
import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.builtins.serializer
class ReadClientRolesStorage<T : Role>(
private val baseUrl: String,
private val client: HttpClient,
private val serializer: KSerializer<T>
) : ReadRolesStorage<T> {
private val userRolesSerializer = ListSerializer(serializer)
private val userRolesFullUrl = buildStandardUrl(
baseUrl,
usersRolesRootPathPart
)
override suspend fun getSubjects(
role: T
): List<RoleSubject> = client.get(
buildStandardUrl(
userRolesFullUrl,
usersRolesGetSubjectsPathPart,
usersRolesRoleQueryParameterName to unifiedRequester.encodeUrlQueryValue(serializer, role)
)
).body()
override suspend fun getRoles(
subject: RoleSubject
): List<T> = unifiedRequester.uniget(
buildStandardUrl(
userRolesFullUrl,
usersRolesGetRolesPathPart,
usersRolesRoleSubjectQueryParameterName to unifiedRequester.encodeUrlQueryValue(RoleSubject.serializer(), subject)
),
userRolesSerializer
)
override suspend fun contains(
subject: RoleSubject,
role: T
): Boolean = unifiedRequester.uniget(
buildStandardUrl(
userRolesFullUrl,
usersRolesContainsPathPart,
usersRolesRoleSubjectQueryParameterName to unifiedRequester.encodeUrlQueryValue(RoleSubject.serializer(), subject),
usersRolesRoleQueryParameterName to unifiedRequester.encodeUrlQueryValue(serializer, role)
),
Boolean.serializer()
)
override suspend fun containsAny(
subject: RoleSubject,
roles: List<T>
): Boolean = unifiedRequester.uniget(
buildStandardUrl(
userRolesFullUrl,
usersRolesContainsAnyPathPart,
usersRolesRoleSubjectQueryParameterName to unifiedRequester.encodeUrlQueryValue(RoleSubject.serializer(), subject),
usersRolesRoleQueryParameterName to unifiedRequester.encodeUrlQueryValue(userRolesSerializer, roles)
),
Boolean.serializer()
)
}