From 5b94afb27c493d724f9c67d6350f1a553450380a Mon Sep 17 00:00:00 2001 From: dzikoysk Date: Thu, 29 Jun 2023 18:16:59 +0200 Subject: [PATCH] GH-35 Expose compatible with Java register method in the core module (Resolve #35) --- .../community/routing/JavalinRoutes.kt | 31 ----------- .../routing/JavalinRoutingExtensions.kt | 52 +++++++++++++++++++ .../io/javalin/community/routing/Route.kt | 13 +++++ .../community/routing/JavalinRoutesTest.kt | 20 ++++++- 4 files changed, 84 insertions(+), 32 deletions(-) delete mode 100644 routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutes.kt create mode 100644 routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutingExtensions.kt create mode 100644 routing-core/src/main/kotlin/io/javalin/community/routing/Route.kt diff --git a/routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutes.kt b/routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutes.kt deleted file mode 100644 index 5b8c70c..0000000 --- a/routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutes.kt +++ /dev/null @@ -1,31 +0,0 @@ -package io.javalin.community.routing - -import io.javalin.Javalin -import io.javalin.http.Handler -import io.javalin.security.RouteRole - -enum class Route(val isHttpMethod: Boolean = true) { - HEAD, - PATCH, - OPTIONS, - GET, - PUT, - POST, - DELETE, - AFTER(isHttpMethod = false), - BEFORE(isHttpMethod = false), -} - -fun Javalin.registerRoute(route: Route, path: String, handler: Handler, vararg roles: RouteRole) { - when (route) { - Route.HEAD -> head(path, handler, *roles) - Route.PATCH -> patch(path, handler, *roles) - Route.OPTIONS -> options(path, handler, *roles) - Route.GET -> get(path, handler, *roles) - Route.PUT -> put(path, handler, *roles) - Route.POST -> post(path, handler, *roles) - Route.DELETE -> delete(path, handler, *roles) - Route.AFTER -> after(path, handler) - Route.BEFORE -> before(path, handler) - } -} \ No newline at end of file diff --git a/routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutingExtensions.kt b/routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutingExtensions.kt new file mode 100644 index 0000000..6a52be5 --- /dev/null +++ b/routing-core/src/main/kotlin/io/javalin/community/routing/JavalinRoutingExtensions.kt @@ -0,0 +1,52 @@ +package io.javalin.community.routing + +import io.javalin.Javalin +import io.javalin.http.Handler +import io.javalin.security.RouteRole + +class JavalinRoutingExtensions(private val javalin: Javalin) { + + private val routes = mutableListOf() + + fun addRouteHandler(vararg handlerEntry: HandlerEntry): JavalinRoutingExtensions = also { + routes.addAll(handlerEntry) + } + + @JvmOverloads + fun addRoute(route: Route, path: String, vararg roles: RouteRole = emptyArray(), handler: Handler): JavalinRoutingExtensions = also { + routes.add(HandlerEntry(route, path, handler, roles.toList())) + } + + fun register(): Javalin { + routes + .sortRoutes() + .forEach { javalin.registerRoute(it) } + + return javalin + } + +} + +data class HandlerEntry @JvmOverloads constructor( + val route: Route, + override val path: String, + val handler: Handler, + val roles: List = emptyList(), +) : Routed + +fun Javalin.registerRoute(handlerEntry: HandlerEntry) = + registerRoute(handlerEntry.route, handlerEntry.path, handlerEntry.handler, *handlerEntry.roles.toTypedArray()) + +fun Javalin.registerRoute(route: Route, path: String, handler: Handler, vararg roles: RouteRole) { + when (route) { + Route.HEAD -> head(path, handler, *roles) + Route.PATCH -> patch(path, handler, *roles) + Route.OPTIONS -> options(path, handler, *roles) + Route.GET -> get(path, handler, *roles) + Route.PUT -> put(path, handler, *roles) + Route.POST -> post(path, handler, *roles) + Route.DELETE -> delete(path, handler, *roles) + Route.AFTER -> after(path, handler) + Route.BEFORE -> before(path, handler) + } +} \ No newline at end of file diff --git a/routing-core/src/main/kotlin/io/javalin/community/routing/Route.kt b/routing-core/src/main/kotlin/io/javalin/community/routing/Route.kt new file mode 100644 index 0000000..31f459f --- /dev/null +++ b/routing-core/src/main/kotlin/io/javalin/community/routing/Route.kt @@ -0,0 +1,13 @@ +package io.javalin.community.routing + +enum class Route(val isHttpMethod: Boolean = true) { + HEAD, + PATCH, + OPTIONS, + GET, + PUT, + POST, + DELETE, + AFTER(isHttpMethod = false), + BEFORE(isHttpMethod = false), +} \ No newline at end of file diff --git a/routing-core/src/test/kotlin/io/javalin/community/routing/JavalinRoutesTest.kt b/routing-core/src/test/kotlin/io/javalin/community/routing/JavalinRoutesTest.kt index 205fc5c..664c43b 100644 --- a/routing-core/src/test/kotlin/io/javalin/community/routing/JavalinRoutesTest.kt +++ b/routing-core/src/test/kotlin/io/javalin/community/routing/JavalinRoutesTest.kt @@ -1,6 +1,8 @@ package io.javalin.community.routing import io.javalin.Javalin +import io.javalin.community.routing.Route.GET +import io.javalin.community.routing.Route.PUT import io.javalin.http.Handler import io.javalin.http.HandlerType import org.assertj.core.api.Assertions.assertThat @@ -17,7 +19,6 @@ class JavalinRoutesTest { // when: routes are registered val app = Javalin.create() .apply { routes.forEach { route -> registerRoute(route.first, "/", route.second) } } - .start() // then: all routes are registered by as proper HandlerType routes.forEach { (method, handler) -> @@ -31,4 +32,21 @@ class JavalinRoutesTest { } } + @Test + fun `should register routes`() { + val app = JavalinRoutingExtensions(Javalin.create()) + .addRoute(GET, "/") { it.result("Hello World!") } + .addRoute(PUT, "/") { it.result("Hello World!") } + .register() + + listOf("GET", "PUT").forEach { method -> + assertThat( + app.javalinServlet() + .matcher + .findEntries(HandlerType.findByName(method), "/") + .firstOrNull() + ).isNotNull + } + } + } \ No newline at end of file