feat(backend): enable proper multipart handling

This commit is contained in:
Andrey Antukh 2019-06-15 18:10:58 +02:00
parent 57568f9614
commit 04a054474f

View file

@ -15,6 +15,7 @@
[reitit.ring.middleware.exception :as exception] [reitit.ring.middleware.exception :as exception]
[ring.middleware.session :refer [wrap-session]] [ring.middleware.session :refer [wrap-session]]
[ring.middleware.session.cookie :refer [cookie-store]] [ring.middleware.session.cookie :refer [cookie-store]]
[ring.middleware.multipart-params :refer [wrap-multipart-params]]
[struct.core :as st] [struct.core :as st]
[uxbox.api.errors :as api-errors] [uxbox.api.errors :as api-errors]
[uxbox.util.data :refer [normalize-attrs]] [uxbox.util.data :refer [normalize-attrs]]
@ -37,20 +38,26 @@
(def ^:private normalize-params-middleware (def ^:private normalize-params-middleware
{:name ::normalize-params-middleware {:name ::normalize-params-middleware
:wrap (fn [handler] :wrap (fn [handler]
(letfn [(transform-request [request] (letfn [(transform-request [request key]
(if-let [data (get request :query-params)] (if-let [data (get request key)]
(assoc request :query-params (normalize-attrs data)) (assoc request key (normalize-attrs data))
request))] request))
(transform [request]
(-> request
(transform-request :query-params)
(transform-request :multipart-params)))]
(fn (fn
([request] (handler (transform-request request))) ([request] (handler (transform request)))
([request respond raise] ([request respond raise]
(try (try
(try (try
(let [request (transform-request request)] (handler (transform request) respond raise)
(handler (transform-request request) respond raise))
(catch Exception e (catch Exception e
(raise e))))))))}) (raise e))))))))})
(def ^:private multipart-params-middleware
{:name ::multipart-params-middleware
:wrap wrap-multipart-params})
(def ^:private parameters-validation-middleware (def ^:private parameters-validation-middleware
(letfn [(prepare [parameters] (letfn [(prepare [parameters]
@ -60,6 +67,7 @@
:path :path-params :path :path-params
:query :query-params :query :query-params
:body :body-params :body :body-params
:multipart :multipart-params
(throw (ex-info "Not supported key on :parameters" {})))] (throw (ex-info "Not supported key on :parameters" {})))]
(assoc acc newkey {:key key (assoc acc newkey {:key key
:fn #(st/validate % spec)}))) :fn #(st/validate % spec)})))
@ -128,8 +136,6 @@
:data {:muuntaja muuntaja-instance :data {:muuntaja muuntaja-instance
:middleware [session-middleware :middleware [session-middleware
parameters/parameters-middleware parameters/parameters-middleware
normalize-params-middleware
;; content-negotiation
muuntaja/format-negotiate-middleware muuntaja/format-negotiate-middleware
;; encoding response body ;; encoding response body
muuntaja/format-response-middleware muuntaja/format-response-middleware
@ -137,10 +143,12 @@
exception-middleware exception-middleware
;; decoding request body ;; decoding request body
muuntaja/format-request-middleware muuntaja/format-request-middleware
;; validation
parameters-validation-middleware
;; multipart ;; multipart
multipart/multipart-middleware]}}) multipart-params-middleware
;; parameters normalization
normalize-params-middleware
;; parameters validation
parameters-validation-middleware]}})
(defn handler (defn handler
[invar] [invar]