From a1a1171240550679e081ea75f447bb6d8b917f8f Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 4 Oct 2022 15:36:43 +0600 Subject: [PATCH 1/5] start 0.12.18 --- CHANGELOG.md | 2 ++ gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e76c0687748..1f7cf95204a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.12.18 + ## 0.12.17 * `Versions`: diff --git a/gradle.properties b/gradle.properties index 3d2db988c99..219f6cc6fa3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.12.17 -android_code_version=156 +version=0.12.18 +android_code_version=157 From 1107b7f4ef56001ce4bb71c478be278048c2ce83 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 11 Oct 2022 12:07:49 +0600 Subject: [PATCH 2/5] start 0.13.0 --- CHANGELOG.md | 2 +- gradle.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f7cf95204a..8303d735c6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 0.12.18 +## 0.13.0 ## 0.12.17 diff --git a/gradle.properties b/gradle.properties index 219f6cc6fa3..6934f01096a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.12.18 -android_code_version=157 +version=0.13.0 +android_code_version=158 From 1257492f85da63e3fcb2cd90f9432ac0c019de4d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 11 Oct 2022 12:55:25 +0600 Subject: [PATCH 3/5] changes in insert/update exposed methods and rewriting of read keyvalue(s) exposed repos to be extending abstract key value(s) repos --- CHANGELOG.md | 9 +++ .../exposed/AbstractExposedWriteCRUDRepo.kt | 50 ++++++++++++---- .../keyvalue/AbstractExposedKeyValueRepo.kt | 23 ++++++-- .../keyvalue/ExposedReadKeyValueRepo.kt | 58 +++++-------------- .../onetomany/ExposedReadKeyValuesRepo.kt | 57 +++--------------- 5 files changed, 89 insertions(+), 108 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8303d735c6d..e302bb016a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ ## 0.13.0 +* `Repos`: + * `Exposed`: + * `AbstractExposedWriteCRUDRepo` got two new methods: `update` with `it` as `UpdateBuilder` and `createAndInsertId` + * Old `update` method has been deprecated and not recommended to override anymore in realizations + * Old `insert` method now is `open` instead of `abstract` and can be omitted + * `AbstractExposedKeyValueRepo` got two new methods: `update` with `it` as `UpdateBuilder` and `insertKey` + * Old `update` method has been deprecated and not recommended to override anymore + * Old `insert` method now is `open` instead of `abstract` and can be omitted in realizations + ## 0.12.17 * `Versions`: diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedWriteCRUDRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedWriteCRUDRepo.kt index 6bb44a53052..1440b5cfaf1 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedWriteCRUDRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedWriteCRUDRepo.kt @@ -4,9 +4,9 @@ import dev.inmo.micro_utils.repos.UpdatedValuePair import dev.inmo.micro_utils.repos.WriteCRUDRepo import kotlinx.coroutines.flow.* import org.jetbrains.exposed.sql.* -import org.jetbrains.exposed.sql.statements.InsertStatement -import org.jetbrains.exposed.sql.statements.UpdateStatement +import org.jetbrains.exposed.sql.statements.* import org.jetbrains.exposed.sql.transactions.transaction +import java.util.Objects abstract class AbstractExposedWriteCRUDRepo( flowsChannelsSize: Int = 0, @@ -27,10 +27,31 @@ abstract class AbstractExposedWriteCRUDRepo( protected abstract fun InsertStatement.asObject(value: InputValueType): ObjectType - protected abstract fun insert(value: InputValueType, it: InsertStatement) - protected abstract fun update(id: IdType, value: InputValueType, it: UpdateStatement) + protected abstract fun update(id: IdType, value: InputValueType, it: UpdateBuilder) + protected abstract fun createAndInsertId(value: InputValueType, it: InsertStatement): IdType + + protected open fun insert(value: InputValueType, it: InsertStatement) { + val id = createAndInsertId(value, it) + update(id, value, it as UpdateBuilder) + } + @Deprecated( + "Replace its \"it\" parameter type with \"UpdateBuilder\" to actualize method signature. Method with current signature will be removed soon and do not recommended to override anymore" + ) + protected open fun update(id: IdType, value: InputValueType, it: UpdateStatement) = update( + id, + value, + it as UpdateBuilder + ) protected open suspend fun onBeforeCreate(value: List) {} + + /** + * Use this method to do the something with [values]. You may change and output values in that list and return + * changed list of pairs + */ + protected open suspend fun onAfterCreate( + values: List> + ): List = values.map { it.second } private fun createWithoutNotification(value: InputValueType): ObjectType { return transaction(database) { insert { insert(value, it) }.asObject(value) @@ -40,13 +61,18 @@ abstract class AbstractExposedWriteCRUDRepo( override suspend fun create(values: List): List { onBeforeCreate(values) return transaction(db = database) { - values.map { value -> createWithoutNotification(value) } + values.map { value -> value to createWithoutNotification(value) } + }.let { + onAfterCreate(it) }.onEach { _newObjectsFlow.emit(it) } } protected open suspend fun onBeforeUpdate(value: List>) {} + protected open suspend fun onAfterUpdate( + value: List> + ): List = value.map { it.second } private fun updateWithoutNotification(id: IdType, value: InputValueType): ObjectType? { return transaction(db = database) { update( @@ -54,7 +80,7 @@ abstract class AbstractExposedWriteCRUDRepo( selectById(this, id) } ) { - update(id, value, it) + update(id, value, it as UpdateBuilder) } }.let { if (it > 0) { @@ -71,7 +97,9 @@ abstract class AbstractExposedWriteCRUDRepo( override suspend fun update(id: IdType, value: InputValueType): ObjectType? { onBeforeUpdate(listOf(id to value)) - return updateWithoutNotification(id, value).also { + return updateWithoutNotification(id, value).let { + onAfterUpdate(listOf(value to (it ?: return@let emptyList()))) + }.firstOrNull().also { if (it != null) { _updatedObjectsFlow.emit(it) } @@ -81,9 +109,11 @@ abstract class AbstractExposedWriteCRUDRepo( onBeforeUpdate(values) return ( transaction(db = database) { - values.map { (id, value) -> updateWithoutNotification(id, value) } - }.filterNotNull() - ).onEach { + values.mapNotNull { (id, value) -> value to (updateWithoutNotification(id, value) ?: return@mapNotNull null) } + } + ).let { + onAfterUpdate(it) + }.onEach { _updatedObjectsFlow.emit(it) } } diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedKeyValueRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedKeyValueRepo.kt index 528c669ec8b..42a640ef648 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedKeyValueRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedKeyValueRepo.kt @@ -3,8 +3,7 @@ package dev.inmo.micro_utils.repos.exposed.keyvalue import dev.inmo.micro_utils.repos.KeyValueRepo import kotlinx.coroutines.flow.* import org.jetbrains.exposed.sql.* -import org.jetbrains.exposed.sql.statements.InsertStatement -import org.jetbrains.exposed.sql.statements.UpdateStatement +import org.jetbrains.exposed.sql.statements.* import org.jetbrains.exposed.sql.transactions.transaction abstract class AbstractExposedKeyValueRepo( @@ -20,13 +19,27 @@ abstract class AbstractExposedKeyValueRepo( override val onNewValue: Flow> = _onNewValue.asSharedFlow() override val onValueRemoved: Flow = _onValueRemoved.asSharedFlow() - protected abstract fun update(k: Key, v: Value, it: UpdateStatement) - protected abstract fun insert(k: Key, v: Value, it: InsertStatement) + protected abstract fun update(k: Key, v: Value, it: UpdateBuilder) + protected abstract fun insertKey(k: Key, v: Value, it: InsertStatement) + + protected open fun insert(k: Key, v: Value, it: InsertStatement) { + insertKey(k, v, it) + update(k, v, it as UpdateBuilder) + } + + @Deprecated( + "Replace its \"it\" parameter type with \"UpdateBuilder\" to actualize method signature. Method with current signature will be removed soon and do not recommended to override anymore" + ) + protected open fun update(k: Key, v: Value, it: UpdateStatement) = update( + k, + v, + it as UpdateBuilder + ) override suspend fun set(toSet: Map) { transaction(database) { toSet.mapNotNull { (k, v) -> - if (update({ selectById(k) }) { update(k, v, it) } > 0) { + if (update({ selectById(k) }) { update(k, v, it as UpdateBuilder) } > 0) { k to v } else { val inserted = insert { diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt index 5ea319f8d02..0e01f00b759 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt @@ -5,57 +5,27 @@ import dev.inmo.micro_utils.repos.ReadKeyValueRepo import dev.inmo.micro_utils.repos.exposed.* import dev.inmo.micro_utils.repos.exposed.utils.selectPaginated import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.statements.InsertStatement +import org.jetbrains.exposed.sql.statements.UpdateBuilder import org.jetbrains.exposed.sql.transactions.transaction open class ExposedReadKeyValueRepo( - override val database: Database, + database: Database, keyColumnAllocator: ColumnAllocator, valueColumnAllocator: ColumnAllocator, tableName: String? = null -) : ReadKeyValueRepo, ExposedRepo, Table(tableName ?: "") { - val keyColumn: Column = keyColumnAllocator() +) : ReadKeyValueRepo, ExposedRepo, AbstractExposedReadKeyValueRepo(database, tableName) { + + override val keyColumn: Column = keyColumnAllocator() val valueColumn: Column = valueColumnAllocator() - override val primaryKey: PrimaryKey = PrimaryKey(keyColumn, valueColumn) + override val ResultRow.asKey: Key + get() = get(keyColumn) + override val selectByValue: SqlExpressionBuilder.(Value) -> Op = { valueColumn.eq(it) } + override val ResultRow.asObject: Value + get() = get(valueColumn) + override val selectById: SqlExpressionBuilder.(Key) -> Op = { keyColumn.eq(it) } + override val primaryKey: Table.PrimaryKey + get() = PrimaryKey(keyColumn, valueColumn) init { initTable() } - - override suspend fun get(k: Key): Value? = transaction(database) { - select { keyColumn.eq(k) }.limit(1).firstOrNull() ?.getOrNull(valueColumn) - } - - override suspend fun contains(key: Key): Boolean = transaction(database) { - select { keyColumn.eq(key) }.limit(1).any() - } - - override suspend fun count(): Long = transaction(database) { selectAll().count() } - - override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult = transaction(database) { - selectAll().selectPaginated( - pagination, - keyColumn, - reversed - ) { - it[keyColumn] - } - } - - override suspend fun keys(v: Value, pagination: Pagination, reversed: Boolean): PaginationResult = transaction(database) { - select { valueColumn.eq(v) }.selectPaginated( - pagination, - keyColumn, - reversed - ) { - it[keyColumn] - } - } - - override suspend fun values(pagination: Pagination, reversed: Boolean): PaginationResult = transaction(database) { - selectAll().selectPaginated( - pagination, - keyColumn, - reversed - ) { - it[valueColumn] - } - } } diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/ExposedReadKeyValuesRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/ExposedReadKeyValuesRepo.kt index d6903b764b3..cb7a6334285 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/ExposedReadKeyValuesRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/ExposedReadKeyValuesRepo.kt @@ -1,10 +1,8 @@ package dev.inmo.micro_utils.repos.exposed.onetomany -import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.repos.ReadKeyValuesRepo import dev.inmo.micro_utils.repos.exposed.* import org.jetbrains.exposed.sql.* -import org.jetbrains.exposed.sql.transactions.transaction typealias ExposedReadOneToManyKeyValueRepo = ExposedReadKeyValuesRepo @@ -13,54 +11,15 @@ open class ExposedReadKeyValuesRepo( keyColumnAllocator: ColumnAllocator, valueColumnAllocator: ColumnAllocator, tableName: String? = null -) : ReadKeyValuesRepo, ExposedRepo, Table(tableName ?: "") { - val keyColumn: Column = keyColumnAllocator() +) : ReadKeyValuesRepo, ExposedRepo, AbstractExposedReadKeyValuesRepo(database, tableName) { + override val keyColumn: Column = keyColumnAllocator() + override val ResultRow.asKey: Key + get() = get(keyColumn) + override val selectByValue: SqlExpressionBuilder.(Value) -> Op = { valueColumn.eq(it) } + override val ResultRow.asObject: Value + get() = get(valueColumn) + override val selectById: SqlExpressionBuilder.(Key) -> Op = { keyColumn.eq(it) } val valueColumn: Column = valueColumnAllocator() init { initTable() } - - override suspend fun count(k: Key): Long = transaction(database) { select { keyColumn.eq(k) }.count() } - - override suspend fun count(): Long = transaction(database) { selectAll().count() } - - override suspend fun get( - k: Key, - pagination: Pagination, - reversed: Boolean - ): PaginationResult = transaction(database) { - select { keyColumn.eq(k) }.paginate(pagination, keyColumn, reversed).map { it[valueColumn] } - }.createPaginationResult( - pagination, - count(k) - ) - - override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult = transaction(database) { - selectAll().paginate(pagination, keyColumn, reversed).map { it[keyColumn] } - }.createPaginationResult( - pagination, - count() - ) - - override suspend fun keys( - v: Value, - pagination: Pagination, - reversed: Boolean - ): PaginationResult = transaction(database) { - select { valueColumn.eq(v) }.let { - it.count() to it.paginate(pagination, keyColumn, reversed).map { it[keyColumn] } - } - }.let { (count, list) -> - list.createPaginationResult( - pagination, - count - ) - } - - override suspend fun contains(k: Key): Boolean = transaction(database) { - select { keyColumn.eq(k) }.limit(1).any() - } - - override suspend fun contains(k: Key, v: Value): Boolean = transaction(database) { - select { keyColumn.eq(k).and(valueColumn.eq(v)) }.limit(1).any() - } } From 8055003b479d73a2bd9e564092d50a405569be11 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 11 Oct 2022 12:58:29 +0600 Subject: [PATCH 4/5] deprecations removing --- CHANGELOG.md | 2 + .../ktor/client/FlowsWebsockets.kt | 82 ------ .../ktor/client/StandardHttpClientGetPost.kt | 260 ------------------ .../micro_utils/ktor/server/FlowsWebsocket.kt | 61 ---- .../ktor/server/ServerRoutingShortcuts.kt | 197 ------------- .../pagination/PaginationResult.kt | 12 - 6 files changed, 2 insertions(+), 612 deletions(-) delete mode 100644 ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt delete mode 100644 ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt delete mode 100644 ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index e302bb016a7..0bfa204b4c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## 0.13.0 +**ALL DEPRECATIONS HAVE BEEN REMOVED** + * `Repos`: * `Exposed`: * `AbstractExposedWriteCRUDRepo` got two new methods: `update` with `it` as `UpdateBuilder` and `createAndInsertId` 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 deleted file mode 100644 index c2d9dc3b8c6..00000000000 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt +++ /dev/null @@ -1,82 +0,0 @@ -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.WebSockets -import io.ktor.client.plugins.websocket.ws -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 - */ -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -inline fun HttpClient.createStandardWebsocketFlow( - url: String, - crossinline checkReconnection: suspend (Throwable?) -> Boolean = { true }, - noinline requestBuilder: HttpRequestBuilder.() -> Unit = {}, - crossinline conversation: suspend (StandardKtorSerialInputData) -> T -): 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) { - when (received) { - is Frame.Binary -> send(conversation(received.data)) - else -> { - close() - return@ws - } - } - } - } - checkReconnection(null) - }.getOrElse { e -> - checkReconnection(e).also { - if (!it) { - close(e) - } - } - } - } while (reconnect && isActive) - - if (isActive) { - safely { - close() - } - } - } -} - -/** - * @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 - */ -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -inline fun HttpClient.createStandardWebsocketFlow( - url: String, - deserializer: DeserializationStrategy, - crossinline checkReconnection: suspend (Throwable?) -> Boolean = { true }, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - noinline requestBuilder: HttpRequestBuilder.() -> Unit = {}, -) = createStandardWebsocketFlow( - url, - checkReconnection, - requestBuilder -) { - serialFormat.decodeDefault(deserializer, it) -} 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 deleted file mode 100644 index f9c327ec27e..00000000000 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt +++ /dev/null @@ -1,260 +0,0 @@ -package dev.inmo.micro_utils.ktor.client - -import dev.inmo.micro_utils.common.MPPFile -import dev.inmo.micro_utils.common.filename -import dev.inmo.micro_utils.ktor.common.* -import io.ktor.client.HttpClient -import io.ktor.client.call.body -import io.ktor.client.request.* -import io.ktor.client.request.forms.* -import io.ktor.client.statement.readBytes -import io.ktor.http.* -import io.ktor.utils.io.core.ByteReadPacket -import kotlinx.serialization.* - -@Deprecated("This class will be removed soon. It is now recommended to use built-in ktor features instead") -class UnifiedRequester( - val client: HttpClient = HttpClient(), - val serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -) { - suspend fun uniget( - url: String, - resultDeserializer: DeserializationStrategy - ): ResultType = client.uniget(url, resultDeserializer, serialFormat) - - fun encodeUrlQueryValue( - serializationStrategy: SerializationStrategy, - value: T - ) = serializationStrategy.encodeUrlQueryValue( - value, - serialFormat - ) - - suspend fun unipost( - url: String, - bodyInfo: Pair, BodyType>, - resultDeserializer: DeserializationStrategy - ) = client.unipost(url, bodyInfo, resultDeserializer, serialFormat) - - suspend fun unimultipart( - url: String, - filename: String, - inputProvider: InputProvider, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - ): ResultType = client.unimultipart(url, filename, inputProvider, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat) - - suspend fun unimultipart( - url: String, - filename: String, - inputProvider: InputProvider, - otherData: Pair, BodyType>, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - ): ResultType = client.unimultipart(url, filename, otherData, inputProvider, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat) - - suspend fun unimultipart( - url: String, - mppFile: MPPFile, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {} - ): ResultType = client.unimultipart( - url, mppFile, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat - ) - - suspend fun unimultipart( - url: String, - mppFile: MPPFile, - otherData: Pair, BodyType>, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {} - ): ResultType = client.unimultipart( - url, mppFile, otherData, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat - ) - - fun createStandardWebsocketFlow( - url: String, - checkReconnection: suspend (Throwable?) -> Boolean, - deserializer: DeserializationStrategy, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - ) = client.createStandardWebsocketFlow(url, deserializer, checkReconnection, serialFormat, requestBuilder) - - fun createStandardWebsocketFlow( - url: String, - deserializer: DeserializationStrategy, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - ) = createStandardWebsocketFlow(url, { true }, deserializer, requestBuilder) -} - -@Deprecated("This property will be removed soon. It is now recommended to use built-in ktor features instead") -val defaultRequester = UnifiedRequester() - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun HttpClient.uniget( - url: String, - resultDeserializer: DeserializationStrategy, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -) = get(url).let { - serialFormat.decodeDefault(resultDeserializer, it.body()) -} - - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -fun SerializationStrategy.encodeUrlQueryValue( - value: T, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -) = serialFormat.encodeHex( - this, - value -) - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun HttpClient.unipost( - url: String, - bodyInfo: Pair, BodyType>, - resultDeserializer: DeserializationStrategy, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -) = post(url) { - setBody( - serialFormat.encodeDefault(bodyInfo.first, bodyInfo.second) - ) -}.let { - serialFormat.decodeDefault(resultDeserializer, it.body()) -} - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun HttpClient.unimultipart( - url: String, - filename: String, - inputProvider: InputProvider, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -): ResultType = submitFormWithBinaryData( - url, - formData = formData { - append( - "bytes", - inputProvider, - Headers.build { - append(HttpHeaders.ContentType, mimetype) - append(HttpHeaders.ContentDisposition, "filename=\"$filename\"") - dataHeadersBuilder() - } - ) - additionalParametersBuilder() - } -) { - requestBuilder() -}.let { serialFormat.decodeDefault(resultDeserializer, it.body()) } - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun HttpClient.unimultipart( - url: String, - filename: String, - otherData: Pair, BodyType>, - inputProvider: InputProvider, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -): ResultType = unimultipart( - url, - filename, - inputProvider, - resultDeserializer, - mimetype, - additionalParametersBuilder = { - val serialized = serialFormat.encodeDefault(otherData.first, otherData.second) - append( - "data", - InputProvider(serialized.size.toLong()) { - ByteReadPacket(serialized) - }, - Headers.build { - append(HttpHeaders.ContentType, ContentType.Application.Cbor.contentType) - append(HttpHeaders.ContentDisposition, "filename=data.bytes") - dataHeadersBuilder() - } - ) - additionalParametersBuilder() - }, - dataHeadersBuilder, - requestBuilder, - serialFormat -) - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun HttpClient.unimultipart( - url: String, - mppFile: MPPFile, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -): ResultType = unimultipart( - url, - mppFile.filename.string, - mppFile.inputProvider(), - resultDeserializer, - mimetype, - additionalParametersBuilder, - dataHeadersBuilder, - requestBuilder, - serialFormat -) - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun HttpClient.unimultipart( - url: String, - mppFile: MPPFile, - otherData: Pair, BodyType>, - resultDeserializer: DeserializationStrategy, - mimetype: String = "*/*", - additionalParametersBuilder: FormBuilder.() -> Unit = {}, - dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, - requestBuilder: HttpRequestBuilder.() -> Unit = {}, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat -): ResultType = unimultipart( - url, - mppFile, - resultDeserializer, - mimetype, - additionalParametersBuilder = { - val serialized = serialFormat.encodeDefault(otherData.first, otherData.second) - append( - "data", - InputProvider(serialized.size.toLong()) { - ByteReadPacket(serialized) - }, - Headers.build { - append(HttpHeaders.ContentType, ContentType.Application.Cbor.contentType) - append(HttpHeaders.ContentDisposition, "filename=data.bytes") - dataHeadersBuilder() - } - ) - additionalParametersBuilder() - }, - dataHeadersBuilder, - requestBuilder, - serialFormat -) 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 deleted file mode 100644 index 3760e60ad4b..00000000000 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt +++ /dev/null @@ -1,61 +0,0 @@ -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 - -@Deprecated("This method will be removed soon") -fun Route.includeWebsocketHandling( - suburl: String, - flow: Flow, - protocol: URLProtocol? = null, - converter: suspend WebSocketServerSession.(T) -> StandardKtorSerialInputData? -) { - application.apply { - pluginOrNull(WebSockets) ?: install(WebSockets) - } - webSocket(suburl, protocol ?.name) { - safely { - flow.collect { - converter(it) ?.let { data -> - send(data) - } - } - } - } -} - -@Deprecated("This method will be removed soon") -fun Route.includeWebsocketHandling( - suburl: String, - flow: Flow, - serializer: SerializationStrategy, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - protocol: URLProtocol? = null, - filter: (suspend WebSocketServerSession.(T) -> Boolean)? = null -) = includeWebsocketHandling( - suburl, - flow, - protocol, - converter = if (filter == null) { - { - serialFormat.encodeDefault(serializer, it) - } - } else { - { - if (filter(it)) { - serialFormat.encodeDefault(serializer, it) - } else { - null - } - } - } -) 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 d44914c72dc..968a3607d11 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 @@ -19,106 +19,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.SerializationStrategy -@Deprecated("This class method will be removed soon. It is now recommended to use built-in ktor features instead") -class UnifiedRouter( - val serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - val serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) { - fun Route.includeWebsocketHandling( - suburl: String, - flow: Flow, - serializer: SerializationStrategy, - protocol: URLProtocol? = null, - filter: (suspend WebSocketServerSession.(T) -> Boolean)? = null - ) = includeWebsocketHandling(suburl, flow, serializer, serialFormat, protocol, filter) - - 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") - } - } - - companion object { - val default - get() = defaultUnifiedRouter - } -} - -val defaultUnifiedRouter = UnifiedRouter() - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun ApplicationCall.unianswer( - answerSerializer: SerializationStrategy, - answer: T -) { - respondBytes ( - standardKtorSerialFormat.encodeDefault(answerSerializer, answer), - standardKtorSerialFormatContentType - ) -} - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun ApplicationCall.uniload( - deserializer: DeserializationStrategy -) = safely { - standardKtorSerialFormat.decodeDefault( - deserializer, - receive() - ) -} - suspend fun ApplicationCall.uniloadMultipart( onFormItem: (PartData.FormItem) -> Unit = {}, onCustomFileItem: (PartData.FileItem) -> Unit = {}, @@ -146,82 +46,6 @@ suspend fun ApplicationCall.uniloadMultipart( resultInput ?: error("Bytes has not been received") } -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun ApplicationCall.uniloadMultipart( - deserializer: DeserializationStrategy, - onFormItem: (PartData.FormItem) -> Unit = {}, - onCustomFileItem: (PartData.FileItem) -> Unit = {}, - onBinaryChannelItem: (PartData.BinaryChannelItem) -> Unit = {}, - onBinaryContent: (PartData.BinaryItem) -> Unit = {} -): Pair { - var data: Optional? = null - val resultInput = uniloadMultipart( - onFormItem, - { - if (it.name == "data") { - data = standardKtorSerialFormat.decodeDefault(deserializer, it.provider().readBytes()).optional - } else { - onCustomFileItem(it) - } - }, - onBinaryChannelItem, - onBinaryContent - ) - - val completeData = data ?: error("Data has not been received") - return resultInput to (completeData.dataOrNull().let { it as T }) -} - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun ApplicationCall.uniloadMultipartFile( - deserializer: DeserializationStrategy, - onFormItem: (PartData.FormItem) -> Unit = {}, - onCustomFileItem: (PartData.FileItem) -> Unit = {}, - onBinaryChannelItem: (PartData.BinaryChannelItem) -> Unit = {}, - onBinaryContent: (PartData.BinaryItem) -> Unit = {}, -) = safely { - val multipartData = receiveMultipart() - - var resultInput: MPPFile? = null - var data: Optional? = null - - multipartData.forEachPart { - when (it) { - is PartData.FormItem -> onFormItem(it) - is PartData.FileItem -> { - when (it.name) { - "bytes" -> { - val name = FileName(it.originalFileName ?: error("File name is unknown for default part")) - resultInput = MPPFile.createTempFile( - name.nameWithoutExtension.let { - var resultName = it - while (resultName.length < 3) { - resultName += "_" - } - resultName - }, - ".${name.extension}" - ).apply { - outputStream().use { fileStream -> - it.streamProvider().use { - it.copyTo(fileStream) - } - } - } - } - "data" -> data = standardKtorSerialFormat.decodeDefault(deserializer, it.provider().readBytes()).optional - else -> onCustomFileItem(it) - } - } - is PartData.BinaryItem -> onBinaryContent(it) - is PartData.BinaryChannelItem -> onBinaryChannelItem(it) - } - } - - val completeData = data ?: error("Data has not been received") - (resultInput ?: error("Bytes has not been received")) to (completeData.dataOrNull().let { it as T }) -} - suspend fun ApplicationCall.uniloadMultipartFile( onFormItem: (PartData.FormItem) -> Unit = {}, onCustomFileItem: (PartData.FileItem) -> Unit = {}, @@ -285,24 +109,3 @@ suspend fun ApplicationCall.getQueryParameterOrSendError( respond(HttpStatusCode.BadRequest, "Request query parameters must contains $field") } } - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -fun ApplicationCall.decodeUrlQueryValue( - field: String, - deserializer: DeserializationStrategy -) = getQueryParameter(field) ?.let { - standardKtorSerialFormat.decodeHex( - deserializer, - it - ) -} - -@Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") -suspend fun ApplicationCall.decodeUrlQueryValueOrSendError( - field: String, - deserializer: DeserializationStrategy -) = decodeUrlQueryValue(field, deserializer).also { - if (it == null) { - respond(HttpStatusCode.BadRequest, "Request query parameters must contains $field") - } -} diff --git a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt index 3abd96bc9b5..9c88e91c53a 100644 --- a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt +++ b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt @@ -33,18 +33,6 @@ data class PaginationResult( results, (pagesNumber * size).toLong() ) - @Deprecated("Replace with The other order of incoming parameters or objectsCount parameter") - constructor( - page: Int, - pagesNumber: Int, - results: List, - size: Int - ) : this( - page, - results, - pagesNumber, - size - ) } fun emptyPaginationResult() = PaginationResult(0, 0, emptyList(), 0L) From bd33b09052fff89fbdc7684e271f22829a69fd25 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 11 Oct 2022 13:24:39 +0600 Subject: [PATCH 5/5] A LOT OF KTOR METHODS RELATED TO UnifierRouter/UnifiedRequester HAVE BEEN REMOVED --- CHANGELOG.md | 1 + .../micro_utils/ktor/client/TemporalUpload.kt | 8 -- .../TemporalFilesRoutingConfigurator.kt | 63 ++++----- .../server/crud/KtorReadStandardCrudRepo.kt | 83 ----------- .../ktor/server/crud/KtorStandardCrudRepo.kt | 39 ------ .../server/crud/KtorWriteStandardCrudRepo.kt | 107 --------------- .../key_value/KtorStandartKeyValueRepo.kt | 46 ------- .../key_value/KtorStandartReadKeyValueRepo.kt | 107 --------------- .../KtorStandartWriteKeyValueRepo.kt | 70 ---------- .../ConfigureOneToManyKeyValueRepoRoutes.kt | 35 ----- ...onfigureOneToManyReadKeyValueRepoRoutes.kt | 129 ------------------ ...nfigureOneToManyWriteKeyValueRepoRoutes.kt | 103 -------------- 12 files changed, 31 insertions(+), 760 deletions(-) delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadStandardCrudRepo.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorStandardCrudRepo.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorWriteStandardCrudRepo.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartKeyValueRepo.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyKeyValueRepoRoutes.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt delete mode 100644 repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bfa204b4c6..a223279e462 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 0.13.0 **ALL DEPRECATIONS HAVE BEEN REMOVED** +**A LOT OF KTOR METHODS RELATED TO UnifierRouter/UnifiedRequester HAVE BEEN REMOVED** * `Repos`: * `Exposed`: diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt index a00f85f904d..d09ddd3436c 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt @@ -9,11 +9,3 @@ expect suspend fun HttpClient.tempUpload( file: MPPFile, onUpload: (uploaded: Long, count: Long) -> Unit = { _, _ -> } ): TemporalFileId - -suspend fun UnifiedRequester.tempUpload( - fullTempUploadDraftPath: String, - file: MPPFile, - onUpload: (uploaded: Long, count: Long) -> Unit = { _, _ -> } -): TemporalFileId = client.tempUpload( - fullTempUploadDraftPath, file, onUpload -) diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt index 685e1607c9e..a017e87a7a2 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt @@ -26,7 +26,6 @@ import java.nio.file.attribute.FileTime class TemporalFilesRoutingConfigurator( private val subpath: String = DefaultTemporalFilesSubPath, - private val unifiedRouter: UnifiedRouter = UnifiedRouter.default, private val temporalFilesUtilizer: TemporalFilesUtilizer = TemporalFilesUtilizer ) : ApplicationRoutingConfigurator.Element { interface TemporalFilesUtilizer { @@ -80,42 +79,40 @@ class TemporalFilesRoutingConfigurator( override fun Route.invoke() { post(subpath) { - unifiedRouter.apply { - val multipart = call.receiveMultipart() + val multipart = call.receiveMultipart() - var fileInfo: Pair? = null - var part = multipart.readPart() + var fileInfo: Pair? = null + var part = multipart.readPart() - while (part != null) { - if (part is PartData.FileItem) { - break - } - part = multipart.readPart() + while (part != null) { + if (part is PartData.FileItem) { + break } - - part ?.let { - if (it is PartData.FileItem) { - val fileId = TemporalFileId(uuid4().toString()) - val fileName = it.originalFileName ?.let { FileName(it) } ?: return@let - fileInfo = fileId to File.createTempFile(fileId.string, ".${fileName.extension}").apply { - outputStream().use { outputStream -> - it.streamProvider().use { - it.copyTo(outputStream) - } - } - deleteOnExit() - } - } - } - - fileInfo ?.also { (fileId, file) -> - temporalFilesMutex.withLock { - temporalFilesMap[fileId] = file - } - call.respondText(fileId.string) - launchSafelyWithoutExceptions { filesFlow.emit(fileId) } - } ?: call.respond(HttpStatusCode.BadRequest) + part = multipart.readPart() } + + part ?.let { + if (it is PartData.FileItem) { + val fileId = TemporalFileId(uuid4().toString()) + val fileName = it.originalFileName ?.let { FileName(it) } ?: return@let + fileInfo = fileId to File.createTempFile(fileId.string, ".${fileName.extension}").apply { + outputStream().use { outputStream -> + it.streamProvider().use { + it.copyTo(outputStream) + } + } + deleteOnExit() + } + } + } + + fileInfo ?.also { (fileId, file) -> + temporalFilesMutex.withLock { + temporalFilesMap[fileId] = file + } + call.respondText(fileId.string) + launchSafelyWithoutExceptions { filesFlow.emit(fileId) } + } ?: call.respond(HttpStatusCode.BadRequest) } } 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 deleted file mode 100644 index cc0483a8ca1..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadStandardCrudRepo.kt +++ /dev/null @@ -1,83 +0,0 @@ -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.pagination.PaginationResult -import dev.inmo.micro_utils.pagination.extractPagination -import dev.inmo.micro_utils.repos.ReadCRUDRepo -import dev.inmo.micro_utils.repos.ktor.common.countRouting -import dev.inmo.micro_utils.repos.ktor.common.crud.* -import io.ktor.http.ContentType -import io.ktor.server.application.call -import io.ktor.server.routing.Route -import io.ktor.server.routing.get -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.serializer - -fun Route.configureReadCRUDRepoRoutes( - originalRepo: ReadCRUDRepo, - objectsSerializer: KSerializer, - objectsNullableSerializer: KSerializer, - idsSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - val paginationResultSerializer = PaginationResult.serializer(objectsSerializer) - - get(getByPaginationRouting) { - unifiedRouter.apply { - val pagination = call.request.queryParameters.extractPagination - - unianswer( - paginationResultSerializer, - originalRepo.getByPagination(pagination) - ) - } - } - - get(getByIdRouting) { - unifiedRouter.apply { - val id = decodeUrlQueryValueOrSendError( - "id", - idsSerializer - ) ?: return@get - - unianswer( - objectsNullableSerializer, - originalRepo.getById(id) - ) - } - } - - get(containsRouting) { - unifiedRouter.apply { - val id = decodeUrlQueryValueOrSendError( - "id", - idsSerializer - ) ?: return@get - - unianswer( - Boolean.serializer(), - originalRepo.contains(id) - ) - } - } - - get(countRouting) { - unifiedRouter.apply { - unianswer( - Long.serializer(), - originalRepo.count() - ) - } - } -} - -inline fun Route.configureReadCRUDRepoRoutes( - originalRepo: ReadCRUDRepo, - objectsSerializer: KSerializer, - objectsNullableSerializer: KSerializer, - idsSerializer: KSerializer, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) = configureReadCRUDRepoRoutes(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 deleted file mode 100644 index 112659afa68..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorStandardCrudRepo.kt +++ /dev/null @@ -1,39 +0,0 @@ -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.CRUDRepo -import io.ktor.http.ContentType -import io.ktor.server.routing.Route -import io.ktor.server.routing.route -import kotlinx.serialization.KSerializer - -fun Route.configureCRUDRepoRoutes( - baseSubpart: String, - originalRepo: CRUDRepo, - objectsSerializer: KSerializer, - objectsNullableSerializer: KSerializer, - inputsSerializer: KSerializer, - idsSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - route(baseSubpart) { - configureReadCRUDRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, idsSerializer, unifiedRouter) - configureWriteCRUDRepoRoutes(originalRepo, objectsSerializer, objectsNullableSerializer, inputsSerializer, idsSerializer, unifiedRouter) - } -} - -fun Route.configureCRUDRepoRoutes( - baseSubpart: String, - originalRepo: CRUDRepo, - objectsSerializer: KSerializer, - objectsNullableSerializer: KSerializer, - inputsSerializer: KSerializer, - idsSerializer: KSerializer, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) = configureCRUDRepoRoutes( - 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 deleted file mode 100644 index 5fa586a6a4a..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorWriteStandardCrudRepo.kt +++ /dev/null @@ -1,107 +0,0 @@ -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.WriteCRUDRepo -import dev.inmo.micro_utils.repos.ktor.common.crud.* -import io.ktor.http.ContentType -import io.ktor.server.routing.Route -import io.ktor.server.routing.post -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.* - -fun Route.configureWriteCRUDRepoRoutes( - originalRepo: WriteCRUDRepo, - objectsSerializer: KSerializer, - objectsNullableSerializer: KSerializer, - inputsSerializer: KSerializer, - idsSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - val listObjectsSerializer = ListSerializer(objectsSerializer) - val listInputSerializer = ListSerializer(inputsSerializer) - val listIdsSerializer = ListSerializer(idsSerializer) - val inputUpdateSerializer = PairSerializer( - idsSerializer, - inputsSerializer - ) - val listInputUpdateSerializer = ListSerializer(inputUpdateSerializer) - - unifiedRouter.apply { - includeWebsocketHandling( - newObjectsFlowRouting, - originalRepo.newObjectsFlow, - objectsSerializer - ) - includeWebsocketHandling( - updatedObjectsFlowRouting, - originalRepo.updatedObjectsFlow, - objectsSerializer - ) - includeWebsocketHandling( - deletedObjectsIdsFlowRouting, - originalRepo.deletedObjectsIdsFlow, - idsSerializer - ) - } - - post(createRouting) { - unifiedRouter.apply { - unianswer( - listObjectsSerializer, - originalRepo.create( - uniload(listInputSerializer) - ) - ) - } - } - - post(updateRouting) { - unifiedRouter.apply { - val (id, input) = uniload(inputUpdateSerializer) - unianswer( - objectsNullableSerializer, - originalRepo.update( - id, input - ) - ) - } - } - - post(updateManyRouting) { - unifiedRouter.apply { - val updates = uniload(listInputUpdateSerializer) - unianswer( - listObjectsSerializer, - originalRepo.update( - updates - ) - ) - } - } - - post(deleteByIdRouting) { - unifiedRouter.apply { - val ids = uniload(listIdsSerializer) - unianswer( - Unit.serializer(), - originalRepo.deleteById( - ids - ) - ) - } - } -} - -fun Route.configureWriteCRUDRepoRoutes( - originalRepo: WriteCRUDRepo, - objectsSerializer: KSerializer, - objectsNullableSerializer: KSerializer, - inputsSerializer: KSerializer, - idsSerializer: KSerializer, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) = configureWriteCRUDRepoRoutes( - 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 deleted file mode 100644 index bf332f72e29..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartKeyValueRepo.kt +++ /dev/null @@ -1,46 +0,0 @@ -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.KeyValueRepo -import io.ktor.http.ContentType -import io.ktor.server.routing.Route -import io.ktor.server.routing.route -import kotlinx.serialization.KSerializer - -fun Route.configureKeyValueRepoRoutes( - baseSubpart: String, - originalRepo: KeyValueRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - valueNullableSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - route(baseSubpart) { - configureReadStandartKeyValueRepoRoutes( - originalRepo, - keySerializer, - valueSerializer, - valueNullableSerializer, - unifiedRouter - ) - configureWriteKeyValueRepoRoutes( - originalRepo, - keySerializer, - valueSerializer, - unifiedRouter - ) - } -} - -fun Route.configureStandartKeyValueRepoRoutes( - baseSubpart: String, - originalRepo: KeyValueRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - valueNullableSerializer: KSerializer, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) = configureKeyValueRepoRoutes(baseSubpart, 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/KtorStandartReadKeyValueRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt deleted file mode 100644 index 59b54d9b00a..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt +++ /dev/null @@ -1,107 +0,0 @@ -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 -import dev.inmo.micro_utils.repos.ReadKeyValueRepo -import dev.inmo.micro_utils.repos.ktor.common.* -import dev.inmo.micro_utils.repos.ktor.common.containsRoute -import dev.inmo.micro_utils.repos.ktor.common.countRoute -import dev.inmo.micro_utils.repos.ktor.common.key_value.* -import dev.inmo.micro_utils.repos.ktor.common.key_value.keyParameterName -import dev.inmo.micro_utils.repos.ktor.common.key_value.reversedParameterName -import io.ktor.http.ContentType -import io.ktor.server.application.call -import io.ktor.server.routing.Route -import io.ktor.server.routing.get -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.serializer - -fun Route.configureReadStandartKeyValueRepoRoutes ( - originalRepo: ReadKeyValueRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - valueNullableSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - get(getRoute) { - unifiedRouter.apply { - val key = decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - - unianswer( - valueNullableSerializer, - originalRepo.get(key) - ) - } - } - - get(valuesRoute) { - unifiedRouter.apply { - val parination = call.request.queryParameters.extractPagination; - val reversed = decodeUrlQueryValueOrSendError( - reversedParameterName, - Boolean.serializer() - ) ?: return@get - - unianswer( - PaginationResult.serializer(valueSerializer), - originalRepo.values(parination, reversed) - ) - } - } - - get(keysRoute) { - unifiedRouter.apply { - val parination = call.request.queryParameters.extractPagination; - val reversed = decodeUrlQueryValueOrSendError( - reversedParameterName, - Boolean.serializer() - ) ?: return@get - val value = decodeUrlQueryValue(valueParameterName, valueSerializer) - - unianswer( - PaginationResult.serializer(keySerializer), - value?.let { originalRepo.keys(value, parination, reversed) } ?: originalRepo.keys(parination, reversed) - ) - } - } - - get(containsRoute) { - unifiedRouter.apply { - val key = decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - - unianswer( - Boolean.serializer(), - originalRepo.contains(key) - ) - } - } - - get(countRoute) { - unifiedRouter.apply { - unianswer( - Long.serializer(), - originalRepo.count() - ) - } - } -} - -inline fun Route.configureReadStandartKeyValueRepoRoutes ( - originalRepo: ReadKeyValueRepo, - 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 deleted file mode 100644 index 0313368b2e3..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt +++ /dev/null @@ -1,70 +0,0 @@ -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.WriteKeyValueRepo -import dev.inmo.micro_utils.repos.ktor.common.key_value.* -import io.ktor.http.ContentType -import io.ktor.server.routing.Route -import io.ktor.server.routing.post -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.* - -fun Route.configureWriteKeyValueRepoRoutes ( - originalRepo: WriteKeyValueRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - val keyValueMapSerializer = MapSerializer(keySerializer, valueSerializer) - val keysListSerializer = ListSerializer(keySerializer) - val valuesListSerializer = ListSerializer(valueSerializer) - 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)) - } - } - - post(unsetWithValuesRoute) { - unifiedRouter.apply { - val toUnset = uniload(valuesListSerializer) - - unianswer(Unit.serializer(), originalRepo.unsetWithValues(toUnset)) - } - } -} - -fun Route.configureWriteStandartKeyValueRepoRoutes ( - originalRepo: WriteKeyValueRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) = configureWriteKeyValueRepoRoutes(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 deleted file mode 100644 index 9b68c0ac04f..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyKeyValueRepoRoutes.kt +++ /dev/null @@ -1,35 +0,0 @@ -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.KeyValuesRepo -import io.ktor.http.ContentType -import io.ktor.server.routing.Route -import io.ktor.server.routing.route -import kotlinx.serialization.KSerializer - -fun Route.configureOneToManyKeyValueRepoRoutes( - baseSubpart: String, - originalRepo: KeyValuesRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - route(baseSubpart) { - configureOneToManyReadKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, unifiedRouter) - configureOneToManyWriteKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, unifiedRouter) - } -} - -fun Route.configureOneToManyKeyValueRepoRoutes( - baseSubpart: String, - originalRepo: KeyValuesRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) = configureOneToManyKeyValueRepoRoutes( - baseSubpart, 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/ConfigureOneToManyReadKeyValueRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt deleted file mode 100644 index 41a035c4730..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt +++ /dev/null @@ -1,129 +0,0 @@ -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 -import dev.inmo.micro_utils.repos.ReadKeyValuesRepo -import dev.inmo.micro_utils.repos.ktor.common.keyParameterName -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.http.ContentType -import io.ktor.server.application.call -import io.ktor.server.routing.Route -import io.ktor.server.routing.get -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.serializer - -fun Route.configureOneToManyReadKeyValueRepoRoutes( - originalRepo: ReadKeyValuesRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - val paginationKeyResult = PaginationResult.serializer(keySerializer) - val paginationValueResult = PaginationResult.serializer(valueSerializer) - - get(getRoute) { - unifiedRouter.apply { - val pagination = call.request.queryParameters.extractPagination - val key = decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - val reversed = decodeUrlQueryValue( - reversedParameterName, - Boolean.serializer() - ) ?: false - - unianswer( - paginationValueResult, - originalRepo.get(key, pagination, reversed) - ) - } - } - - get(keysRoute) { - unifiedRouter.apply { - val pagination = call.request.queryParameters.extractPagination - val reversed = decodeUrlQueryValue( - reversedParameterName, - Boolean.serializer() - ) ?: false - val value: Value? = decodeUrlQueryValue( - valueParameterName, - valueSerializer - ) - - unianswer( - paginationKeyResult, - value?.let { originalRepo.keys(value, pagination, reversed) } ?: originalRepo.keys(pagination, reversed) - ) - } - } - - get(containsByKeyRoute) { - unifiedRouter.apply { - val key = decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - - unianswer( - Boolean.serializer(), - originalRepo.contains(key) - ) - } - } - - get(containsByKeyValueRoute) { - unifiedRouter.apply { - val key = decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - val value = decodeUrlQueryValueOrSendError( - valueParameterName, - valueSerializer - ) ?: return@get - - unianswer( - Boolean.serializer(), - originalRepo.contains(key, value) - ) - } - } - - get(countByKeyRoute) { - unifiedRouter.apply { - val key = decodeUrlQueryValueOrSendError( - keyParameterName, - keySerializer - ) ?: return@get - - unianswer( - Long.serializer(), - originalRepo.count(key) - ) - } - } - - get(countRoute) { - unifiedRouter.apply { - unianswer( - Long.serializer(), - originalRepo.count() - ) - } - } -} - -inline fun Route.configureOneToManyReadKeyValueRepoRoutes( - originalRepo: ReadKeyValuesRepo, - 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 deleted file mode 100644 index 301350b64c4..00000000000 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt +++ /dev/null @@ -1,103 +0,0 @@ -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.WriteKeyValuesRepo -import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* -import io.ktor.http.ContentType -import io.ktor.server.routing.Route -import io.ktor.server.routing.post -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.* - -fun Route.configureOneToManyWriteKeyValueRepoRoutes( - originalRepo: WriteKeyValuesRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - unifiedRouter: UnifiedRouter -) { - val keyValueSerializer = PairSerializer(keySerializer, valueSerializer) - val keyValueMapSerializer = MapSerializer(keySerializer, ListSerializer(valueSerializer)) - - unifiedRouter.apply { - includeWebsocketHandling( - onNewValueRoute, - originalRepo.onNewValue, - keyValueSerializer - ) - includeWebsocketHandling( - onValueRemovedRoute, - originalRepo.onValueRemoved, - keyValueSerializer - ) - includeWebsocketHandling( - onDataClearedRoute, - originalRepo.onDataCleared, - keySerializer - ) - } - - post(addRoute) { - unifiedRouter.apply { - val obj = uniload(keyValueMapSerializer) - - unianswer( - Unit.serializer(), - originalRepo.add(obj) - ) - } - } - - post(removeRoute) { - unifiedRouter.apply { - val obj = uniload(keyValueMapSerializer) - - unianswer( - Unit.serializer(), - originalRepo.remove(obj), - ) - } - } - - post(clearRoute) { - unifiedRouter.apply { - val key = uniload(keySerializer) - - unianswer( - Unit.serializer(), - originalRepo.clear(key), - ) - } - } - - post(clearWithValueRoute) { - unifiedRouter.apply { - val v = uniload(valueSerializer) - - unianswer( - Unit.serializer(), - originalRepo.clearWithValue(v), - ) - } - } - - post(setRoute) { - unifiedRouter.apply { - val obj = uniload(keyValueMapSerializer) - - unianswer( - Unit.serializer(), - originalRepo.set(obj) - ) - } - } -} - -fun Route.configureOneToManyWriteKeyValueRepoRoutes( - originalRepo: WriteKeyValuesRepo, - keySerializer: KSerializer, - valueSerializer: KSerializer, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, - serialFormatContentType: ContentType = standardKtorSerialFormatContentType -) = configureOneToManyWriteKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType))