diff --git a/CHANGELOG.md b/CHANGELOG.md index 35e892b5919..40daf6a7323 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ * `Versions`: * `Klock`: `2.0.0` -> `2.0.1` +* `Repo` + * Repo `WriteStandardKeyValueRepo` got new method `unsetWithValues` ## 0.4.9 diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt index a9ae6adfd1c..e5df9592765 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt @@ -1,7 +1,6 @@ package dev.inmo.micro_utils.repos -import dev.inmo.micro_utils.pagination.Pagination -import dev.inmo.micro_utils.pagination.PaginationResult +import dev.inmo.micro_utils.pagination.* import kotlinx.coroutines.flow.Flow interface ReadStandardKeyValueRepo : Repo { @@ -20,6 +19,7 @@ interface WriteStandardKeyValueRepo : Repo { suspend fun set(toSet: Map) suspend fun unset(toUnset: List) + suspend fun unsetWithValues(toUnset: List) } typealias WriteKeyValueRepo = WriteStandardKeyValueRepo @@ -35,5 +35,13 @@ suspend inline fun WriteStandardKeyValueRepo.unset( vararg k: Key ) = unset(k.toList()) -interface StandardKeyValueRepo : ReadStandardKeyValueRepo, WriteStandardKeyValueRepo +interface StandardKeyValueRepo : ReadStandardKeyValueRepo, WriteStandardKeyValueRepo { + override suspend fun unsetWithValues(toUnset: List) = toUnset.forEach { v -> + doWithPagination { + keys(v, it).also { + unset(it.results) + } + } + } +} typealias KeyValueRepo = StandardKeyValueRepo diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt index b11e3799762..ed67d4c9e4e 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt @@ -105,6 +105,10 @@ open class MapperWriteStandardKeyValueRepo( k.toOutKey() } ) + + override suspend fun unsetWithValues(toUnset: List) = to.unsetWithValues( + toUnset.map { it.toOutValue() } + ) } @Suppress("NOTHING_TO_INLINE") diff --git a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt index 03202399b0a..dd8d2c77241 100644 --- a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt +++ b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt @@ -35,10 +35,10 @@ class KeyValueStore internal constructor ( } private val onNewValueChannel = MutableSharedFlow>() - private val onValueRemovedChannel = MutableSharedFlow() + private val _onValueRemovedFlow = MutableSharedFlow() override val onNewValue: Flow> = onNewValueChannel.asSharedFlow() - override val onValueRemoved: Flow = onValueRemovedChannel.asSharedFlow() + override val onValueRemoved: Flow = _onValueRemovedFlow.asSharedFlow() init { cachedData ?.let { @@ -136,6 +136,18 @@ class KeyValueStore internal constructor ( sharedPreferences.edit { toUnset.forEach { remove(it) } } - toUnset.forEach { onValueRemovedChannel.emit(it) } + toUnset.forEach { _onValueRemovedFlow.emit(it) } + } + + override suspend fun unsetWithValues(toUnset: List) { + val keysToRemove = sharedPreferences.all.mapNotNull { if (it.value in toUnset) it.key else null } + sharedPreferences.edit { + keysToRemove.map { + remove(it) + } + } + keysToRemove.forEach { + _onValueRemovedFlow.emit(it) + } } } diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedKeyValueRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedKeyValueRepo.kt index 5dc80a3aa13..74a2bef1c9d 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedKeyValueRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedKeyValueRepo.kt @@ -60,4 +60,16 @@ open class ExposedKeyValueRepo( _onValueRemoved.emit(it) } } + + override suspend fun unsetWithValues(toUnset: List) { + transaction(database) { + toUnset.flatMap { + val keys = select { valueColumn.eq(it) }.mapNotNull { it[keyColumn] } + deleteWhere { keyColumn.inList(keys) } + keys + } + }.distinct().forEach { + _onValueRemoved.emit(it) + } + } } diff --git a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt index 6269c29678a..79c58e1c83d 100644 --- a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt +++ b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt @@ -76,6 +76,15 @@ class WriteMapKeyValueRepo( map.remove(k) ?.also { _ -> _onValueRemoved.emit(k) } } } + + override suspend fun unsetWithValues(toUnset: List) { + map.forEach { + if (it.value in toUnset) { + map.remove(it.key) + _onValueRemoved.emit(it.key) + } + } + } } class MapKeyValueRepo( diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt index 4d720ee170a..a7c1e898efb 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorWriteStandardKeyValueRepo.kt @@ -17,6 +17,7 @@ class KtorWriteStandardKeyValueRepo ( ) : WriteStandardKeyValueRepo { private val keyValueMapSerializer = MapSerializer(keySerializer, valueSerializer) private val keysListSerializer = ListSerializer(keySerializer) + private val valuesListSerializer = ListSerializer(valueSerializer) constructor( baseUrl: String, @@ -55,4 +56,13 @@ class KtorWriteStandardKeyValueRepo ( BodyPair(keysListSerializer, toUnset), Unit.serializer() ) + + override suspend fun unsetWithValues(toUnset: List) = unifiedRequester.unipost( + buildStandardUrl( + baseUrl, + unsetWithValuesRoute, + ), + BodyPair(valuesListSerializer, toUnset), + Unit.serializer() + ) } diff --git a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/key_value/KeyValueRoutes.kt b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/key_value/KeyValueRoutes.kt index 77b32a459ad..860429cf28c 100644 --- a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/key_value/KeyValueRoutes.kt +++ b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/key_value/KeyValueRoutes.kt @@ -9,4 +9,5 @@ const val countRoute = "count" const val onNewValueRoute = "onNewValue" const val onValueRemovedRoute = "onValueRemoved" const val setRoute = "set" -const val unsetRoute = "unset" \ No newline at end of file +const val unsetRoute = "unset" +const val unsetWithValuesRoute = "unsetWithValues" \ No newline at end of file diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt index ae288adc189..56b6e18f413 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartWriteKeyValueRepo.kt @@ -19,6 +19,7 @@ fun Route.configureWriteStandardKeyValueRepoRoutes ( ) { val keyValueMapSerializer = MapSerializer(keySerializer, valueSerializer) val keysListSerializer = ListSerializer(keySerializer) + val valuesListSerializer = ListSerializer(valueSerializer) unifiedRouter.apply { includeWebsocketHandling( onNewValueRoute, @@ -50,6 +51,14 @@ fun Route.configureWriteStandardKeyValueRepoRoutes ( unianswer(Unit.serializer(), originalRepo.unset(toUnset)) } } + + post(unsetWithValuesRoute) { + unifiedRouter.apply { + val toUnset = uniload(valuesListSerializer) + + unianswer(Unit.serializer(), originalRepo.unsetWithValues(toUnset)) + } + } } fun Route.configureWriteStandartKeyValueRepoRoutes (