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
|
2022-06-04 09:15:17 +00:00
|
|
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
2022-06-03 18:22:36 +00:00
|
|
|
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.*
|
2022-06-03 16:33:26 +00:00
|
|
|
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.*
|
|
|
|
|
2022-06-04 09:15:17 +00:00
|
|
|
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(
|
2022-06-03 16:33:26 +00:00
|
|
|
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(
|
2022-06-03 16:33:26 +00:00
|
|
|
call.getQueryParameterOrSendError(idParameterName) ?: return@get
|
2022-06-03 06:22:51 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
call.respond(
|
|
|
|
originalRepo.contains(id)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
get(countRouting) {
|
|
|
|
call.respond(
|
|
|
|
originalRepo.count()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-04 09:15:17 +00:00
|
|
|
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
|
2022-06-04 09:15:17 +00:00
|
|
|
) = configureReadCRUDRepoRoutes(originalRepo) {
|
2022-06-03 06:22:51 +00:00
|
|
|
serialFormat.decodeFromString(idsSerializer, it)
|
|
|
|
}
|
|
|
|
|
2022-06-04 09:15:17 +00:00
|
|
|
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
|
2022-06-04 09:15:17 +00:00
|
|
|
) = configureReadCRUDRepoRoutes(originalRepo) {
|
2022-06-03 06:22:51 +00:00
|
|
|
serialFormat.decodeHex(idsSerializer, it)
|
|
|
|
}
|