about summary refs log tree commit diff
path: root/users/grfn/bbbg/src/bbbg/web.clj
diff options
context:
space:
mode:
authorGriffin Smith <grfn@gws.fyi>2021-12-14T02·28-0500
committerGriffin Smith <grfn@gws.fyi>2021-12-14T02·45-0500
commitc3cb7b0df82479016c252ef45a302f566bd569f6 (patch)
tree2f60fac21680a379950c7d34c2e12304e10cc115 /users/grfn/bbbg/src/bbbg/web.clj
parent479e9ea279a157d81964a9b8cc97423b484921e6 (diff)
feat(grfn/bbbg): Init r/3233
This will eventually become a signup sheet + no-show tracker for my
local board game meetup group

Change-Id: Id8d1d80d95d1e2fda5041275cff2fecfd6fa43f1
Diffstat (limited to '')
-rw-r--r--users/grfn/bbbg/src/bbbg/web.clj77
1 files changed, 77 insertions, 0 deletions
diff --git a/users/grfn/bbbg/src/bbbg/web.clj b/users/grfn/bbbg/src/bbbg/web.clj
new file mode 100644
index 0000000000..4e0566bcc3
--- /dev/null
+++ b/users/grfn/bbbg/src/bbbg/web.clj
@@ -0,0 +1,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]))