core/features/roles/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/roles/server/UsersRolesStorageReadServerRoutesConfigurator.kt

75 lines
3.1 KiB
Kotlin
Raw Normal View History

2021-11-24 07:52:27 +00:00
package dev.inmo.postssystem.features.roles.server
import dev.inmo.postssystem.features.roles.common.*
import dev.inmo.micro_utils.ktor.server.*
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator
2022-05-07 14:48:17 +00:00
import io.ktor.server.auth.authenticate
import io.ktor.server.routing.*
2021-11-24 07:52:27 +00:00
import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.builtins.serializer
2021-11-27 19:11:04 +00:00
class RolesStorageReadServerRoutesConfigurator<T : Role>(
private val storage: ReadRolesStorage<T>,
private val serializer: KSerializer<T>
2021-11-24 07:52:27 +00:00
) : ApplicationRoutingConfigurator.Element {
private val userRolesSerializer = ListSerializer(serializer)
override fun Route.invoke() {
2021-11-24 14:25:05 +00:00
unifiedRouter.apply {
authenticate {
route(usersRolesRootPathPart) {
2021-11-27 19:11:04 +00:00
get(usersRolesGetSubjectsPathPart) {
val role = decodeUrlQueryValueOrSendError(usersRolesRoleQueryParameterName, serializer)
2021-11-24 07:52:27 +00:00
?: return@get
2021-11-24 14:25:05 +00:00
unianswer(
2021-11-27 19:11:04 +00:00
RoleSubjectsSerializer,
storage.getSubjects(role)
2021-11-24 14:25:05 +00:00
)
}
2021-11-24 07:52:27 +00:00
2021-11-24 14:25:05 +00:00
get(usersRolesGetRolesPathPart) {
2021-11-27 19:11:04 +00:00
val subject = decodeUrlQueryValueOrSendError(
usersRolesRoleSubjectQueryParameterName,
RoleSubject.serializer()
) ?: return@get
2021-11-24 14:25:05 +00:00
unianswer(
userRolesSerializer,
2021-11-27 19:11:04 +00:00
storage.getRoles(subject)
2021-11-24 14:25:05 +00:00
)
}
get(usersRolesContainsPathPart) {
2021-11-27 19:11:04 +00:00
val subject = decodeUrlQueryValueOrSendError(
usersRolesRoleSubjectQueryParameterName,
RoleSubject.serializer()
2021-11-24 14:25:05 +00:00
) ?: return@get
2021-11-27 19:11:04 +00:00
val role = decodeUrlQueryValueOrSendError(
usersRolesRoleQueryParameterName,
2021-11-24 14:25:05 +00:00
serializer
) ?: return@get
unianswer(
Boolean.serializer(),
2021-11-27 19:11:04 +00:00
storage.contains(subject, role)
2021-11-24 14:25:05 +00:00
)
}
2021-11-24 07:52:27 +00:00
2021-11-24 14:25:05 +00:00
get(usersRolesContainsAnyPathPart) {
2021-11-27 19:11:04 +00:00
val subject = decodeUrlQueryValueOrSendError(
usersRolesRoleSubjectQueryParameterName,
RoleSubject.serializer()
2021-11-24 14:25:05 +00:00
) ?: return@get
val userRoles = decodeUrlQueryValueOrSendError(
2021-11-27 19:11:04 +00:00
usersRolesRoleQueryParameterName,
2021-11-24 14:25:05 +00:00
userRolesSerializer
) ?: return@get
unianswer(
Boolean.serializer(),
2021-11-27 19:11:04 +00:00
storage.containsAny(subject, userRoles)
2021-11-24 14:25:05 +00:00
)
}
2021-11-24 07:52:27 +00:00
}
}
}
}
}