From ab11e28bf7aa0a5a9daf740101c4145ded2d56b6 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 27 Nov 2020 14:35:00 +0600 Subject: [PATCH] UnifiedRouter --- CHANGELOG.md | 4 + .../ktor/client/FlowsWebsockets.kt | 3 +- .../ktor/client/StandardHttpClientGetPost.kt | 2 +- .../micro_utils/ktor/server/FlowsWebsocket.kt | 5 +- .../ktor/server/ServerRoutingShortcuts.kt | 79 +++++++++- .../client/crud/KtorReadStandardCrudRepo.kt | 6 +- .../ktor/client/crud/KtorStandardCrudRepo.kt | 4 +- .../client/crud/KtorWriteStandardCrudRepo.kt | 6 +- .../key_value/KtorReadStandardKeyValueRepo.kt | 5 +- .../key_value/KtorStandartKeyValueRepo.kt | 3 +- .../KtorWriteStandardKeyValueRepo.kt | 6 +- .../one_to_many/KtorOneToManyKeyValueRepo.kt | 4 +- .../KtorReadOneToManyKeyValueRepo.kt | 6 +- .../KtorWriteOneToManyKeyValueRepo.kt | 6 +- .../server/crud/KtorReadStandardCrudRepo.kt | 76 +++++---- .../ktor/server/crud/KtorStandardCrudRepo.kt | 25 ++- .../server/crud/KtorWriteStandardCrudRepo.kt | 104 ++++++++----- .../key_value/KtorStandartKeyValueRepo.kt | 24 ++- .../key_value/KtorStandartReadKeyValueRepo.kt | 105 ++++++++----- .../KtorStandartWriteKeyValueRepo.kt | 77 +++++---- .../ConfigureOneToManyKeyValueRepoRoutes.kt | 25 ++- ...onfigureOneToManyReadKeyValueRepoRoutes.kt | 146 ++++++++++-------- ...nfigureOneToManyWriteKeyValueRepoRoutes.kt | 96 +++++++----- 23 files changed, 536 insertions(+), 281 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1dcd63392b..9deaf346932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,14 @@ * `Ktor` * `Client` * New class `UnifiedRequester` + * `Server` + * New class `UnifiedRouter` * `Repos` * `Ktor` * `Client` * Rewriting of all clients on new `UnifiedRequester` + * `Server` + * Rewriting of all clients on new `UnifiedRouter` ## 0.4.6 diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt index e011d755a85..0a8243f1598 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt @@ -8,7 +8,6 @@ import io.ktor.http.cio.websocket.Frame import io.ktor.http.cio.websocket.readBytes import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.DeserializationStrategy /** @@ -66,7 +65,7 @@ inline fun HttpClient.createStandardWebsocketFlow( url: String, crossinline checkReconnection: (Throwable?) -> Boolean = { true }, deserializer: DeserializationStrategy, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) = createStandardWebsocketFlow( url, checkReconnection diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt index b410dc3e664..a87e5ee9cf4 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt @@ -10,7 +10,7 @@ typealias BodyPair = Pair, T> class UnifiedRequester( private val client: HttpClient = HttpClient(), - private val serialFormat: BinaryFormat = standardKtorSerialFormat + private val serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) { suspend fun uniget( url: String, diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt index 7e951faf186..fea1e291c2e 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt @@ -33,10 +33,11 @@ fun Route.includeWebsocketHandling( fun Route.includeWebsocketHandling( suburl: String, flow: Flow, - serializer: SerializationStrategy + serializer: SerializationStrategy, + serialFormat: StandardKtorSerialFormat ) = includeWebsocketHandling( suburl, flow ) { - standardKtorSerialFormat.encodeDefault(serializer, it) + serialFormat.encodeDefault(serializer, it) } diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt index 30fc729ccf4..b020d634803 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt @@ -3,12 +3,87 @@ package dev.inmo.micro_utils.ktor.server import dev.inmo.micro_utils.coroutines.safely import dev.inmo.micro_utils.ktor.common.* import io.ktor.application.ApplicationCall +import io.ktor.application.call +import io.ktor.http.ContentType import io.ktor.http.HttpStatusCode import io.ktor.request.receive import io.ktor.response.respond import io.ktor.response.respondBytes -import kotlinx.serialization.DeserializationStrategy -import kotlinx.serialization.SerializationStrategy +import io.ktor.routing.Route +import io.ktor.util.pipeline.PipelineContext +import kotlinx.coroutines.flow.Flow +import kotlinx.serialization.* + +class UnifiedRouter( + private val serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + private val serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) { + fun Route.includeWebsocketHandling( + suburl: String, + flow: Flow, + serializer: SerializationStrategy + ) = includeWebsocketHandling(suburl, flow, serializer, serialFormat) + + suspend fun PipelineContext<*, ApplicationCall>.unianswer( + answerSerializer: SerializationStrategy, + answer: T + ) { + call.respondBytes ( + serialFormat.encodeDefault(answerSerializer, answer), + serialFormatContentType + ) + } + + suspend fun PipelineContext<*, ApplicationCall>.uniload( + deserializer: DeserializationStrategy + ) = safely { + serialFormat.decodeDefault( + deserializer, + call.receive() + ) + } + + suspend fun PipelineContext<*, ApplicationCall>.getParameterOrSendError( + field: String + ) = call.parameters[field].also { + if (it == null) { + call.respond(HttpStatusCode.BadRequest, "Request must contains $field") + } + } + + fun PipelineContext<*, ApplicationCall>.getQueryParameter( + field: String + ) = call.request.queryParameters[field] + + suspend fun PipelineContext<*, ApplicationCall>.getQueryParameterOrSendError( + field: String + ) = getQueryParameter(field).also { + if (it == null) { + call.respond(HttpStatusCode.BadRequest, "Request query parameters must contains $field") + } + } + + fun PipelineContext<*, ApplicationCall>.decodeUrlQueryValue( + field: String, + deserializer: DeserializationStrategy + ) = getQueryParameter(field) ?.let { + serialFormat.decodeHex( + deserializer, + it + ) + } + + suspend fun PipelineContext<*, ApplicationCall>.decodeUrlQueryValueOrSendError( + field: String, + deserializer: DeserializationStrategy + ) = decodeUrlQueryValue(field, deserializer).also { + if (it == null) { + call.respond(HttpStatusCode.BadRequest, "Request query parameters must contains $field") + } + } +} + +val defaultUnifiedRouter = UnifiedRouter() suspend fun ApplicationCall.unianswer( answerSerializer: SerializationStrategy, diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepo.kt index dacc0b8ec64..470249b0039 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepo.kt @@ -1,13 +1,11 @@ package dev.inmo.micro_utils.repos.ktor.client.crud import dev.inmo.micro_utils.ktor.client.* -import dev.inmo.micro_utils.ktor.common.buildStandardUrl -import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo import dev.inmo.micro_utils.repos.ktor.common.crud.* import io.ktor.client.HttpClient -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.serializer @@ -26,7 +24,7 @@ class KtorReadStandardCrudRepo ( objectsSerializer: KSerializer, objectsSerializerNullable: KSerializer, idsSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this ( baseUrl, UnifiedRequester(client, serialFormat), objectsSerializer, objectsSerializerNullable, idsSerializer ) diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepo.kt index 801affd5b99..19561cd92eb 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepo.kt @@ -1,10 +1,10 @@ package dev.inmo.micro_utils.repos.ktor.client.crud import dev.inmo.micro_utils.ktor.client.UnifiedRequester +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.repos.* import io.ktor.client.HttpClient -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.KSerializer class KtorStandardCrudRepo ( @@ -39,7 +39,7 @@ class KtorStandardCrudRepo ( objectsNullableSerializer: KSerializer, inputsSerializer: KSerializer, idsSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this( baseUrl, baseSubpart, UnifiedRequester(client, serialFormat), objectsSerializer, objectsNullableSerializer, inputsSerializer, idsSerializer ) diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepo.kt index c6d270fa178..71bc3823d92 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepo.kt @@ -1,14 +1,12 @@ package dev.inmo.micro_utils.repos.ktor.client.crud import dev.inmo.micro_utils.ktor.client.* -import dev.inmo.micro_utils.ktor.common.buildStandardUrl -import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.repos.UpdatedValuePair import dev.inmo.micro_utils.repos.WriteStandardCRUDRepo import dev.inmo.micro_utils.repos.ktor.common.crud.* import io.ktor.client.HttpClient import kotlinx.coroutines.flow.Flow -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.* @@ -36,7 +34,7 @@ class KtorWriteStandardCrudRepo ( objectsSerializerNullable: KSerializer, inputsSerializer: KSerializer, idsSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this ( baseUrl, UnifiedRequester(client, serialFormat), objectsSerializer, objectsSerializerNullable, inputsSerializer, idsSerializer ) diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt index 7f2ea16eff6..55bdf8f0ad8 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt @@ -1,8 +1,7 @@ package dev.inmo.micro_utils.repos.ktor.client.key_value import dev.inmo.micro_utils.ktor.client.* -import dev.inmo.micro_utils.ktor.common.buildStandardUrl -import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.repos.ReadStandardKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.key_value.* @@ -24,7 +23,7 @@ class KtorReadStandardKeyValueRepo ( keySerializer: KSerializer, valueSerializer: KSerializer, valueNullableSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this ( baseUrl, UnifiedRequester(client, serialFormat), keySerializer, valueSerializer, valueNullableSerializer ) diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorStandartKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorStandartKeyValueRepo.kt index 423ceb33aad..c3faa058790 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorStandartKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorStandartKeyValueRepo.kt @@ -1,6 +1,7 @@ package dev.inmo.micro_utils.repos.ktor.client.key_value import dev.inmo.micro_utils.ktor.client.UnifiedRequester +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.repos.* import io.ktor.client.HttpClient @@ -34,6 +35,6 @@ class KtorStandartKeyValueRepo ( keySerializer: KSerializer, valueSerializer: KSerializer, valueNullableSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this(baseUrl, baseSubpart, UnifiedRequester(client, serialFormat), keySerializer, valueSerializer, valueNullableSerializer) } \ No newline at end of file diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt index 85fe734fcfc..4d720ee170a 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt @@ -1,13 +1,11 @@ package dev.inmo.micro_utils.repos.ktor.client.key_value import dev.inmo.micro_utils.ktor.client.* -import dev.inmo.micro_utils.ktor.common.buildStandardUrl -import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.repos.WriteStandardKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.key_value.* import io.ktor.client.HttpClient import kotlinx.coroutines.flow.Flow -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.* @@ -25,7 +23,7 @@ class KtorWriteStandardKeyValueRepo ( client: HttpClient, keySerializer: KSerializer, valueSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this ( baseUrl, UnifiedRequester(client, serialFormat), keySerializer, valueSerializer ) diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorOneToManyKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorOneToManyKeyValueRepo.kt index 4bc426adb6c..d50c23bb7e8 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorOneToManyKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorOneToManyKeyValueRepo.kt @@ -1,10 +1,10 @@ package dev.inmo.micro_utils.repos.ktor.client.one_to_many import dev.inmo.micro_utils.ktor.client.UnifiedRequester +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.repos.* import io.ktor.client.HttpClient -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.KSerializer class KtorOneToManyKeyValueRepo( @@ -32,6 +32,6 @@ class KtorOneToManyKeyValueRepo( client: HttpClient, keySerializer: KSerializer, valueSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this (baseUrl, baseSubpart, UnifiedRequester(client, serialFormat), keySerializer, valueSerializer) } \ No newline at end of file diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt index d9d37f53301..5eb413eda8c 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt @@ -1,8 +1,7 @@ package dev.inmo.micro_utils.repos.ktor.client.one_to_many import dev.inmo.micro_utils.ktor.client.* -import dev.inmo.micro_utils.ktor.common.buildStandardUrl -import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.repos.ReadOneToManyKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.keyParameterName @@ -10,7 +9,6 @@ import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName import dev.inmo.micro_utils.repos.ktor.common.valueParameterName import io.ktor.client.HttpClient -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.serializer @@ -28,7 +26,7 @@ class KtorReadOneToManyKeyValueRepo ( client: HttpClient, keySerializer: KSerializer, valueSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this (baseUrl, UnifiedRequester(client, serialFormat), keySerializer, valueSerializer) override suspend fun get(k: Key, pagination: Pagination, reversed: Boolean): PaginationResult = unifiedRequester.uniget( diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorWriteOneToManyKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorWriteOneToManyKeyValueRepo.kt index b1d1f4b6c0d..5263c53f83c 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorWriteOneToManyKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorWriteOneToManyKeyValueRepo.kt @@ -1,13 +1,11 @@ package dev.inmo.micro_utils.repos.ktor.client.one_to_many import dev.inmo.micro_utils.ktor.client.* -import dev.inmo.micro_utils.ktor.common.buildStandardUrl -import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.repos.WriteOneToManyKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* import io.ktor.client.HttpClient import kotlinx.coroutines.flow.Flow -import kotlinx.serialization.BinaryFormat import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.* @@ -25,7 +23,7 @@ class KtorWriteOneToManyKeyValueRepo ( client: HttpClient, keySerializer: KSerializer, valueSerializer: KSerializer, - serialFormat: BinaryFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) : this ( baseUrl, UnifiedRequester(client, serialFormat), keySerializer, valueSerializer ) diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadStandardCrudRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadStandardCrudRepo.kt index c270f8e47b9..82cba432cd2 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadStandardCrudRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadStandardCrudRepo.kt @@ -1,12 +1,14 @@ package dev.inmo.micro_utils.repos.ktor.server.crud -import dev.inmo.micro_utils.ktor.server.decodeUrlQueryValueOrSendError -import dev.inmo.micro_utils.ktor.server.unianswer +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.pagination.extractPagination import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo import dev.inmo.micro_utils.repos.ktor.common.crud.* import io.ktor.application.call +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.get import kotlinx.serialization.KSerializer @@ -16,47 +18,65 @@ fun Route.configureReadStandardCrudRepoRoutes( originalRepo: ReadStandardCRUDRepo, objectsSerializer: KSerializer, objectsNullableSerializer: KSerializer, - idsSerializer: KSerializer + idsSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { val paginationResultSerializer = PaginationResult.serializer(objectsSerializer) get(getByPaginationRouting) { - val pagination = call.request.queryParameters.extractPagination + unifiedRouter.apply { + val pagination = call.request.queryParameters.extractPagination - call.unianswer( - paginationResultSerializer, - originalRepo.getByPagination(pagination) - ) + unianswer( + paginationResultSerializer, + originalRepo.getByPagination(pagination) + ) + } } get(getByIdRouting) { - val id = call.decodeUrlQueryValueOrSendError( - "id", - idsSerializer - ) ?: return@get + unifiedRouter.apply { + val id = decodeUrlQueryValueOrSendError( + "id", + idsSerializer + ) ?: return@get - call.unianswer( - objectsNullableSerializer, - originalRepo.getById(id) - ) + unianswer( + objectsNullableSerializer, + originalRepo.getById(id) + ) + } } get(containsRouting) { - val id = call.decodeUrlQueryValueOrSendError( - "id", - idsSerializer - ) ?: return@get + unifiedRouter.apply { + val id = decodeUrlQueryValueOrSendError( + "id", + idsSerializer + ) ?: return@get - call.unianswer( - Boolean.serializer(), - originalRepo.contains(id) - ) + unianswer( + Boolean.serializer(), + originalRepo.contains(id) + ) + } } get(countRouting) { - call.unianswer( - Long.serializer(), - originalRepo.count() - ) + unifiedRouter.apply { + unianswer( + Long.serializer(), + originalRepo.count() + ) + } } } + +inline fun Route.configureReadStandardCrudRepoRoutes( + originalRepo: ReadStandardCRUDRepo, + objectsSerializer: KSerializer, + objectsNullableSerializer: KSerializer, + idsSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureReadStandardCrudRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, idsSerializer, UnifiedRouter(serialFormat, serialFormatContentType)) diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorStandardCrudRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorStandardCrudRepo.kt index f619b9da745..08685719ec8 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorStandardCrudRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorStandardCrudRepo.kt @@ -1,6 +1,11 @@ package dev.inmo.micro_utils.repos.ktor.server.crud +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.server.UnifiedRouter +import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType import dev.inmo.micro_utils.repos.StandardCRUDRepo +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.route import kotlinx.serialization.KSerializer @@ -11,10 +16,24 @@ fun Route.configureStandardCrudRepoRoutes( objectsSerializer: KSerializer, objectsNullableSerializer: KSerializer, inputsSerializer: KSerializer, - idsSerializer: KSerializer + idsSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { route(baseSubpart) { - configureReadStandardCrudRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, idsSerializer) - configureWriteStandardCrudRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, inputsSerializer, idsSerializer) + configureReadStandardCrudRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, idsSerializer, unifiedRouter) + configureWriteStandardCrudRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, inputsSerializer, idsSerializer, unifiedRouter) } } + +fun Route.configureStandardCrudRepoRoutes( + baseSubpart: String, + originalRepo: StandardCRUDRepo, + objectsSerializer: KSerializer, + objectsNullableSerializer: KSerializer, + inputsSerializer: KSerializer, + idsSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureStandardCrudRepoRoutes( + baseSubpart, originalRepo, objectsSerializer, objectsNullableSerializer, inputsSerializer, idsSerializer, UnifiedRouter(serialFormat, serialFormatContentType) +) diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorWriteStandardCrudRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorWriteStandardCrudRepo.kt index b1ed324c201..79f04e84945 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorWriteStandardCrudRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorWriteStandardCrudRepo.kt @@ -1,9 +1,12 @@ package dev.inmo.micro_utils.repos.ktor.server.crud +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.repos.WriteStandardCRUDRepo import dev.inmo.micro_utils.repos.ktor.common.crud.* import io.ktor.application.call +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.post import kotlinx.serialization.KSerializer @@ -14,7 +17,8 @@ fun Route.configureWriteStandardCrudRepoRoutes( objectsSerializer: KSerializer, objectsNullableSerializer: KSerializer, inputsSerializer: KSerializer, - idsSerializer: KSerializer + idsSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { val listObjectsSerializer = ListSerializer(objectsSerializer) val listInputSerializer = ListSerializer(inputsSerializer) @@ -25,58 +29,80 @@ fun Route.configureWriteStandardCrudRepoRoutes( ) val listInputUpdateSerializer = ListSerializer(inputUpdateSerializer) - includeWebsocketHandling( - newObjectsFlowRouting, - originalRepo.newObjectsFlow, - objectsSerializer - ) - includeWebsocketHandling( - updatedObjectsFlowRouting, - originalRepo.updatedObjectsFlow, - objectsSerializer - ) - includeWebsocketHandling( - deletedObjectsIdsFlowRouting, - originalRepo.deletedObjectsIdsFlow, - idsSerializer - ) + unifiedRouter.apply { + includeWebsocketHandling( + newObjectsFlowRouting, + originalRepo.newObjectsFlow, + objectsSerializer + ) + includeWebsocketHandling( + updatedObjectsFlowRouting, + originalRepo.updatedObjectsFlow, + objectsSerializer + ) + includeWebsocketHandling( + deletedObjectsIdsFlowRouting, + originalRepo.deletedObjectsIdsFlow, + idsSerializer + ) + } post(createRouting) { - call.unianswer( - listObjectsSerializer, - originalRepo.create( - call.uniload(listInputSerializer) + unifiedRouter.apply { + unianswer( + listObjectsSerializer, + originalRepo.create( + uniload(listInputSerializer) + ) ) - ) + } } post(updateRouting) { - val (id, input) = call.uniload(inputUpdateSerializer) - call.unianswer( - objectsNullableSerializer, - originalRepo.update( - id, input + unifiedRouter.apply { + val (id, input) = uniload(inputUpdateSerializer) + unianswer( + objectsNullableSerializer, + originalRepo.update( + id, input + ) ) - ) + } } post(updateManyRouting) { - val updates = call.uniload(listInputUpdateSerializer) - call.unianswer( - listObjectsSerializer, - originalRepo.update( - updates + unifiedRouter.apply { + val updates = uniload(listInputUpdateSerializer) + unianswer( + listObjectsSerializer, + originalRepo.update( + updates + ) ) - ) + } } post(deleteByIdRouting) { - val ids = call.uniload(listIdsSerializer) - call.unianswer( - Unit.serializer(), - originalRepo.deleteById( - ids + unifiedRouter.apply { + val ids = uniload(listIdsSerializer) + unianswer( + Unit.serializer(), + originalRepo.deleteById( + ids + ) ) - ) + } } } + +fun Route.configureWriteStandardCrudRepoRoutes( + originalRepo: WriteStandardCRUDRepo, + objectsSerializer: KSerializer, + objectsNullableSerializer: KSerializer, + inputsSerializer: KSerializer, + idsSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureWriteStandardCrudRepoRoutes( + originalRepo, objectsSerializer, objectsNullableSerializer, inputsSerializer, idsSerializer, UnifiedRouter(serialFormat, serialFormatContentType) +) diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartKeyValueRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartKeyValueRepo.kt index b7a5948701a..d2cc8f19f04 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartKeyValueRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartKeyValueRepo.kt @@ -1,16 +1,22 @@ package dev.inmo.micro_utils.repos.ktor.server.key_value +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.server.UnifiedRouter +import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType import dev.inmo.micro_utils.repos.StandardKeyValueRepo +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.route import kotlinx.serialization.KSerializer -fun Route.configureStandartKeyValueRepoRoutes( +fun Route.configureStandardKeyValueRepoRoutes( baseSubpart: String, originalRepo: StandardKeyValueRepo, keySerializer: KSerializer, valueSerializer: KSerializer, valueNullableSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { route(baseSubpart) { configureReadStandartKeyValueRepoRoutes( @@ -18,11 +24,23 @@ fun Route.configureStandartKeyValueRepoRoutes( keySerializer, valueSerializer, valueNullableSerializer, + unifiedRouter ) - configureWriteStandartKeyValueRepoRoutes( + configureWriteStandardKeyValueRepoRoutes( originalRepo, keySerializer, valueSerializer, + unifiedRouter ) } -} \ No newline at end of file +} + +fun Route.configureStandartKeyValueRepoRoutes( + baseSubpart: String, + originalRepo: StandardKeyValueRepo, + keySerializer: KSerializer, + valueSerializer: KSerializer, + valueNullableSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureStandardKeyValueRepoRoutes(baseSubpart, originalRepo, keySerializer, valueSerializer, valueNullableSerializer, UnifiedRouter(serialFormat, serialFormatContentType)) \ No newline at end of file diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt index 92990226f65..fd5511914e9 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt @@ -1,5 +1,7 @@ package dev.inmo.micro_utils.repos.ktor.server.key_value +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.pagination.extractPagination @@ -7,6 +9,7 @@ import dev.inmo.micro_utils.repos.ReadStandardKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.key_value.* import dev.inmo.micro_utils.repos.ktor.common.valueParameterName import io.ktor.application.call +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.get import kotlinx.serialization.KSerializer @@ -17,62 +20,84 @@ fun Route.configureReadStandartKeyValueRepoRoutes ( keySerializer: KSerializer, valueSerializer: KSerializer, valueNullableSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { get(getRoute) { - val key = call.decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get + unifiedRouter.apply { + val key = decodeUrlQueryValueOrSendError( + keyParameterName, + keySerializer + ) ?: return@get - call.unianswer( - valueNullableSerializer, - originalRepo.get(key) - ) + unianswer( + valueNullableSerializer, + originalRepo.get(key) + ) + } } get(valuesRoute) { - val parination = call.request.queryParameters.extractPagination; - val reversed = call.decodeUrlQueryValueOrSendError( - reversedParameterName, - Boolean.serializer() - ) ?: return@get + unifiedRouter.apply { + val parination = call.request.queryParameters.extractPagination; + val reversed = decodeUrlQueryValueOrSendError( + reversedParameterName, + Boolean.serializer() + ) ?: return@get - call.unianswer( - PaginationResult.serializer(valueSerializer), - originalRepo.values(parination, reversed) - ) + unianswer( + PaginationResult.serializer(valueSerializer), + originalRepo.values(parination, reversed) + ) + } } get(keysRoute) { - val parination = call.request.queryParameters.extractPagination; - val reversed = call.decodeUrlQueryValueOrSendError( - reversedParameterName, - Boolean.serializer() - ) ?: return@get - val value = call.decodeUrlQueryValue(valueParameterName, valueSerializer) + unifiedRouter.apply { + val parination = call.request.queryParameters.extractPagination; + val reversed = decodeUrlQueryValueOrSendError( + reversedParameterName, + Boolean.serializer() + ) ?: return@get + val value = decodeUrlQueryValue(valueParameterName, valueSerializer) - call.unianswer( - PaginationResult.serializer(keySerializer), - value ?.let { originalRepo.keys(value, parination, reversed) } ?: originalRepo.keys(parination, reversed) - ) + unianswer( + PaginationResult.serializer(keySerializer), + value?.let { originalRepo.keys(value, parination, reversed) } ?: originalRepo.keys(parination, reversed) + ) + } } get(containsRoute) { - val key = call.decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get + unifiedRouter.apply { + val key = decodeUrlQueryValueOrSendError( + keyParameterName, + keySerializer + ) ?: return@get - call.unianswer( - Boolean.serializer(), - originalRepo.contains(key) - ) + unianswer( + Boolean.serializer(), + originalRepo.contains(key) + ) + } } get(countRoute) { - call.unianswer( - Long.serializer(), - originalRepo.count() - ) + unifiedRouter.apply { + unianswer( + Long.serializer(), + originalRepo.count() + ) + } } -} \ No newline at end of file +} + +inline fun Route.configureReadStandartKeyValueRepoRoutes ( + originalRepo: ReadStandardKeyValueRepo, + keySerializer: KSerializer, + valueSerializer: KSerializer, + valueNullableSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureReadStandartKeyValueRepoRoutes( + originalRepo, keySerializer, valueSerializer, valueNullableSerializer, UnifiedRouter(serialFormat, serialFormatContentType) +) diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt index 57a16f20cba..ae288adc189 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt @@ -1,44 +1,61 @@ package dev.inmo.micro_utils.repos.ktor.server.key_value +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.repos.WriteStandardKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.key_value.* -import io.ktor.application.call +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.post import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.* +fun Route.configureWriteStandardKeyValueRepoRoutes ( + originalRepo: WriteStandardKeyValueRepo, + keySerializer: KSerializer, + valueSerializer: KSerializer, + unifiedRouter: UnifiedRouter +) { + val keyValueMapSerializer = MapSerializer(keySerializer, valueSerializer) + val keysListSerializer = ListSerializer(keySerializer) + unifiedRouter.apply { + includeWebsocketHandling( + onNewValueRoute, + originalRepo.onNewValue, + PairSerializer(keySerializer, valueSerializer) + ) + + includeWebsocketHandling( + onValueRemovedRoute, + originalRepo.onValueRemoved, + keySerializer + ) + } + + post(setRoute) { + unifiedRouter.apply { + val toSet = uniload( + keyValueMapSerializer + ) + + unianswer(Unit.serializer(), originalRepo.set(toSet)) + } + } + + post(unsetRoute) { + unifiedRouter.apply { + val toUnset = uniload(keysListSerializer) + + unianswer(Unit.serializer(), originalRepo.unset(toUnset)) + } + } +} + fun Route.configureWriteStandartKeyValueRepoRoutes ( originalRepo: WriteStandardKeyValueRepo, keySerializer: KSerializer, valueSerializer: KSerializer, -) { - val keyValueMapSerializer = MapSerializer(keySerializer, valueSerializer) - val keysListSerializer = ListSerializer(keySerializer) - includeWebsocketHandling( - onNewValueRoute, - originalRepo.onNewValue, - PairSerializer(keySerializer, valueSerializer) - ) - - includeWebsocketHandling( - onValueRemovedRoute, - originalRepo.onValueRemoved, - keySerializer - ) - - post(setRoute) { - val toSet = call.uniload( - keyValueMapSerializer - ) - - call.unianswer(Unit.serializer(), originalRepo.set(toSet)) - } - - post(unsetRoute) { - val toUnset = call.uniload(keysListSerializer) - - call.unianswer(Unit.serializer(), originalRepo.unset(toUnset)) - } -} \ No newline at end of file + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureWriteStandardKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType)) diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyKeyValueRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyKeyValueRepoRoutes.kt index c17599baa2b..23a16dba545 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyKeyValueRepoRoutes.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyKeyValueRepoRoutes.kt @@ -1,6 +1,11 @@ package dev.inmo.micro_utils.repos.ktor.server.one_to_many +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat +import dev.inmo.micro_utils.ktor.server.UnifiedRouter +import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType import dev.inmo.micro_utils.repos.OneToManyKeyValueRepo +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.route import kotlinx.serialization.KSerializer @@ -9,10 +14,22 @@ fun Route.configureOneToManyKeyValueRepoRoutes( baseSubpart: String, originalRepo: OneToManyKeyValueRepo, keySerializer: KSerializer, - valueSealizer: KSerializer, + valueSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { route(baseSubpart) { - configureOneToManyReadKeyValueRepoRoutes(originalRepo, keySerializer, valueSealizer) - configureOneToManyWriteKeyValueRepoRoutes(originalRepo, keySerializer, valueSealizer) + configureOneToManyReadKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, unifiedRouter) + configureOneToManyWriteKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, unifiedRouter) } -} \ No newline at end of file +} + +fun Route.configureOneToManyKeyValueRepoRoutes( + baseSubpart: String, + originalRepo: OneToManyKeyValueRepo, + keySerializer: KSerializer, + valueSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureOneToManyKeyValueRepoRoutes( + baseSubpart, originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType) +) \ No newline at end of file diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt index 0cbcf2a5691..df0743a1d09 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt @@ -1,5 +1,7 @@ package dev.inmo.micro_utils.repos.ktor.server.one_to_many +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.pagination.extractPagination @@ -10,6 +12,7 @@ import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* import dev.inmo.micro_utils.repos.ktor.common.valueParameterName import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName import io.ktor.application.call +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.get import kotlinx.serialization.KSerializer @@ -18,89 +21,110 @@ import kotlinx.serialization.builtins.serializer fun Route.configureOneToManyReadKeyValueRepoRoutes( originalRepo: ReadOneToManyKeyValueRepo, keySerializer: KSerializer, - valueSealizer: KSerializer, + valueSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { val paginationKeyResult = PaginationResult.serializer(keySerializer) - val paginationValueResult = PaginationResult.serializer(valueSealizer) + val paginationValueResult = PaginationResult.serializer(valueSerializer) get(getRoute) { - val pagination = call.request.queryParameters.extractPagination - val key = call.decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - val reversed = call.decodeUrlQueryValue( - reversedParameterName, - Boolean.serializer() - ) ?: false + unifiedRouter.apply { + val pagination = call.request.queryParameters.extractPagination + val key = decodeUrlQueryValueOrSendError( + keyParameterName, + keySerializer + ) ?: return@get + val reversed = decodeUrlQueryValue( + reversedParameterName, + Boolean.serializer() + ) ?: false - call.unianswer( - paginationValueResult, - originalRepo.get(key, pagination, reversed) - ) + unianswer( + paginationValueResult, + originalRepo.get(key, pagination, reversed) + ) + } } get(keysRoute) { - val pagination = call.request.queryParameters.extractPagination - val reversed = call.decodeUrlQueryValue( - reversedParameterName, - Boolean.serializer() - ) ?: false - val value: Value? = call.decodeUrlQueryValue( - valueParameterName, - valueSealizer - ) + unifiedRouter.apply { + val pagination = call.request.queryParameters.extractPagination + val reversed = decodeUrlQueryValue( + reversedParameterName, + Boolean.serializer() + ) ?: false + val value: Value? = decodeUrlQueryValue( + valueParameterName, + valueSerializer + ) - call.unianswer( - paginationKeyResult, - value ?.let { originalRepo.keys(value, pagination, reversed) } ?: originalRepo.keys(pagination, reversed) - ) + unianswer( + paginationKeyResult, + value?.let { originalRepo.keys(value, pagination, reversed) } ?: originalRepo.keys(pagination, reversed) + ) + } } get(containsByKeyRoute) { - val key = call.decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get + unifiedRouter.apply { + val key = decodeUrlQueryValueOrSendError( + keyParameterName, + keySerializer + ) ?: return@get - call.unianswer( - Boolean.serializer(), - originalRepo.contains(key) - ) + unianswer( + Boolean.serializer(), + originalRepo.contains(key) + ) + } } get(containsByKeyValueRoute) { - val key = call.decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - val value = call.decodeUrlQueryValueOrSendError( - valueParameterName, - valueSealizer - ) ?: return@get + unifiedRouter.apply { + val key = decodeUrlQueryValueOrSendError( + keyParameterName, + keySerializer + ) ?: return@get + val value = decodeUrlQueryValueOrSendError( + valueParameterName, + valueSerializer + ) ?: return@get - call.unianswer( - Boolean.serializer(), - originalRepo.contains(key, value) - ) + unianswer( + Boolean.serializer(), + originalRepo.contains(key, value) + ) + } } get(countByKeyRoute) { - val key = call.decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get + unifiedRouter.apply { + val key = decodeUrlQueryValueOrSendError( + keyParameterName, + keySerializer + ) ?: return@get - call.unianswer( - Long.serializer(), - originalRepo.count(key) - ) + unianswer( + Long.serializer(), + originalRepo.count(key) + ) + } } get(countRoute) { - call.unianswer( - Long.serializer(), - originalRepo.count() - ) + unifiedRouter.apply { + unianswer( + Long.serializer(), + originalRepo.count() + ) + } } -} \ No newline at end of file +} + +inline fun Route.configureOneToManyReadKeyValueRepoRoutes( + originalRepo: ReadOneToManyKeyValueRepo, + keySerializer: KSerializer, + valueSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureOneToManyReadKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType)) diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt index aeb8656a1eb..c9039bb87cb 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt @@ -1,9 +1,12 @@ package dev.inmo.micro_utils.repos.ktor.server.one_to_many +import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat +import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.repos.WriteOneToManyKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* import io.ktor.application.call +import io.ktor.http.ContentType import io.ktor.routing.Route import io.ktor.routing.post import kotlinx.serialization.KSerializer @@ -13,61 +16,78 @@ fun Route.configureOneToManyWriteKeyValueRepoRoutes( originalRepo: WriteOneToManyKeyValueRepo, keySerializer: KSerializer, valueSerializer: KSerializer, + unifiedRouter: UnifiedRouter ) { val keyValueSerializer = PairSerializer(keySerializer, valueSerializer) val keyValueMapSerializer = MapSerializer(keySerializer, ListSerializer(valueSerializer)) - includeWebsocketHandling( - onNewValueRoute, - originalRepo.onNewValue, - keyValueSerializer - ) - includeWebsocketHandling( - onValueRemovedRoute, - originalRepo.onValueRemoved, - keyValueSerializer - ) - includeWebsocketHandling( - onDataClearedRoute, - originalRepo.onDataCleared, - keySerializer - ) + unifiedRouter.apply { + includeWebsocketHandling( + onNewValueRoute, + originalRepo.onNewValue, + keyValueSerializer + ) + includeWebsocketHandling( + onValueRemovedRoute, + originalRepo.onValueRemoved, + keyValueSerializer + ) + includeWebsocketHandling( + onDataClearedRoute, + originalRepo.onDataCleared, + keySerializer + ) + } post(addRoute) { - val obj = call.uniload(keyValueMapSerializer) + unifiedRouter.apply { + val obj = uniload(keyValueMapSerializer) - call.unianswer( - Unit.serializer(), - originalRepo.add(obj) - ) + unianswer( + Unit.serializer(), + originalRepo.add(obj) + ) + } } post(removeRoute) { - val obj = call.uniload( - keyValueMapSerializer - ) + unifiedRouter.apply { + val obj = uniload(keyValueMapSerializer) - call.unianswer( - Unit.serializer(), - originalRepo.remove(obj), - ) + unianswer( + Unit.serializer(), + originalRepo.remove(obj), + ) + } } post(clearRoute) { - val key = call.uniload(keySerializer) + unifiedRouter.apply { + val key = uniload(keySerializer) - call.unianswer( - Unit.serializer(), - originalRepo.clear(key), - ) + unianswer( + Unit.serializer(), + originalRepo.clear(key), + ) + } } post(setRoute) { - val obj = call.uniload(keyValueMapSerializer) + unifiedRouter.apply { + val obj = uniload(keyValueMapSerializer) - call.unianswer( - Unit.serializer(), - originalRepo.set(obj) - ) + unianswer( + Unit.serializer(), + originalRepo.set(obj) + ) + } } -} \ No newline at end of file +} + +fun Route.configureOneToManyWriteKeyValueRepoRoutes( + originalRepo: WriteOneToManyKeyValueRepo, + keySerializer: KSerializer, + valueSerializer: KSerializer, + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + serialFormatContentType: ContentType = standardKtorSerialFormatContentType +) = configureOneToManyWriteKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType))