From 8104678a990aba69b59a8c6328bd5c3b376244f6 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 14 Aug 2020 18:30:09 +0600 Subject: [PATCH] add server utils --- .../ReadContentRepoRoutingConfigurator.kt | 32 ++++------ .../WriteContentRepoRoutingConfigurator.kt | 31 +++------- .../post/ReadPostsRepoRoutingConfigurator.kt | 62 +++++++------------ .../post/WritePostsRepoRoutingConfigurator.kt | 43 +++++-------- .../ktor/server/ServerRoutingShortcuts.kt | 36 +++++++++++ 5 files changed, 93 insertions(+), 111 deletions(-) create mode 100644 ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/ktor/server/ServerRoutingShortcuts.kt diff --git a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/ReadContentRepoRoutingConfigurator.kt b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/ReadContentRepoRoutingConfigurator.kt index 01e5b467..96e17313 100644 --- a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/ReadContentRepoRoutingConfigurator.kt +++ b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/ReadContentRepoRoutingConfigurator.kt @@ -4,9 +4,8 @@ import com.insanusmokrassar.postssystem.core.content.ContentId import com.insanusmokrassar.postssystem.core.content.RegisteredContent import com.insanusmokrassar.postssystem.core.content.api.ReadContentRepo import com.insanusmokrassar.postssystem.core.ktor.* +import com.insanusmokrassar.postssystem.ktor.server.* import com.insanusmokrassar.postssystem.ktor.server.configurators.ApplicationRoutingConfigurator -import com.insanusmokrassar.postssystem.ktor.server.extractPagination -import com.insanusmokrassar.postssystem.ktor.server.standardKtorSerialFormatContentType import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat import io.ktor.application.call import io.ktor.http.HttpStatusCode @@ -19,30 +18,25 @@ fun Route.configureReadContentRepoRoutes( proxyTo: ReadContentRepo ) { get(getContentsIdsRoute) { - call.respondBytes( - standardKtorSerialFormat.dump(contentIdsSerializer, proxyTo.getContentsIds()), - standardKtorSerialFormatContentType + call.unianswer( + contentIdsSerializer, + proxyTo.getContentsIds() ) } get("$getContentByIdRoute/{id}") { - val id: ContentId = call.parameters["id"].also { - if (it == null) call.respond(HttpStatusCode.BadRequest, "Request must contains id in route") - } ?: return@get - call.respondBytes( - standardKtorSerialFormat.dump( - RegisteredContent.serializer().nullable, - proxyTo.getContentById(id) - ), - standardKtorSerialFormatContentType + val id: ContentId = call.getParameterOrSendError("id") ?: return@get + + call.unianswer( + RegisteredContent.serializer().nullable, + proxyTo.getContentById(id) ) } get(getContentByPaginationRoute) { val pagination = call.request.queryParameters.extractPagination - call.respondBytes( - standardKtorSerialFormat.dump( - registeredContentPaginationResultSerializer, - proxyTo.getContentByPagination(pagination) - ) + + call.unianswer( + registeredContentPaginationResultSerializer, + proxyTo.getContentByPagination(pagination) ) } } diff --git a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/WriteContentRepoRoutingConfigurator.kt b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/WriteContentRepoRoutingConfigurator.kt index 1fa2eb22..10db47f8 100644 --- a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/WriteContentRepoRoutingConfigurator.kt +++ b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/content/WriteContentRepoRoutingConfigurator.kt @@ -3,9 +3,8 @@ package com.insanusmokrassar.postssystem.core.ktor.server.content import com.insanusmokrassar.postssystem.core.content.* import com.insanusmokrassar.postssystem.core.content.api.WriteContentRepo import com.insanusmokrassar.postssystem.core.ktor.* +import com.insanusmokrassar.postssystem.ktor.server.* import com.insanusmokrassar.postssystem.ktor.server.configurators.ApplicationRoutingConfigurator -import com.insanusmokrassar.postssystem.ktor.server.includeWebsocketHandling -import com.insanusmokrassar.postssystem.ktor.server.standardKtorSerialFormatContentType import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat import io.ktor.application.call import io.ktor.response.respondBytes @@ -25,31 +24,19 @@ fun Route.configureWriteContentRepoRoutes( standardKtorSerialFormat.dump(RegisteredContent.serializer(), it) } post(registerContentRoute) { - val content = standardKtorSerialFormat.load( - Content.serializer(), - call.request.receiveChannel().toByteArray() - ) + val content = call.uniload(Content.serializer()) val registered = proxyTo.registerContent(content) - call.respondBytes( - standardKtorSerialFormat.dump( - RegisteredContent.serializer().nullable, - registered - ), - standardKtorSerialFormatContentType + call.unianswer( + RegisteredContent.serializer().nullable, + registered ) } post(deleteContentRoute) { - val contentId = standardKtorSerialFormat.load( - ContentId.serializer(), - call.request.receiveChannel().toByteArray() - ) + val contentId = call.uniload(ContentId.serializer()) val isDeleted = proxyTo.deleteContent(contentId) - call.respondBytes( - standardKtorSerialFormat.dump( - Boolean.serializer(), - isDeleted - ), - standardKtorSerialFormatContentType + call.unianswer( + Boolean.serializer(), + isDeleted ) } } diff --git a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/ReadPostsRepoRoutingConfigurator.kt b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/ReadPostsRepoRoutingConfigurator.kt index 8a382995..f1c68bce 100644 --- a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/ReadPostsRepoRoutingConfigurator.kt +++ b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/ReadPostsRepoRoutingConfigurator.kt @@ -22,64 +22,44 @@ fun Route.configureReadPostsRepoRoutes( proxyTo: ReadPostsRepo ) { get(getPostsIdsRoute) { - call.respondBytes( - standardKtorSerialFormat.dump(postIdsSerializer, proxyTo.getPostsIds()), - standardKtorSerialFormatContentType + call.unianswer( + postIdsSerializer, + proxyTo.getPostsIds() ) } get("$getPostByIdRoute/{id}") { - val id: PostId = call.parameters["id"].also { - if (it == null) { - call.respond(HttpStatusCode.BadRequest, "request must contains id") - } - } ?: return@get - call.respondBytes( - standardKtorSerialFormat.dump( - RegisteredPost.serializer().nullable, - proxyTo.getPostById(id) - ), - standardKtorSerialFormatContentType + val id: PostId = call.getParameterOrSendError("id") ?: return@get + call.unianswer( + RegisteredPost.serializer().nullable, + proxyTo.getPostById(id) ) } get("$getPostsByContentRoute/{id}") { - val id: ContentId = call.parameters["id"].also { - if (it == null) { - call.respond(HttpStatusCode.BadRequest, "request must contains id") - } - } ?: return@get - call.respondBytes( - standardKtorSerialFormat.dump( - registeredPostsListSerializer, - proxyTo.getPostsByContent(id) - ), - standardKtorSerialFormatContentType + 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.respondBytes( - standardKtorSerialFormat.dump( - registeredPostsPaginationResultSerializer, - proxyTo.getPostsByCreatingDates( - fromToDateTime.first ?: MIN_DATE, - fromToDateTime.second ?: MAX_DATE, - pagination - ) - ), - standardKtorSerialFormatContentType + call.unianswer( + registeredPostsPaginationResultSerializer, + proxyTo.getPostsByCreatingDates( + fromToDateTime.first ?: MIN_DATE, + fromToDateTime.second ?: MAX_DATE, + pagination + ) ) } get(getPostsByPaginationRoute) { val pagination = call.request.queryParameters.extractPagination - call.respondBytes( - standardKtorSerialFormat.dump( - registeredPostsPaginationResultSerializer, - proxyTo.getPostsByPagination(pagination) - ), - standardKtorSerialFormatContentType + call.unianswer( + registeredPostsPaginationResultSerializer, + proxyTo.getPostsByPagination(pagination) ) } } diff --git a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/WritePostsRepoRoutingConfigurator.kt b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/WritePostsRepoRoutingConfigurator.kt index b4617082..bcfee761 100644 --- a/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/WritePostsRepoRoutingConfigurator.kt +++ b/core/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/core/ktor/server/post/WritePostsRepoRoutingConfigurator.kt @@ -3,8 +3,8 @@ package com.insanusmokrassar.postssystem.core.ktor.server.post import com.insanusmokrassar.postssystem.core.ktor.* import com.insanusmokrassar.postssystem.core.post.* import com.insanusmokrassar.postssystem.core.post.repo.WritePostsRepo +import com.insanusmokrassar.postssystem.ktor.server.* import com.insanusmokrassar.postssystem.ktor.server.configurators.ApplicationRoutingConfigurator -import com.insanusmokrassar.postssystem.ktor.server.includeWebsocketHandling import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat import io.ktor.application.call import io.ktor.response.respondBytes @@ -27,43 +27,29 @@ fun Route.configureWritePostsRepoRoutes( } post(createPostRoute) { - val post = standardKtorSerialFormat.load( - Post.serializer(), - call.request.receiveChannel().toByteArray() - ) - - call.respondBytes( - standardKtorSerialFormat.dump( - RegisteredPost.serializer().nullable, - proxyTo.createPost(post) + call.unianswer( + RegisteredPost.serializer().nullable, + proxyTo.createPost( + call.uniload(Post.serializer()) ) ) } post(deletePostRoute) { - val postId = standardKtorSerialFormat.load( - PostId.serializer(), - call.request.receiveChannel().toByteArray() - ) - - call.respondBytes( - standardKtorSerialFormat.dump( - Boolean.serializer(), - proxyTo.deletePost(postId) - ) + call.unianswer( + Boolean.serializer(), + proxyTo.deletePost(call.uniload(PostId.serializer())) ) } post(updatePostContentRoute) { - val updatePostObject = standardKtorSerialFormat.load( - UpdatePostObject.serializer(), - call.request.receiveChannel().toByteArray() - ) + val updatePostObject = call.uniload(UpdatePostObject.serializer()) - call.respondBytes( - standardKtorSerialFormat.dump( - Boolean.serializer(), - proxyTo.updatePostContent(updatePostObject.postId, updatePostObject.post) + call.unianswer( + Boolean.serializer(), + proxyTo.updatePostContent( + updatePostObject.postId, + updatePostObject.post ) ) } @@ -75,5 +61,4 @@ class WritePostsRepoRoutingConfigurator( override fun Route.invoke() { configureWritePostsRepoRoutes(proxyTo) } - } diff --git a/ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/ktor/server/ServerRoutingShortcuts.kt b/ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/ktor/server/ServerRoutingShortcuts.kt new file mode 100644 index 00000000..035287ed --- /dev/null +++ b/ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/ktor/server/ServerRoutingShortcuts.kt @@ -0,0 +1,36 @@ +package com.insanusmokrassar.postssystem.ktor.server + +import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat +import io.ktor.application.ApplicationCall +import io.ktor.application.call +import io.ktor.http.HttpStatusCode +import io.ktor.response.respond +import io.ktor.response.respondBytes +import io.ktor.util.toByteArray +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.SerializationStrategy + +suspend fun ApplicationCall.unianswer( + answerSerializer: SerializationStrategy, + answer: T +) { + respondBytes( + standardKtorSerialFormat.dump(answerSerializer, answer), + standardKtorSerialFormatContentType + ) +} + +suspend fun ApplicationCall.uniload( + deserializer: DeserializationStrategy +) = standardKtorSerialFormat.load( + deserializer, + request.receiveChannel().toByteArray() +) + +suspend fun ApplicationCall.getParameterOrSendError( + field: String +) = parameters[field].also { + if (it == null) { + respond(HttpStatusCode.BadRequest, "request must contains $field") + } +}