MicroUtils/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadCRUDRepoRoutes.kt

78 lines
2.4 KiB
Kotlin
Raw Normal View History

2022-06-03 06:22:51 +00:00
package dev.inmo.micro_utils.repos.ktor.server.crud
import dev.inmo.micro_utils.ktor.common.decodeHex
import dev.inmo.micro_utils.ktor.server.*
import dev.inmo.micro_utils.pagination.extractPagination
import dev.inmo.micro_utils.repos.ReadCRUDRepo
import dev.inmo.micro_utils.repos.ktor.common.countRouting
2022-06-03 06:22:51 +00:00
import dev.inmo.micro_utils.repos.ktor.common.crud.*
import dev.inmo.micro_utils.repos.ktor.common.idParameterName
2022-06-03 06:22:51 +00:00
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.response.respond
import io.ktor.server.routing.Route
import io.ktor.server.routing.get
import kotlinx.serialization.*
inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoutes(
originalRepo: ReadCRUDRepo<ObjectType, IdType>,
2022-06-03 06:22:51 +00:00
noinline idDeserializer: suspend (String) -> IdType
) {
get(getByPaginationRouting) {
val pagination = call.request.queryParameters.extractPagination
call.respond(originalRepo.getByPagination(pagination))
}
2022-12-02 07:46:06 +00:00
get(getIdsByPaginationRouting) {
val pagination = call.request.queryParameters.extractPagination
call.respond(originalRepo.getIdsByPagination(pagination))
}
2022-06-03 06:22:51 +00:00
get(getByIdRouting) {
val id = idDeserializer(
call.getQueryParameterOrSendError(idParameterName) ?: return@get
2022-06-03 06:22:51 +00:00
)
val result = originalRepo.getById(id)
if (result == null) {
call.respond(HttpStatusCode.NoContent)
} else {
call.respond(result)
}
}
get(containsRouting) {
val id = idDeserializer(
call.getQueryParameterOrSendError(idParameterName) ?: return@get
2022-06-03 06:22:51 +00:00
)
call.respond(
originalRepo.contains(id)
)
}
get(countRouting) {
call.respond(
originalRepo.count()
)
}
}
inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoutes(
originalRepo: ReadCRUDRepo<ObjectType, IdType>,
2022-06-03 06:22:51 +00:00
idsSerializer: KSerializer<IdType>,
serialFormat: StringFormat
) = configureReadCRUDRepoRoutes(originalRepo) {
2022-06-03 06:22:51 +00:00
serialFormat.decodeFromString(idsSerializer, it)
}
inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoutes(
originalRepo: ReadCRUDRepo<ObjectType, IdType>,
2022-06-03 06:22:51 +00:00
idsSerializer: KSerializer<IdType>,
serialFormat: BinaryFormat
) = configureReadCRUDRepoRoutes(originalRepo) {
2022-06-03 06:22:51 +00:00
serialFormat.decodeHex(idsSerializer, it)
}