diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 58acd948c4..7d6a1bb09c 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -29,19 +29,18 @@ (defmethod handle-exception :validation [err req] (let [header (get-in req [:headers "accept"]) - edata (ex-data err)] + error (ex-data err)] (cond (and (str/starts-with? header "text/html") - (= :spec-validation (:code edata))) + (= :spec-validation (:code error))) {:status 400 :headers {"content-type" "text/html"} :body (str "
"
- (with-out-str
- (:data edata))
+ (:hint-verbose error)
"\n")}
:else
{:status 400
- :body edata})))
+ :body error})))
(defmethod handle-exception :ratelimit
[_ _]
diff --git a/backend/src/app/media.clj b/backend/src/app/media.clj
index a05f4c0c44..fc6808f7d0 100644
--- a/backend/src/app/media.clj
+++ b/backend/src/app/media.clj
@@ -32,7 +32,6 @@
(defstate semaphore
:start (Semaphore. (:image-process-max-threads cfg/config 1)))
-
;; --- Generic specs
(s/def :internal.http.upload/filename ::us/string)
diff --git a/common/app/common/spec.cljc b/common/app/common/spec.cljc
index 10a174debb..7639d70215 100644
--- a/common/app/common/spec.cljc
+++ b/common/app/common/spec.cljc
@@ -186,10 +186,16 @@
[spec data]
(let [result (s/conform spec data)]
(when (= result ::s/invalid)
- (let [edata (s/explain-data spec data)]
+ (let [edata (s/explain-data spec data)
+ nhint (with-out-str
+ (s/explain-out edata))
+ vhint (with-out-str
+ (expound/printer edata))]
(throw (ex/error :type :validation
:code :spec-validation
- :data data))))
+ :data data
+ :hint nhint
+ :hint-verbose vhint))))
result))
(defmacro instrument!
diff --git a/frontend/src/app/main/ui.cljs b/frontend/src/app/main/ui.cljs
index 635d2afa64..9af5d11093 100644
--- a/frontend/src/app/main/ui.cljs
+++ b/frontend/src/app/main/ui.cljs
@@ -209,6 +209,18 @@
;; --- Error Handling
(defmethod ptk/handle-error :validation
+ [error]
+ (ts/schedule
+ (st/emitf (dm/show {:content "Unexpected validation error (server side)."
+ :type :error
+ :timeout 5000})))
+ (when-let [explain (:hint-verbose error)]
+ (js/console.group "Server Error")
+ (js/console.error (if (map? error) (pr-str error) error))
+ (js/console.error explain)
+ (js/console.endGroup "Server Error")))
+
+(defmethod ptk/handle-error :spec-validation
[error]
(ts/schedule
(st/emitf (dm/show {:content "Unexpected validation error (server side)."