toaster.do/clojure_frontend/src/toaster/session.clj

66 lines
1.8 KiB
Clojure

(ns toaster.session
(:refer-clojure :exclude [get])
(:require
[toaster.config :as conf]
[taoensso.timbre :as log]
[failjure.core :as f]
[just-auth.core :as auth]
[toaster.ring :as ring]
[toaster.bulma :as web]))
(defn param [request param]
(let [value
(get-in request
(conj [:params] param))]
(if (nil? value)
(f/fail (str "Parameter not found: " param))
value)))
;; TODO: not working?
(defn get [req arrk]
{:pre (coll? arrk)}
(if-let [value (get-in req (conj [:session] arrk))]
value
(f/fail (str "Value not found in session: " (str arrk)))))
(defn check-config [request]
;; reload configuration from file all the time if in debug mode
(if-let [session (:session request)]
(if (contains? session :config)
(:config session)
(conf/load-config "toaster" conf/default-settings))
(f/fail "Session not found.")))
(defn check-account [request]
;; check if login is present in session
(f/attempt-all
[login (get-in request [:session :auth :email])
user (auth/get-account @ring/auth login)]
user
(f/when-failed [e]
(->> e f/message
(str "Unauthorized access: ")
f/fail))))
(defn check-database []
(if-let [db @ring/db]
db
(f/fail "No connection to database.")))
(defn auth-wrap [request fun]
(f/attempt-all
[db (check-database)
config (check-config request)
account (if (conf/q config [:webserver :mock-auth])
{:email "mock@dyne.org"
:name "MockUser"
:activated true}
;; else
(check-account request))]
(fun request config account)
(f/when-failed [e]
(web/render [:span
(web/notify (f/message e) "is-error")
web/login-form
]))))