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>,
|
2021-11-24 14:25:05 +00:00
|
|
|
private val serializer: KSerializer<T>,
|
|
|
|
private val unifiedRouter: UnifiedRouter
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|