about summary refs log tree commit diff
path: root/users/grfn/bbbg/src/bbbg/web.clj
blob: 4e0566bcc3c695c06791ff1e2aee82588eeb59cc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
(ns bbbg.web
  (:require
   [bbbg.handlers.attendees :as attendees]
   [bbbg.handlers.events :as events]
   [bbbg.handlers.home :as home]
   [bbbg.handlers.signup-form :as signup-form]
   [bbbg.styles :refer [stylesheet]]
   [clojure.spec.alpha :as s]
   [com.stuartsierra.component :as component]
   [compojure.core :refer [GET routes]]
   [config.core :refer [env]]
   [org.httpkit.server :as http-kit]
   [ring.middleware.flash :refer [wrap-flash]]
   [ring.middleware.keyword-params :refer [wrap-keyword-params]]
   [ring.middleware.params :refer [wrap-params]]
   [ring.util.response :refer [content-type response resource-response]]))

(s/def ::port pos-int?)

(s/def ::config
  (s/keys :req [::port]))

(s/fdef make-server
  :args (s/cat :config ::config))

(defn env->config []
  (s/assert
   ::config
   {::port (:port env 8888)}))

(defn dev-config []
  (s/assert ::config {::port 8888}))

;;;

(defn app-routes [env]
  (routes
   (GET "/main.css" []
     (-> (response stylesheet)
         (content-type "text/css")))
   (GET "/main.js" []
     (-> (resource-response "main.js")
         (content-type "text/javascript")))

   (attendees/attendees-routes env)
   (signup-form/signup-form-routes env)
   (events/events-routes env)
   (home/home-routes env)))

(defn middleware [app]
  (-> app
      wrap-keyword-params
      wrap-params
      wrap-flash))

(defn handler [this]
  (middleware
   (app-routes this)))

(defrecord WebServer [port db]
  component/Lifecycle
  (start [this]
    (assoc this
           ::shutdown-fn
           (http-kit/run-server
            (fn [r] ((handler this) r))
            {:port port})))
  (stop [this]
    (if-let [shutdown-fn (::shutdown-fn this)]
      (do (shutdown-fn :timeout 100)
          (dissoc this ::shutdown-fn))
      this)))

(defn make-server [{::keys [port]}]
  (component/using
   (map->WebServer {:port port})
   [:db]))