wrap api routes with exception handler middleware

This commit is contained in:
Gered 2018-06-09 17:43:45 -04:00
parent 96a5d5a37b
commit ef8240ecc0
4 changed files with 47 additions and 25 deletions

View file

@ -1,5 +1,6 @@
(ns mtgcoll.middleware
(:require
[clojure.tools.logging :as log]
[webtools.response :as response]
[mtgcoll.auth :as auth]))
@ -11,3 +12,14 @@
(handler request)
(-> (response/content "unauthorized")
(response/status 401)))))
(defn wrap-api-exceptions
[handler]
(fn [request]
(try
(handler request)
(catch Exception ex
(log/error ex "Unhandled exception.")
(-> (response/json {:status "error"
:message (.getMessage ex)})
(response/status 500))))))

View file

@ -3,30 +3,37 @@
[clojure.tools.logging :as log]
[compojure.core :refer [routes GET POST]]
[webtools.response :as response]
[webtools.routes.core :refer [wrap-middleware]]
[webtools.session :as session]
[mtgcoll.middleware :refer [wrap-api-exceptions wrap-authenticated]]
[mtgcoll.auth :as auth]))
(def auth-routes
(routes
(POST "/login" [username password :as request]
(if-let [user (auth/validate-credentials username password)]
(do
(log/info username " logged in.")
(-> (response/json user)
(session/set-from-request request)
(session/assoc :user user)))
(do
(log/warn "Unsuccessful login attempt by: " username)
(-> (response/content "bad username/password")
(response/status 401)))))
(wrap-middleware
(routes
(POST "/login" [username password :as request]
(if-let [user (auth/validate-credentials username password)]
(do
(log/info username " logged in.")
(-> (response/json user)
(session/set-from-request request)
(session/assoc :user user)))
(do
(log/warn "Unsuccessful login attempt by: " username)
(-> (response/json {:status "unauthorized"
:message "bad username/password"})
(response/status 401)))))
(POST "/logout" request
(if-let [user (get-in request [:session :user])]
(do
(log/info (:username user) " logged out.")
(-> (response/content "ok")
(session/set-from-request request)
(session/dissoc :user)))
(do
(-> (response/content "not logged in")
(response/status 400)))))))
(POST "/logout" request
(if-let [user (get-in request [:session :user])]
(do
(log/info (:username user) " logged out.")
(-> (response/content "ok")
(session/set-from-request request)
(session/dissoc :user)))
(do
(-> (response/json {:status "error"
:message "not logged in"})
(response/status 400))))))
(wrap-api-exceptions)))

View file

@ -3,7 +3,7 @@
[compojure.core :refer [routes GET POST]]
[webtools.response :as response]
[webtools.routes.core :refer [wrap-middleware]]
[mtgcoll.middleware :refer [wrap-authenticated]]
[mtgcoll.middleware :refer [wrap-api-exceptions wrap-authenticated]]
[mtgcoll.models.collection :as collection]))
(def collection-routes
@ -23,4 +23,6 @@
(let [username (get-in request [:session :user :username])
result (collection/copy-list! source-list-id destination-list-id username)]
(response/json {:status "ok"}))))
(wrap-api-exceptions)
(wrap-authenticated)))

View file

@ -3,7 +3,7 @@
[compojure.core :refer [routes GET POST]]
[webtools.response :as response]
[webtools.routes.core :refer [wrap-middleware]]
[mtgcoll.middleware :refer [wrap-authenticated]]
[mtgcoll.middleware :refer [wrap-api-exceptions wrap-authenticated]]
[mtgcoll.models.lists :as lists]))
(def list-routes
@ -31,4 +31,5 @@
(lists/update-list-visibility! list-id public?)
(response/json {:status "ok"})))
(wrap-api-exceptions)
(wrap-authenticated)))