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

83 lines
2.7 KiB
Kotlin
Raw Normal View History

2020-09-22 01:47:01 +00:00
package dev.inmo.micro_utils.repos.ktor.server.crud
2020-11-27 08:35:00 +00:00
import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat
import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat
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-09-22 01:47:01 +00:00
import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo
2020-10-14 12:13:40 +00:00
import dev.inmo.micro_utils.repos.ktor.common.crud.*
2020-11-27 08:35:00 +00:00
import io.ktor.http.ContentType
import io.ktor.server.application.call
import io.ktor.server.routing.Route
import io.ktor.server.routing.get
2020-09-22 01:47:01 +00:00
import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.serializer
fun <ObjectType, IdType> Route.configureReadStandardCrudRepoRoutes(
originalRepo: ReadStandardCRUDRepo<ObjectType, IdType>,
objectsSerializer: KSerializer<ObjectType>,
objectsNullableSerializer: KSerializer<ObjectType?>,
2020-11-27 08:35:00 +00:00
idsSerializer: KSerializer<IdType>,
unifiedRouter: UnifiedRouter
2020-09-22 01:47:01 +00:00
) {
val paginationResultSerializer = PaginationResult.serializer(objectsSerializer)
get(getByPaginationRouting) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
val pagination = call.request.queryParameters.extractPagination
2020-09-22 01:47:01 +00:00
2020-11-27 08:35:00 +00:00
unianswer(
paginationResultSerializer,
originalRepo.getByPagination(pagination)
)
}
2020-09-22 01:47:01 +00:00
}
get(getByIdRouting) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
val id = decodeUrlQueryValueOrSendError(
"id",
idsSerializer
) ?: return@get
unianswer(
objectsNullableSerializer,
originalRepo.getById(id)
)
}
2020-09-22 01:47:01 +00:00
}
get(containsRouting) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
val id = decodeUrlQueryValueOrSendError(
"id",
idsSerializer
) ?: return@get
unianswer(
Boolean.serializer(),
originalRepo.contains(id)
)
}
2020-09-22 01:47:01 +00:00
}
2020-10-14 12:13:40 +00:00
get(countRouting) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
unianswer(
Long.serializer(),
originalRepo.count()
)
}
2020-10-14 12:13:40 +00:00
}
2020-09-22 01:47:01 +00:00
}
2020-11-27 08:35:00 +00:00
inline fun <ObjectType, IdType> Route.configureReadStandardCrudRepoRoutes(
originalRepo: ReadStandardCRUDRepo<ObjectType, IdType>,
objectsSerializer: KSerializer<ObjectType>,
objectsNullableSerializer: KSerializer<ObjectType?>,
idsSerializer: KSerializer<IdType>,
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat,
serialFormatContentType: ContentType = standardKtorSerialFormatContentType
) = configureReadStandardCrudRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, idsSerializer, UnifiedRouter(serialFormat, serialFormatContentType))