Skip to content

Instantly share code, notes, and snippets.

@matstani
Created December 1, 2015 09:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matstani/36e0edd336273b2a442a to your computer and use it in GitHub Desktop.
Save matstani/36e0edd336273b2a442a to your computer and use it in GitHub Desktop.
handler component using jdbc-ring-session as session store.
(ns myapp.component.handler
(:require [com.stuartsierra.component :as component]
[compojure.core :as compojure]
[jdbc-ring-session.core :refer [jdbc-store]]))
(defn- find-routes [component]
(keep :routes (vals component)))
(defn- middleware-fn [component middleware]
(if (vector? middleware)
(let [[f & keys] middleware
arguments (map #(get component %) keys)]
#(apply f % arguments))
middleware))
(defn- compose-middleware [{:keys [middleware] :as component}]
(->> (reverse middleware)
(map #(middleware-fn component %))
(apply comp identity)))
(defrecord Handler [defaults db middleware]
component/Lifecycle
(start [component]
(let [component (-> component
(assoc-in [:defaults
:session
:store]
(jdbc-store (:spec db))))]
(if-not (:handler component)
(let [routes (find-routes component)
wrap-mw (compose-middleware component)
handler (wrap-mw (apply compojure/routes routes))]
(assoc component :handler handler))
component)))
(stop [component]
(dissoc component :handler)))
(defn handler-component [options]
(map->Handler options))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment