aboutsummaryrefslogtreecommitdiff
path: root/kvision-modules/kvision-server-ktor
diff options
context:
space:
mode:
authorRobert Jaros <rjaros@finn.pl>2019-02-01 15:30:28 +0100
committerRobert Jaros <rjaros@finn.pl>2019-02-01 15:30:28 +0100
commit48d0bddd8f27c7165f7dfce3abe1072b6eb4f9f1 (patch)
tree628b9df75c3f361238edb297cec7123c2679974e /kvision-modules/kvision-server-ktor
parent110ba60c6557bf16a3bfc5f7ff5af46a98164c75 (diff)
downloadkvision-48d0bddd8f27c7165f7dfce3abe1072b6eb4f9f1.tar.gz
kvision-48d0bddd8f27c7165f7dfce3abe1072b6eb4f9f1.tar.bz2
kvision-48d0bddd8f27c7165f7dfce3abe1072b6eb4f9f1.zip
Refactor server-side interfaces.
Diffstat (limited to 'kvision-modules/kvision-server-ktor')
-rw-r--r--kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt22
-rw-r--r--kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt30
-rw-r--r--kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt48
3 files changed, 38 insertions, 62 deletions
diff --git a/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt b/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt
index eb57f7d7..06018761 100644
--- a/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt
+++ b/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt
@@ -31,19 +31,16 @@ import io.ktor.application.ApplicationCallPipeline
import io.ktor.application.call
import io.ktor.application.install
import io.ktor.features.ContentNegotiation
-import io.ktor.http.HttpMethod
import io.ktor.http.content.default
import io.ktor.http.content.resources
import io.ktor.http.content.static
import io.ktor.jackson.jackson
-import io.ktor.request.httpMethod
-import io.ktor.request.uri
import io.ktor.routing.routing
import io.ktor.util.AttributeKey
import pl.treksoft.kvision.types.KV_JSON_DATE_FORMAT
import java.text.SimpleDateFormat
-fun Application.kvision(vararg modules: Module) {
+fun Application.kvisionInit(vararg modules: Module) {
install(ContentNegotiation) {
jackson {
dateFormat = SimpleDateFormat(KV_JSON_DATE_FORMAT)
@@ -56,27 +53,12 @@ fun Application.kvision(vararg modules: Module) {
}
}
+ @Suppress("SpreadOperator")
val injector = Guice.createInjector(MainModule(this), *modules)
- val kvServer = injector.getInstance(KVServer::class.java)
intercept(ApplicationCallPipeline.Features) {
call.attributes.put(InjectorKey, injector.createChildInjector(CallModule(call)))
}
-
- intercept(ApplicationCallPipeline.Call) {
- val routeUri = call.request.uri
- if (routeUri.startsWith("/kv/")) {
- kvServer.services.mapNotNull {
- when (call.request.httpMethod) {
- HttpMethod.Post -> it.postRequests[routeUri]
- HttpMethod.Put -> it.putRequests[routeUri]
- HttpMethod.Delete -> it.deleteRequests[routeUri]
- HttpMethod.Options -> it.optionsRequests[routeUri]
- else -> null
- }
- }.firstOrNull()?.invoke(call)
- }
- }
}
val InjectorKey = AttributeKey<Injector>("injector")
diff --git a/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt b/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt
deleted file mode 100644
index 29084e5d..00000000
--- a/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2017-present Robert Jaros
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package pl.treksoft.kvision.remote
-
-import org.pac4j.core.profile.CommonProfile
-import kotlinx.coroutines.async as coroutinesAsync
-
-/**
- * A Ktor based server.
- */
-open class KVServer(val services: List<KVServiceManager<*>>)
diff --git a/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt b/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt
index 471eff2a..fbc94f64 100644
--- a/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt
+++ b/kvision-modules/kvision-server-ktor/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt
@@ -23,8 +23,15 @@ package pl.treksoft.kvision.remote
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import io.ktor.application.ApplicationCall
+import io.ktor.application.call
import io.ktor.request.receive
import io.ktor.response.respond
+import io.ktor.routing.Route
+import io.ktor.routing.delete
+import io.ktor.routing.options
+import io.ktor.routing.post
+import io.ktor.routing.put
+import io.ktor.util.pipeline.PipelineContext
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.slf4j.Logger
import org.slf4j.LoggerFactory
@@ -42,10 +49,12 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
val LOG: Logger = LoggerFactory.getLogger(KVServiceManager::class.java.name)
}
- val postRequests: MutableMap<String, suspend (ApplicationCall) -> Unit> = mutableMapOf()
- val putRequests: MutableMap<String, suspend (ApplicationCall) -> Unit> = mutableMapOf()
- val deleteRequests: MutableMap<String, suspend (ApplicationCall) -> Unit> = mutableMapOf()
- val optionsRequests: MutableMap<String, suspend (ApplicationCall) -> Unit> = mutableMapOf()
+ val postRequests: MutableMap<String, suspend PipelineContext<Unit, ApplicationCall>.(Unit) -> Unit> = mutableMapOf()
+ val putRequests: MutableMap<String, suspend PipelineContext<Unit, ApplicationCall>.(Unit) -> Unit> = mutableMapOf()
+ val deleteRequests: MutableMap<String, suspend PipelineContext<Unit, ApplicationCall>.(Unit) -> Unit> =
+ mutableMapOf()
+ val optionsRequests: MutableMap<String, suspend PipelineContext<Unit, ApplicationCall>.(Unit) -> Unit> =
+ mutableMapOf()
val mapper = jacksonObjectMapper().apply {
dateFormat = SimpleDateFormat(KV_JSON_DATE_FORMAT)
@@ -64,7 +73,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
route: String?, method: RpcHttpMethod
) {
val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { call ->
+ addRoute(method, "/kv/$routeDef") {
val service = call.injector.getInstance(serviceClass.java)
val jsonRpcRequest = call.receive<JsonRpcRequest>()
try {
@@ -99,7 +108,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
route: String?, method: RpcHttpMethod
) {
val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { call ->
+ addRoute(method, "/kv/$routeDef") {
val service = call.injector.getInstance(serviceClass.java)
val jsonRpcRequest = call.receive<JsonRpcRequest>()
if (jsonRpcRequest.params.size == 1) {
@@ -144,7 +153,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
route: String?, method: RpcHttpMethod
) {
val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { call ->
+ addRoute(method, "/kv/$routeDef") {
val service = call.injector.getInstance(serviceClass.java)
val jsonRpcRequest = call.receive<JsonRpcRequest>()
if (jsonRpcRequest.params.size == 2) {
@@ -190,7 +199,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
route: String?, method: RpcHttpMethod
) {
val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { call ->
+ addRoute(method, "/kv/$routeDef") {
val service = call.injector.getInstance(serviceClass.java)
val jsonRpcRequest = call.receive<JsonRpcRequest>()
@Suppress("MagicNumber")
@@ -238,7 +247,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
route: String?, method: RpcHttpMethod
) {
val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { call ->
+ addRoute(method, "/kv/$routeDef") {
val service = call.injector.getInstance(serviceClass.java)
val jsonRpcRequest = call.receive<JsonRpcRequest>()
@Suppress("MagicNumber")
@@ -289,7 +298,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
method: RpcHttpMethod
) {
val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { call ->
+ addRoute(method, "/kv/$routeDef") {
val service = call.injector.getInstance(serviceClass.java)
val jsonRpcRequest = call.receive<JsonRpcRequest>()
@Suppress("MagicNumber")
@@ -336,7 +345,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
function: T.(String?, String?) -> List<RemoteSelectOption>
) {
val routeDef = "route${this::class.simpleName}${counter++}"
- addRoute(RpcHttpMethod.POST, "/kv/$routeDef") { call ->
+ addRoute(RpcHttpMethod.POST, "/kv/$routeDef") {
val service = call.injector.getInstance(serviceClass.java)
val jsonRpcRequest = call.receive<JsonRpcRequest>()
if (jsonRpcRequest.params.size == 2) {
@@ -373,7 +382,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
fun addRoute(
method: RpcHttpMethod,
path: String,
- handler: suspend (ApplicationCall) -> Unit
+ handler: suspend PipelineContext<Unit, ApplicationCall>.(Unit) -> Unit
) {
when (method) {
RpcHttpMethod.POST -> postRequests[path] = handler
@@ -393,3 +402,18 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass:
} ?: null as T
}
}
+
+fun <T : Any> Route.applyRoutes(serviceManager: KVServiceManager<T>) {
+ serviceManager.postRequests.forEach { (path, handler) ->
+ post(path, handler)
+ }
+ serviceManager.putRequests.forEach { (path, handler) ->
+ put(path, handler)
+ }
+ serviceManager.deleteRequests.forEach { (path, handler) ->
+ delete(path, handler)
+ }
+ serviceManager.optionsRequests.forEach { (path, handler) ->
+ options(path, handler)
+ }
+}