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

View file

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

View file

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