package dev.inmo.postssystem.core.ktor.server.post import dev.inmo.postssystem.core.MAX_DATE import dev.inmo.postssystem.core.MIN_DATE import dev.inmo.postssystem.core.content.ContentId import dev.inmo.postssystem.core.ktor.* import dev.inmo.postssystem.core.post.PostId import dev.inmo.postssystem.core.post.RegisteredPost import dev.inmo.postssystem.core.post.repo.ReadPostsRepo import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator import dev.inmo.micro_utils.pagination.extractPagination import io.ktor.application.call import io.ktor.routing.Route import io.ktor.routing.get import kotlinx.serialization.builtins.nullable fun Route.configureReadPostsRepoRoutes( proxyTo: ReadPostsRepo ) { get(getPostsIdsRoute) { call.unianswer( postIdsSerializer, proxyTo.getPostsIds() ) } get("$getPostByIdRoute/{id}") { val id: PostId = call.getParameterOrSendError("id") ?: return@get call.unianswer( RegisteredPost.serializer().nullable, proxyTo.getPostById(id) ) } get("$getPostsByContentRoute/{id}") { val id: ContentId = call.getParameterOrSendError("id") ?: return@get call.unianswer( registeredPostsListSerializer, proxyTo.getPostsByContent(id) ) } get(getPostsByCreatingDatesRoute) { val fromToDateTime = call.request.queryParameters.extractFromToDateTime val pagination = call.request.queryParameters.extractPagination call.unianswer( registeredPostsPaginationResultSerializer, proxyTo.getPostsByCreatingDates( fromToDateTime.first ?: MIN_DATE, fromToDateTime.second ?: MAX_DATE, pagination ) ) } get(getPostsByPaginationRoute) { val pagination = call.request.queryParameters.extractPagination call.unianswer( registeredPostsPaginationResultSerializer, proxyTo.getPostsByPagination(pagination) ) } } class ReadPostsRepoRoutingConfigurator( private val proxyTo: ReadPostsRepo ) : ApplicationRoutingConfigurator.Element { override fun Route.invoke() { configureReadPostsRepoRoutes(proxyTo) } }