diff --git a/utils/repos/ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/server/KtorOneToManyKeyValueRepo.kt b/utils/repos/ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/server/KtorOneToManyKeyValueRepo.kt new file mode 100644 index 00000000..9946861e --- /dev/null +++ b/utils/repos/ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/server/KtorOneToManyKeyValueRepo.kt @@ -0,0 +1,101 @@ +package com.insanusmokrassar.postssystem.utils.repos.ktor.server + +import com.insanusmokrassar.postssystem.ktor.server.extractPagination +import com.insanusmokrassar.postssystem.ktor.server.getQueryParameterOrSendError +import com.insanusmokrassar.postssystem.ktor.server.unianswer +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.ktor.common.* +import io.ktor.application.* +import io.ktor.routing.* +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.decodeFromHexString + +fun Route.configureOneToManyReadKeyValueRepoRoutes( + originalRepo: OneToManyReadKeyValueRepo, + keySerializer: KSerializer, + valueSealizer: KSerializer, +) { + val paginationKeyResult = PaginationResult.serializer(keySerializer) + val paginationValueResult = PaginationResult.serializer(valueSealizer) + + get(getRoute) { + val pagination = call.request.queryParameters.extractPagination + val key = standardKtorSerialFormat.decodeFromHexString( + keySerializer, + call.getQueryParameterOrSendError(keyParameterName) ?: return@get + ) // TODO: Леша, а это можно сократить как-то до call.decodeFromQueryHexParameter(keySerializer, keyParameterName)? + val reversed = standardKtorSerialFormat.decodeFromHexString( + Boolean.serializer(), + call.getQueryParameterOrSendError(reversedParameterName) ?: return@get + ) + + call.unianswer( + paginationValueResult, + originalRepo.get(key, pagination, reversed) + ) + } + + get(keysRoute) { + val pagination = call.request.queryParameters.extractPagination + val reversed = standardKtorSerialFormat.decodeFromHexString( + Boolean.serializer(), + call.getQueryParameterOrSendError(reversedParameterName) ?: return@get + ) + + call.unianswer( + paginationKeyResult, + originalRepo.keys(pagination, reversed) + ) + } + + get(containsByKeyRoute) { + val key = standardKtorSerialFormat.decodeFromHexString( + keySerializer, + call.getQueryParameterOrSendError(keyParameterName) ?: return@get + ) + + call.unianswer( + Boolean.serializer(), + originalRepo.contains(key) + ) + } + + get(containsByKeyValueRoute) { + val key = standardKtorSerialFormat.decodeFromHexString( + keySerializer, + call.getQueryParameterOrSendError(keyParameterName) ?: return@get + ) + val value = standardKtorSerialFormat.decodeFromHexString( + valueSealizer, + call.getQueryParameterOrSendError(valueParameterName) ?: return@get + ) + + call.unianswer( + Boolean.serializer(), + originalRepo.contains(key, value) + ) + } + + get(countByKeyRoute) { + val key = standardKtorSerialFormat.decodeFromHexString( + keySerializer, + call.getQueryParameterOrSendError(keyParameterName) ?: return@get + ) + + call.unianswer( + Long.serializer(), + originalRepo.count(key) + ) + } + + get(countRoute) { + call.unianswer( + Long.serializer(), + originalRepo.count() + ) + } +} \ No newline at end of file