From 20dba28f13a340841aaf7a29a0ee9426821ca6c0 Mon Sep 17 00:00:00 2001
From: 000Sanya <000sanya.000sanya@gmail.com>
Date: Wed, 26 Aug 2020 12:55:37 +1000
Subject: [PATCH] read kerver impl

---
 .../ktor/server/KtorOneToManyKeyValueRepo.kt  | 101 ++++++++++++++++++
 1 file changed, 101 insertions(+)
 create mode 100644 utils/repos/ktor/server/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/repos/ktor/server/KtorOneToManyKeyValueRepo.kt

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 <Key, Value> Route.configureOneToManyReadKeyValueRepoRoutes(
+    originalRepo: OneToManyReadKeyValueRepo<Key, Value>,
+    keySerializer: KSerializer<Key>,
+    valueSealizer: KSerializer<Value>,
+) {
+    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