diff options
author | Griffin Smith <grfn@gws.fyi> | 2021-12-14T02·28-0500 |
---|---|---|
committer | Griffin Smith <grfn@gws.fyi> | 2021-12-14T02·45-0500 |
commit | c3cb7b0df82479016c252ef45a302f566bd569f6 (patch) | |
tree | 2f60fac21680a379950c7d34c2e12304e10cc115 /users/grfn/bbbg/src/bbbg/web.clj | |
parent | 479e9ea279a157d81964a9b8cc97423b484921e6 (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 'users/grfn/bbbg/src/bbbg/web.clj')
-rw-r--r-- | users/grfn/bbbg/src/bbbg/web.clj | 77 |
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 000000000000..4e0566bcc3c6 --- /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])) |