diff --git a/utils/repos/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/client/KtorOneToManyKeyValueRepo.kt b/utils/repos/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/client/KtorOneToManyKeyValueRepo.kt new file mode 100644 index 00000000..bd0bc8dc --- /dev/null +++ b/utils/repos/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/client/KtorOneToManyKeyValueRepo.kt @@ -0,0 +1,109 @@ +package com.insanusmokrassar.postssystem.utils.repos.ktor.client + +import com.insanusmokrassar.postssystem.ktor.asUrlQueryParts +import com.insanusmokrassar.postssystem.ktor.buildStandardUrl +import com.insanusmokrassar.postssystem.ktor.client.uniget +import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat +import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination +import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult +import com.insanusmokrassar.postssystem.utils.repos.OneToManyReadKeyValueRepo +import com.insanusmokrassar.postssystem.utils.repos.OneToManyWriteKeyValueRepo +import com.insanusmokrassar.postssystem.utils.repos.ktor.common.* +import io.ktor.client.* +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.encodeToHexString + +class KtorOneToManyReadKeyValueRepo ( + private val baseUrl: String, + private val client: HttpClient = HttpClient(), + private val keySerializer: KSerializer, + private val valueSerializer: KSerializer, +) : OneToManyReadKeyValueRepo { + private val paginationValueResultSerializer = PaginationResult.serializer(valueSerializer) + private val paginationKeyResultSerializer = PaginationResult.serializer(keySerializer) + + override suspend fun get(k: Key, pagination: Pagination, reversed: Boolean): PaginationResult = client.uniget( + buildStandardUrl( + baseUrl, + getRoute, + mapOf( + keyParameterName to standardKtorSerialFormat.encodeToHexString(keySerializer, k), + reversedParameterName to standardKtorSerialFormat.encodeToHexString(reversed) + ) + pagination.asUrlQueryParts + ), + paginationValueResultSerializer + ) + + override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult = client.uniget( + buildStandardUrl( + baseUrl, + keysRoute, + mapOf( + reversedParameterName to standardKtorSerialFormat.encodeToHexString(reversed) + ) + pagination.asUrlQueryParts + ), + paginationKeyResultSerializer + ) + + override suspend fun contains(k: Key): Boolean = client.uniget( + buildStandardUrl( + baseUrl, + containsByKeyRoute, + mapOf(keyParameterName to standardKtorSerialFormat.encodeToHexString(keySerializer, k)) + ), + Boolean.serializer() + ) + + override suspend fun contains(k: Key, v: Value): Boolean = client.uniget( + buildStandardUrl( + baseUrl, + containsByKeyValueRoute, + mapOf( + keyParameterName to standardKtorSerialFormat.encodeToHexString(keySerializer, k), + valueParameterName to standardKtorSerialFormat.encodeToHexString(valueSerializer, v), + ) + ), + Boolean.serializer() + ) + + override suspend fun count(k: Key): Long = client.uniget( + buildStandardUrl( + baseUrl, + countByKeyRoute, + mapOf( + keyParameterName to standardKtorSerialFormat.encodeToHexString(keySerializer, k) + ) + ), + Long.serializer() + ) + + override suspend fun count(): Long = client.uniget( + buildStandardUrl( + baseUrl, + countRoute, + ), + Long.serializer() + ) + +} + +class KtorOneToManyWriteKeyValueRepo ( + private val baseUrl: String, + private val client: HttpClient = HttpClient(), +) : OneToManyWriteKeyValueRepo { + override suspend fun add(k: Key, v: Value) { + TODO("Not yet implemented") + } + + override suspend fun remove(k: Key, v: Value) { + TODO("Not yet implemented") + } + + override suspend fun clear(k: Key) { + TODO("Not yet implemented") + } +} + +class KtorOneToManyKeyValueRepo { +} \ No newline at end of file diff --git a/utils/repos/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/common/OneToManyParametersNames.kt b/utils/repos/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/common/OneToManyParametersNames.kt new file mode 100644 index 00000000..359527a2 --- /dev/null +++ b/utils/repos/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/common/OneToManyParametersNames.kt @@ -0,0 +1,5 @@ +package com.insanusmokrassar.postssystem.utils.repos.ktor.common + +const val keyParameterName = "key" +const val valueParameterName = "value" +const val reversedParameterName = "reversed" \ No newline at end of file diff --git a/utils/repos/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/common/OneToManyRoutes.kt b/utils/repos/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/common/OneToManyRoutes.kt new file mode 100644 index 00000000..2a89cbd5 --- /dev/null +++ b/utils/repos/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/common/OneToManyRoutes.kt @@ -0,0 +1,8 @@ +package com.insanusmokrassar.postssystem.utils.repos.ktor.common + +const val getRoute = "get" +const val keysRoute = "keys" +const val containsByKeyRoute = "containsByKey" +const val containsByKeyValueRoute = "containsByKeyValue" +const val countByKeyRoute = "countByKey" +const val countRoute = "count" \ No newline at end of file