From 8eed435302a397b159700ffd837e8f0232c19cf9 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 3 Jun 2022 12:22:51 +0600 Subject: [PATCH] start improvements in ktor parts --- CHANGELOG.md | 2 + .../ktor/client/NewFlowsWebsockets.kt | 54 +++++++++++ .../ktor/server/NewFlowsWebsocket.kt | 30 ++++++ .../client/crud/KtorReadStandardCrudRepo.kt | 1 + .../crud/KtorReadStandardCrudRepoClient.kt | 80 ++++++++++++++++ .../ktor/client/crud/KtorStandardCrudRepo.kt | 1 + .../client/crud/KtorStandardCrudRepoClient.kt | 93 +++++++++++++++++++ .../client/crud/KtorWriteStandardCrudRepo.kt | 1 + .../crud/KtorWriteStandardCrudRepoClient.kt | 51 ++++++++++ .../crud/NewKtorReadStandardCrudRepo.kt | 71 ++++++++++++++ .../server/crud/NewKtorStandardCrudRepo.kt | 34 +++++++ .../crud/NewKtorWriteStandardCrudRepo.kt | 43 +++++++++ 12 files changed, 461 insertions(+) create mode 100644 ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/NewFlowsWebsockets.kt create mode 100644 ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/NewFlowsWebsocket.kt create mode 100644 repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepoClient.kt create mode 100644 repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepoClient.kt create mode 100644 repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepoClient.kt create mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorReadStandardCrudRepo.kt create mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorStandardCrudRepo.kt create mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorWriteStandardCrudRepo.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 1716489a86a..c9a0763bafc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.11.0 + ## 0.10.8 * `Common` diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/NewFlowsWebsockets.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/NewFlowsWebsockets.kt new file mode 100644 index 00000000000..ba84f813bac --- /dev/null +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/NewFlowsWebsockets.kt @@ -0,0 +1,54 @@ +package dev.inmo.micro_utils.ktor.client + +import dev.inmo.micro_utils.coroutines.runCatchingSafely +import dev.inmo.micro_utils.coroutines.safely +import dev.inmo.micro_utils.ktor.common.* +import io.ktor.client.HttpClient +import io.ktor.client.plugins.pluginOrNull +import io.ktor.client.plugins.websocket.* +import io.ktor.client.request.HttpRequestBuilder +import io.ktor.websocket.Frame +import io.ktor.websocket.readBytes +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.channelFlow +import kotlinx.coroutines.isActive +import kotlinx.serialization.DeserializationStrategy + +/** + * @param checkReconnection This lambda will be called when it is required to reconnect to websocket to establish + * connection. Must return true in case if must be reconnected. By default always reconnecting + */ +inline fun HttpClient.createStandardWebsocketFlow( + url: String, + crossinline checkReconnection: suspend (Throwable?) -> Boolean = { true }, + noinline requestBuilder: HttpRequestBuilder.() -> Unit = {} +): Flow { + pluginOrNull(WebSockets) ?: error("Plugin $WebSockets must be installed for using createStandardWebsocketFlow") + + val correctedUrl = url.asCorrectWebSocketUrl + + return channelFlow { + do { + val reconnect = runCatchingSafely { + ws(correctedUrl, requestBuilder) { + for (received in incoming) { + sendSerialized(received.data) + } + } + checkReconnection(null) + }.getOrElse { e -> + checkReconnection(e).also { + if (!it) { + close(e) + } + } + } + } while (reconnect && isActive) + + if (isActive) { + safely { + close() + } + } + } +} diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/NewFlowsWebsocket.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/NewFlowsWebsocket.kt new file mode 100644 index 00000000000..ae9108f9235 --- /dev/null +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/NewFlowsWebsocket.kt @@ -0,0 +1,30 @@ +package dev.inmo.micro_utils.ktor.server + +import dev.inmo.micro_utils.coroutines.safely +import dev.inmo.micro_utils.ktor.common.* +import io.ktor.http.URLProtocol +import io.ktor.server.application.install +import io.ktor.server.application.pluginOrNull +import io.ktor.server.routing.Route +import io.ktor.server.routing.application +import io.ktor.server.websocket.* +import io.ktor.websocket.send +import kotlinx.coroutines.flow.Flow +import kotlinx.serialization.SerializationStrategy + +inline fun Route.includeWebsocketHandling( + suburl: String, + flow: Flow, + protocol: URLProtocol? = null +) { + application.apply { + pluginOrNull(WebSockets) ?: install(WebSockets) + } + webSocket(suburl, protocol ?.name) { + safely { + flow.collect { + sendSerialized(it) + } + } + } +} 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 470249b0039..70bfce26391 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 @@ -9,6 +9,7 @@ import io.ktor.client.HttpClient import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.serializer +@Deprecated("Use KtorReadStandardCrudRepoClient instead") class KtorReadStandardCrudRepo ( private val baseUrl: String, private val unifiedRequester: UnifiedRequester, diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepoClient.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepoClient.kt new file mode 100644 index 00000000000..e7f00f3a40e --- /dev/null +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadStandardCrudRepoClient.kt @@ -0,0 +1,80 @@ +package dev.inmo.micro_utils.repos.ktor.client.crud + +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 io.ktor.client.call.body +import io.ktor.client.request.get +import io.ktor.http.HttpStatusCode +import io.ktor.util.reflect.TypeInfo +import io.ktor.util.reflect.typeInfo +import kotlinx.serialization.* + +class KtorReadStandardCrudRepoClient ( + private val baseUrl: String, + private val httpClient: HttpClient, + private val objectType: TypeInfo, + private val idSerializer: suspend (IdType) -> String +) : ReadStandardCRUDRepo { + override suspend fun getByPagination(pagination: Pagination): PaginationResult = httpClient.get( + buildStandardUrl(baseUrl, getByPaginationRouting, pagination.asUrlQueryParts) + ).body() + + override suspend fun getById(id: IdType): ObjectType? = httpClient.get( + buildStandardUrl( + baseUrl, + getByIdRouting, + mapOf( + "id" to idSerializer(id) + ) + ) + ).takeIf { it.status != HttpStatusCode.NoContent } ?.body(objectType) + + override suspend fun contains(id: IdType): Boolean = httpClient.get( + buildStandardUrl( + baseUrl, + containsRouting, + mapOf( + "id" to idSerializer(id) + ) + ) + ).body() + + override suspend fun count(): Long = httpClient.get( + buildStandardUrl( + baseUrl, + countRouting + ) + ).body() +} + +inline fun KtorReadStandardCrudRepoClient( + baseUrl: String, + httpClient: HttpClient, + noinline idSerializer: suspend (IdType) -> String +) = KtorReadStandardCrudRepoClient( + baseUrl, + httpClient, + typeInfo(), + idSerializer +) + +inline fun KtorReadStandardCrudRepoClient( + baseUrl: String, + httpClient: HttpClient, + idsSerializer: KSerializer, + serialFormat: StringFormat +) = KtorReadStandardCrudRepoClient(baseUrl, httpClient) { + serialFormat.encodeToString(idsSerializer, it) +} + +inline fun KtorReadStandardCrudRepoClient( + baseUrl: String, + httpClient: HttpClient, + idsSerializer: KSerializer, + serialFormat: BinaryFormat +) = KtorReadStandardCrudRepoClient(baseUrl, httpClient) { + serialFormat.encodeHex(idsSerializer, it) +} 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 19561cd92eb..1f0b31fafd4 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 @@ -7,6 +7,7 @@ import dev.inmo.micro_utils.repos.* import io.ktor.client.HttpClient import kotlinx.serialization.KSerializer +@Deprecated("Use KtorStandardCrudRepoClient instead") class KtorStandardCrudRepo ( baseUrl: String, baseSubpart: String, diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepoClient.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepoClient.kt new file mode 100644 index 00000000000..aa6bc86600e --- /dev/null +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorStandardCrudRepoClient.kt @@ -0,0 +1,93 @@ +package dev.inmo.micro_utils.repos.ktor.client.crud + +import dev.inmo.micro_utils.ktor.common.* +import dev.inmo.micro_utils.repos.* +import io.ktor.client.HttpClient +import io.ktor.util.reflect.TypeInfo +import io.ktor.util.reflect.typeInfo +import kotlinx.serialization.* + +class KtorStandardCrudRepoClient ( + baseUrl: String, + httpClient: HttpClient, + objectTypeInfo: TypeInfo, + idSerializer: suspend (IdType) -> String +) : StandardCRUDRepo, + ReadStandardCRUDRepo by KtorReadStandardCrudRepoClient( + baseUrl, + httpClient, + objectTypeInfo, + idSerializer + ), + WriteStandardCRUDRepo by KtorWriteStandardCrudRepoClient( + baseUrl, + httpClient + ) { + constructor( + baseUrl: String, + subpart: String, + httpClient: HttpClient, + objectTypeInfo: TypeInfo, + idSerializer: suspend (IdType) -> String + ) : this( + buildStandardUrl(baseUrl, subpart), httpClient, objectTypeInfo, idSerializer + ) +} + + +inline fun KtorStandardCrudRepoClient( + baseUrl: String, + httpClient: HttpClient, + noinline idSerializer: suspend (IdType) -> String +) = KtorStandardCrudRepoClient( + baseUrl, + httpClient, + typeInfo(), + idSerializer +) + +inline fun KtorStandardCrudRepoClient( + baseUrl: String, + httpClient: HttpClient, + idsSerializer: KSerializer, + serialFormat: StringFormat +) = KtorStandardCrudRepoClient(baseUrl, httpClient) { + serialFormat.encodeToString(idsSerializer, it) +} + +inline fun KtorStandardCrudRepoClient( + baseUrl: String, + httpClient: HttpClient, + idsSerializer: KSerializer, + serialFormat: BinaryFormat +) = KtorStandardCrudRepoClient(baseUrl, httpClient) { + serialFormat.encodeHex(idsSerializer, it) +} + + +inline fun KtorStandardCrudRepoClient( + baseUrl: String, + subpart: String, + httpClient: HttpClient, + noinline idSerializer: suspend (IdType) -> String +) = KtorStandardCrudRepoClient( + buildStandardUrl(baseUrl, subpart), + httpClient, + idSerializer +) + +inline fun KtorStandardCrudRepoClient( + baseUrl: String, + subpart: String, + httpClient: HttpClient, + idsSerializer: KSerializer, + serialFormat: StringFormat +) = KtorStandardCrudRepoClient(buildStandardUrl(baseUrl, subpart), httpClient, idsSerializer, serialFormat) + +inline fun KtorStandardCrudRepoClient( + baseUrl: String, + subpart: String, + httpClient: HttpClient, + idsSerializer: KSerializer, + serialFormat: BinaryFormat +) = KtorStandardCrudRepoClient(buildStandardUrl(baseUrl, subpart), httpClient, idsSerializer, serialFormat) 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 71bc3823d92..2013041d432 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 @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.* +@Deprecated("Use KtorWriteStandardCrudRepoClient instead") class KtorWriteStandardCrudRepo ( private val baseUrl: String, private val unifiedRequester: UnifiedRequester, diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepoClient.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepoClient.kt new file mode 100644 index 00000000000..b0f9e27a9f0 --- /dev/null +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorWriteStandardCrudRepoClient.kt @@ -0,0 +1,51 @@ +package dev.inmo.micro_utils.repos.ktor.client.crud + +import dev.inmo.micro_utils.ktor.client.* +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 io.ktor.client.call.body +import io.ktor.client.request.* +import io.ktor.util.reflect.TypeInfo +import io.ktor.util.reflect.typeInfo +import kotlinx.coroutines.flow.Flow +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.* + +class KtorWriteStandardCrudRepoClient ( + private val baseUrl: String, + private val httpClient: HttpClient +) : WriteStandardCRUDRepo { + + override val newObjectsFlow: Flow = httpClient.createStandardWebsocketFlow( + buildStandardUrl(baseUrl, newObjectsFlowRouting), + ) + override val updatedObjectsFlow: Flow = httpClient.createStandardWebsocketFlow( + buildStandardUrl(baseUrl, updatedObjectsFlowRouting) + ) + override val deletedObjectsIdsFlow: Flow = httpClient.createStandardWebsocketFlow( + buildStandardUrl(baseUrl, deletedObjectsIdsFlowRouting) + ) + + + override suspend fun create(values: List): List = httpClient.post { + url(buildStandardUrl(baseUrl, createRouting)) + setBody(values) + }.body() + + override suspend fun update(values: List>): List = httpClient.post { + url(buildStandardUrl(baseUrl, updateManyRouting)) + setBody(values) + }.body() + + override suspend fun update(id: IdType, value: InputValue): ObjectType? = update(listOf(id to value)).firstOrNull() + + override suspend fun deleteById(ids: List) { + httpClient.post { + url(buildStandardUrl(baseUrl, deleteByIdRouting)) + setBody(ids) + } + } +} diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorReadStandardCrudRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorReadStandardCrudRepo.kt new file mode 100644 index 00000000000..7ac033b7006 --- /dev/null +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorReadStandardCrudRepo.kt @@ -0,0 +1,71 @@ +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 +import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo +import dev.inmo.micro_utils.repos.ktor.common.crud.* +import io.ktor.http.ContentType +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.* + +inline fun Route.configureReadStandardCrudRepoRoutes( + originalRepo: ReadStandardCRUDRepo, + noinline idDeserializer: suspend (String) -> IdType +) { + get(getByPaginationRouting) { + val pagination = call.request.queryParameters.extractPagination + + call.respond(originalRepo.getByPagination(pagination)) + } + + get(getByIdRouting) { + val id = idDeserializer( + call.getQueryParameterOrSendError("id") ?: return@get + ) + + val result = originalRepo.getById(id) + + if (result == null) { + call.respond(HttpStatusCode.NoContent) + } else { + call.respond(result) + } + } + + get(containsRouting) { + val id = idDeserializer( + call.getQueryParameterOrSendError("id") ?: return@get + ) + + call.respond( + originalRepo.contains(id) + ) + } + + get(countRouting) { + call.respond( + originalRepo.count() + ) + } +} + +inline fun Route.configureReadStandardCrudRepoRoutes( + originalRepo: ReadStandardCRUDRepo, + idsSerializer: KSerializer, + serialFormat: StringFormat +) = configureReadStandardCrudRepoRoutes(originalRepo) { + serialFormat.decodeFromString(idsSerializer, it) +} + +inline fun Route.configureReadStandardCrudRepoRoutes( + originalRepo: ReadStandardCRUDRepo, + idsSerializer: KSerializer, + serialFormat: BinaryFormat +) = configureReadStandardCrudRepoRoutes(originalRepo) { + serialFormat.decodeHex(idsSerializer, it) +} diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorStandardCrudRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorStandardCrudRepo.kt new file mode 100644 index 00000000000..30aa02b89da --- /dev/null +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorStandardCrudRepo.kt @@ -0,0 +1,34 @@ +package dev.inmo.micro_utils.repos.ktor.server.crud + +import dev.inmo.micro_utils.ktor.common.* +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.server.routing.Route +import io.ktor.server.routing.route +import kotlinx.serialization.* + +inline fun Route.configureStandardCrudRepoRoutes( + originalRepo: StandardCRUDRepo, + noinline idDeserializer: suspend (String) -> IdType +) { + configureReadStandardCrudRepoRoutes(originalRepo, idDeserializer) + configureWriteStandardCrudRepoRoutes(originalRepo) +} + +inline fun Route.configureStandardCrudRepoRoutes( + originalRepo: StandardCRUDRepo, + idsSerializer: KSerializer, + serialFormat: StringFormat +) = configureStandardCrudRepoRoutes(originalRepo) { + serialFormat.decodeFromString(idsSerializer, it) +} + +inline fun Route.configureStandardCrudRepoRoutes( + originalRepo: StandardCRUDRepo, + idsSerializer: KSerializer, + serialFormat: BinaryFormat +) = configureStandardCrudRepoRoutes(originalRepo) { + serialFormat.decodeHex(idsSerializer, it) +} diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorWriteStandardCrudRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorWriteStandardCrudRepo.kt new file mode 100644 index 00000000000..ae205e27f5d --- /dev/null +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/NewKtorWriteStandardCrudRepo.kt @@ -0,0 +1,43 @@ +package dev.inmo.micro_utils.repos.ktor.server.crud + +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.server.application.call +import io.ktor.server.request.receive +import io.ktor.server.response.respond +import io.ktor.server.routing.Route +import io.ktor.server.routing.post + +inline fun Route.configureWriteStandardCrudRepoRoutes( + originalRepo: WriteStandardCRUDRepo +) { + includeWebsocketHandling( + newObjectsFlowRouting, + originalRepo.newObjectsFlow, + ) + includeWebsocketHandling( + updatedObjectsFlowRouting, + originalRepo.updatedObjectsFlow + ) + includeWebsocketHandling( + deletedObjectsIdsFlowRouting, + originalRepo.deletedObjectsIdsFlow + ) + + post(createRouting) { + call.respond( + originalRepo.create( + call.receive() + ) + ) + } + + post(updateManyRouting) { + call.respond(originalRepo.update(call.receive())) + } + + post(deleteByIdRouting) { + call.respond(originalRepo.deleteById(call.receive())) + } +}