From e0e92867d94bb02f1247c559c15580f0312d32d8 Mon Sep 17 00:00:00 2001 From: Thibaut Mattio Date: Mon, 1 Jun 2020 16:55:07 +0200 Subject: [PATCH] Add a scope function in Router --- opium_kernel/middlewares/router.ml | 9 +++++++++ opium_kernel/opium_kernel.mli | 29 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/opium_kernel/middlewares/router.ml b/opium_kernel/middlewares/router.ml index 4ad99af8..0aa5d3fb 100644 --- a/opium_kernel/middlewares/router.ml +++ b/opium_kernel/middlewares/router.ml @@ -112,6 +112,15 @@ let splat req = Hmap0.find_exn Env.key req.Rock.Request.env |> fun route -> route.Route.splat ;; +let scope ~route ~middlewares router routes = + ListLabels.iter routes ~f:(fun (meth, subroute, action) -> + let action = + ListLabels.fold_left middlewares ~init:action ~f:(fun h m -> + Rock.Middleware.apply m h) + in + add router ~action ~meth ~route:(Route.of_string (Filename.concat route subroute))) +;; + let m endpoints = let filter default req = let url = req.Rock.Request.target in diff --git a/opium_kernel/opium_kernel.mli b/opium_kernel/opium_kernel.mli index d5fd6e5c..c4bfab42 100644 --- a/opium_kernel/opium_kernel.mli +++ b/opium_kernel/opium_kernel.mli @@ -171,6 +171,35 @@ module Router : sig val add : 'a t -> route:Route.t -> meth:Httpaf.Method.standard -> action:'a -> unit val param : Rock.Request.t -> string -> string val splat : Rock.Request.t -> string list + + (** [scope] adds scoped routes to the router. + + The scoped routes will be prefixed by [route] and their handlers will be wrapped by + [middlewares]. + + {4 Example} + + Here's an example that defines a scope that will prefix every routes with "/users" + and will wrap the handlers with a middleware defined in [Middleware.require_auth]. + + {[ + let () = + Router.scope + ~middlewares:[ Middleware.require_auth ] + ~route:"/users" + router + [ `POST, "/register", Handlers.register_user + ; `POST, "/login", Handlers.login_user + ] + ;; + ]} *) + val scope + : route:string + -> middlewares:Rock.Middleware.t list + -> Rock.Handler.t t + -> (Httpaf.Method.standard * string * Rock.Handler.t) list + -> unit + val m : Rock.Handler.t t -> Rock.Middleware.t end