diff --git a/CHANGELOG.md b/CHANGELOG.md index d17a93eb1ff..285b42aeb6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.4.2 +* `Repos`: + * Add `WriteOneToManyKeyValueRepo#set` function and extensions + ## 0.4.1 * `Repos`: diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/OneToManyKeyValueMappers.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/OneToManyKeyValueMappers.kt index 228b52134cc..dd777d15088 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/OneToManyKeyValueMappers.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/OneToManyKeyValueMappers.kt @@ -107,6 +107,12 @@ open class MapperWriteOneToManyKeyValueRepo( }.toMap() ) + override suspend fun set(toSet: Map>) { + to.set( + toSet.map { (k, vs) -> k.toOutKey() to vs.map { v -> v.toOutValue() } }.toMap() + ) + } + override suspend fun clear(k: FromKey) = to.clear(k.toOutKey()) } diff --git a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/onetomany/OneToManyAndroidRepo.kt b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/onetomany/OneToManyAndroidRepo.kt index 48afbe42a8f..ffd6c20a45e 100644 --- a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/onetomany/OneToManyAndroidRepo.kt +++ b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/onetomany/OneToManyAndroidRepo.kt @@ -87,6 +87,29 @@ class OneToManyAndroidRepo( } } + override suspend fun set(toSet: Map>) { + val (clearedKeys, inserted) = helper.writableTransaction { + toSet.mapNotNull { (k, _) -> + if (delete(tableName, "$idColumnName=?", arrayOf(k.asId())) > 0) { + k + } else { + null + } + } to toSet.flatMap { (k, values) -> + values.map { v -> + insert( + tableName, + null, + contentValuesOf(idColumnName to k.asId(), valueColumnName to v.asValue()) + ) + k to v + } + } + } + clearedKeys.forEach { _onDataCleared.emit(it) } + inserted.forEach { newPair -> _onNewValue.emit(newPair) } + } + override suspend fun contains(k: Key): Boolean = helper.readableTransaction { select(tableName, selection = "$idColumnName=?", selectionArgs = arrayOf(k.asId()), limit = FirstPagePagination(1).limitClause()).use { it.count > 0 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 a231918430f..0da3137ff1f 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 @@ -42,12 +42,12 @@ class KtorWriteOneToManyKeyValueRepo ( override suspend fun add(toAdd: Map>) = client.unipost( buildStandardUrl( baseUrl, - clearRoute, + addRoute, ), BodyPair(keyValueMapSerializer, toAdd), Unit.serializer(), ) - override suspend fun clear(k: Key) = client.unipost( + override suspend fun clear(k: Key) = client.unipost( buildStandardUrl( baseUrl, clearRoute, @@ -55,4 +55,13 @@ class KtorWriteOneToManyKeyValueRepo ( BodyPair(keySerializer, k), Unit.serializer(), ) + + override suspend fun set(toSet: Map>) = client.unipost( + buildStandardUrl( + baseUrl, + setRoute, + ), + BodyPair(keyValueMapSerializer, toSet), + Unit.serializer(), + ) } \ No newline at end of file diff --git a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyRoutes.kt b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyRoutes.kt index 637edd9bda1..c1a2df1eac1 100644 --- a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyRoutes.kt +++ b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyRoutes.kt @@ -13,4 +13,5 @@ const val onDataClearedRoute = "onDataCleared" const val addRoute = "add" const val removeRoute = "remove" -const val clearRoute = "clear" \ No newline at end of file +const val clearRoute = "clear" +const val setRoute = "set" \ 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/ConfigureOneToManyWriteKeyValueRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt index fec8fa9d416..aeb8656a1eb 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 @@ -61,4 +61,13 @@ fun Route.configureOneToManyWriteKeyValueRepoRoutes( originalRepo.clear(key), ) } + + post(setRoute) { + val obj = call.uniload(keyValueMapSerializer) + + call.unianswer( + Unit.serializer(), + originalRepo.set(obj) + ) + } } \ No newline at end of file