2020-09-22 01:47:01 +00:00
|
|
|
package dev.inmo.micro_utils.repos.ktor.server.one_to_many
|
|
|
|
|
2020-11-02 15:34:49 +00:00
|
|
|
import dev.inmo.micro_utils.ktor.server.*
|
2020-09-22 01:47:01 +00:00
|
|
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
2020-09-22 02:20:22 +00:00
|
|
|
import dev.inmo.micro_utils.pagination.extractPagination
|
2020-10-14 16:02:10 +00:00
|
|
|
import dev.inmo.micro_utils.repos.ReadOneToManyKeyValueRepo
|
2020-11-14 11:27:26 +00:00
|
|
|
import dev.inmo.micro_utils.repos.ktor.common.*
|
|
|
|
import dev.inmo.micro_utils.repos.ktor.common.keyParameterName
|
2020-09-22 01:47:01 +00:00
|
|
|
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
|
2020-11-14 11:27:26 +00:00
|
|
|
import dev.inmo.micro_utils.repos.ktor.common.valueParameterName
|
|
|
|
import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName
|
2020-09-22 01:47:01 +00:00
|
|
|
import io.ktor.application.call
|
|
|
|
import io.ktor.routing.Route
|
|
|
|
import io.ktor.routing.get
|
|
|
|
import kotlinx.serialization.KSerializer
|
|
|
|
import kotlinx.serialization.builtins.serializer
|
|
|
|
|
|
|
|
fun <Key, Value> Route.configureOneToManyReadKeyValueRepoRoutes(
|
2020-10-14 16:02:10 +00:00
|
|
|
originalRepo: ReadOneToManyKeyValueRepo<Key, Value>,
|
2020-09-22 01:47:01 +00:00
|
|
|
keySerializer: KSerializer<Key>,
|
|
|
|
valueSealizer: KSerializer<Value>,
|
|
|
|
) {
|
|
|
|
val paginationKeyResult = PaginationResult.serializer(keySerializer)
|
|
|
|
val paginationValueResult = PaginationResult.serializer(valueSealizer)
|
|
|
|
|
|
|
|
get(getRoute) {
|
|
|
|
val pagination = call.request.queryParameters.extractPagination
|
|
|
|
val key = call.decodeUrlQueryValueOrSendError(
|
|
|
|
keyParameterName,
|
|
|
|
keySerializer
|
|
|
|
) ?: return@get
|
|
|
|
val reversed = call.decodeUrlQueryValue(
|
|
|
|
reversedParameterName,
|
|
|
|
Boolean.serializer()
|
|
|
|
) ?: false
|
|
|
|
|
|
|
|
call.unianswer(
|
|
|
|
paginationValueResult,
|
|
|
|
originalRepo.get(key, pagination, reversed)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
get(keysRoute) {
|
|
|
|
val pagination = call.request.queryParameters.extractPagination
|
|
|
|
val reversed = call.decodeUrlQueryValue(
|
|
|
|
reversedParameterName,
|
|
|
|
Boolean.serializer()
|
|
|
|
) ?: false
|
2020-11-14 10:44:28 +00:00
|
|
|
val value: Value? = call.decodeUrlQueryValue(
|
|
|
|
valueParameterName,
|
|
|
|
valueSealizer
|
|
|
|
)
|
2020-09-22 01:47:01 +00:00
|
|
|
|
2020-11-14 11:27:26 +00:00
|
|
|
call.unianswer(
|
2020-09-22 01:47:01 +00:00
|
|
|
paginationKeyResult,
|
2020-11-14 11:27:26 +00:00
|
|
|
value ?.let { originalRepo.keys(value, pagination, reversed) } ?: originalRepo.keys(pagination, reversed)
|
2020-09-22 01:47:01 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
get(containsByKeyRoute) {
|
|
|
|
val key = call.decodeUrlQueryValueOrSendError(
|
|
|
|
keyParameterName,
|
|
|
|
keySerializer
|
|
|
|
) ?: return@get
|
|
|
|
|
|
|
|
call.unianswer(
|
|
|
|
Boolean.serializer(),
|
|
|
|
originalRepo.contains(key)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
get(containsByKeyValueRoute) {
|
|
|
|
val key = call.decodeUrlQueryValueOrSendError(
|
|
|
|
keyParameterName,
|
|
|
|
keySerializer
|
|
|
|
) ?: return@get
|
|
|
|
val value = call.decodeUrlQueryValueOrSendError(
|
|
|
|
valueParameterName,
|
|
|
|
valueSealizer
|
|
|
|
) ?: return@get
|
|
|
|
|
|
|
|
call.unianswer(
|
|
|
|
Boolean.serializer(),
|
|
|
|
originalRepo.contains(key, value)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
get(countByKeyRoute) {
|
|
|
|
val key = call.decodeUrlQueryValueOrSendError(
|
|
|
|
keyParameterName,
|
|
|
|
keySerializer
|
|
|
|
) ?: return@get
|
|
|
|
|
|
|
|
call.unianswer(
|
|
|
|
Long.serializer(),
|
|
|
|
originalRepo.count(key)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
get(countRoute) {
|
|
|
|
call.unianswer(
|
|
|
|
Long.serializer(),
|
|
|
|
originalRepo.count()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|