MicroUtils/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyWriteKeyValueRepoRoutes.kt

105 lines
3.0 KiB
Kotlin
Raw Normal View History

2020-09-22 01:47:01 +00:00
package dev.inmo.micro_utils.repos.ktor.server.one_to_many
2020-11-27 08:35:00 +00:00
import dev.inmo.micro_utils.ktor.common.StandardKtorSerialFormat
import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat
2020-10-14 16:02:10 +00:00
import dev.inmo.micro_utils.ktor.server.*
import dev.inmo.micro_utils.repos.WriteOneToManyKeyValueRepo
2020-09-22 01:47:01 +00:00
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
import io.ktor.application.call
2020-11-27 08:35:00 +00:00
import io.ktor.http.ContentType
2020-09-22 01:47:01 +00:00
import io.ktor.routing.Route
import io.ktor.routing.post
import kotlinx.serialization.KSerializer
2020-11-06 20:25:50 +00:00
import kotlinx.serialization.builtins.*
2020-09-22 01:47:01 +00:00
fun <Key, Value> Route.configureOneToManyWriteKeyValueRepoRoutes(
2020-10-14 16:02:10 +00:00
originalRepo: WriteOneToManyKeyValueRepo<Key, Value>,
2020-09-22 01:47:01 +00:00
keySerializer: KSerializer<Key>,
2020-11-06 20:25:50 +00:00
valueSerializer: KSerializer<Value>,
2020-11-27 08:35:00 +00:00
unifiedRouter: UnifiedRouter
2020-09-22 01:47:01 +00:00
) {
2020-11-06 20:25:50 +00:00
val keyValueSerializer = PairSerializer(keySerializer, valueSerializer)
val keyValueMapSerializer = MapSerializer(keySerializer, ListSerializer(valueSerializer))
2020-09-22 01:47:01 +00:00
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
includeWebsocketHandling(
onNewValueRoute,
originalRepo.onNewValue,
keyValueSerializer
)
includeWebsocketHandling(
onValueRemovedRoute,
originalRepo.onValueRemoved,
keyValueSerializer
)
includeWebsocketHandling(
onDataClearedRoute,
originalRepo.onDataCleared,
keySerializer
)
}
2020-10-14 16:02:10 +00:00
2020-09-22 01:47:01 +00:00
post(addRoute) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
val obj = uniload(keyValueMapSerializer)
2020-09-22 01:47:01 +00:00
2020-11-27 08:35:00 +00:00
unianswer(
Unit.serializer(),
originalRepo.add(obj)
)
}
2020-09-22 01:47:01 +00:00
}
post(removeRoute) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
val obj = uniload(keyValueMapSerializer)
2020-09-22 01:47:01 +00:00
2020-11-27 08:35:00 +00:00
unianswer(
Unit.serializer(),
originalRepo.remove(obj),
)
}
2020-09-22 01:47:01 +00:00
}
post(clearRoute) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
val key = uniload(keySerializer)
2020-09-22 01:47:01 +00:00
2020-11-27 08:35:00 +00:00
unianswer(
Unit.serializer(),
originalRepo.clear(key),
)
}
2020-09-22 01:47:01 +00:00
}
2020-11-18 14:27:29 +00:00
2021-06-15 08:24:00 +00:00
post(clearWithValueRoute) {
unifiedRouter.apply {
val v = uniload(valueSerializer)
unianswer(
Unit.serializer(),
originalRepo.clearWithValue(v),
)
}
}
2020-11-18 14:27:29 +00:00
post(setRoute) {
2020-11-27 08:35:00 +00:00
unifiedRouter.apply {
val obj = uniload(keyValueMapSerializer)
2020-11-18 14:27:29 +00:00
2020-11-27 08:35:00 +00:00
unianswer(
Unit.serializer(),
originalRepo.set(obj)
)
}
2020-11-18 14:27:29 +00:00
}
2020-11-27 08:35:00 +00:00
}
fun <Key, Value> Route.configureOneToManyWriteKeyValueRepoRoutes(
originalRepo: WriteOneToManyKeyValueRepo<Key, Value>,
keySerializer: KSerializer<Key>,
valueSerializer: KSerializer<Value>,
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat,
serialFormatContentType: ContentType = standardKtorSerialFormatContentType
) = configureOneToManyWriteKeyValueRepoRoutes(originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType))