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]))
|