From c3a3b923a78167e9301af5817eaef387850cc8f0 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Fri, 31 Aug 2018 10:01:01 +0300 Subject: [PATCH] wip --- examples/pedestal/.gitignore | 11 +++++++ examples/pedestal/README.md | 17 +++++++++++ examples/pedestal/project.clj | 7 +++++ examples/pedestal/src/example/pedestal.clj | 35 ++++++++++++++++++++++ examples/pedestal/src/example/server.clj | 34 +++++++++++++++++++++ 5 files changed, 104 insertions(+) create mode 100644 examples/pedestal/.gitignore create mode 100644 examples/pedestal/README.md create mode 100644 examples/pedestal/project.clj create mode 100644 examples/pedestal/src/example/pedestal.clj create mode 100644 examples/pedestal/src/example/server.clj diff --git a/examples/pedestal/.gitignore b/examples/pedestal/.gitignore new file mode 100644 index 00000000..c53038ec --- /dev/null +++ b/examples/pedestal/.gitignore @@ -0,0 +1,11 @@ +/target +/classes +/checkouts +pom.xml +pom.xml.asc +*.jar +*.class +/.lein-* +/.nrepl-port +.hgignore +.hg/ diff --git a/examples/pedestal/README.md b/examples/pedestal/README.md new file mode 100644 index 00000000..281db0cd --- /dev/null +++ b/examples/pedestal/README.md @@ -0,0 +1,17 @@ +# reitit-http example with pedestal + +## Usage + +```clj +> lein repl +(start) +``` + +Go with browser to: + +* http://localhost:3000/api/sync - synchronous +* http://localhost:3000/api/async - with core.async + +## License + +Copyright © 2018 Metosin Oy diff --git a/examples/pedestal/project.clj b/examples/pedestal/project.clj new file mode 100644 index 00000000..e040f9ff --- /dev/null +++ b/examples/pedestal/project.clj @@ -0,0 +1,7 @@ +(defproject ring-example "0.1.0-SNAPSHOT" + :description "Reitit-http with pedestal" + :dependencies [[org.clojure/clojure "1.9.0"] + [io.pedestal/pedestal.service "0.5.1"] + [io.pedestal/pedestal.jetty "0.5.1"] + [metosin/reitit "0.2.0-SNAPSHOT"]] + :repl-options {:init-ns example.server}) diff --git a/examples/pedestal/src/example/pedestal.clj b/examples/pedestal/src/example/pedestal.clj new file mode 100644 index 00000000..dae10efc --- /dev/null +++ b/examples/pedestal/src/example/pedestal.clj @@ -0,0 +1,35 @@ +(ns example.pedestal + (:require [io.pedestal.interceptor.chain :as chain] + [io.pedestal.interceptor :as interceptor] + [reitit.http :as http]) + (:import (reitit.interceptor Executor))) + +(def pedestal-executor + (reify + Executor + (queue [_ interceptors] + (->> interceptors + (map (fn [{:keys [::interceptor/handler] :as interceptor}] + (or handler interceptor))) + (map interceptor/interceptor))) + (enqueue [_ context interceptors] + (chain/enqueue context interceptors)))) + +(defn routing-interceptor + ([router] + (routing-interceptor router nil)) + ([router default-handler] + (routing-interceptor router default-handler nil)) + ([router default-handler opts] + (interceptor/interceptor + (http/routing-interceptor + router + default-handler + (merge {:executor pedestal-executor} opts))))) + +(def router http/router) + +(defn with-reitit-router [spec router] + (-> spec + (update ::http/interceptors (comp vec butlast)) + (update ::http/interceptors conj router))) diff --git a/examples/pedestal/src/example/server.clj b/examples/pedestal/src/example/server.clj new file mode 100644 index 00000000..f46bc186 --- /dev/null +++ b/examples/pedestal/src/example/server.clj @@ -0,0 +1,34 @@ +(ns example.server + (:require [io.pedestal.http :as http] + [io.pedestal.http.route :as route] + [io.pedestal.http.body-params :as body-params] + [io.pedestal.http.route.definition :refer [defroutes]])) + +(defn hello-world [request] + (let [name (get-in request [:params :name] "World")] + {:status 200 :body (str "Hello " name "!\n")})) + +(defroutes routes + [[["/" + ["/hello" {:get hello-world}]]]]) + +(def service {:env :prod + ::http/routes routes + ::http/resource-path "/public" + ::http/type :jetty + ::http/port 8080}) + +(defn start [] + (-> service/service + (merge {:env :dev + ::http/join? false + ::http/routes #(deref #'routes) + ::http/allowed-origins {:creds true :allowed-origins (constantly true)}}) + http/default-interceptors + http/dev-interceptors + http/create-server + http/start)) + + +(comment + (start))