diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index 11acedc7c..12e16db88 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -31,9 +31,10 @@ (defn- handle-response-transformation [response request mdata] - (if-let [transform-fn (:transform-response mdata)] - (p/do (transform-fn request response)) - (p/resolved response))) + (let [response (if (sv/wrapped? response) @response response)] + (if-let [transform-fn (:transform-response mdata)] + (p/do (transform-fn request response)) + (p/resolved response)))) (defn- handle-before-comple-hook [response mdata] diff --git a/backend/src/app/util/services.clj b/backend/src/app/util/services.clj index 66f9fc8db..f8f8fc004 100644 --- a/backend/src/app/util/services.clj +++ b/backend/src/app/util/services.clj @@ -11,6 +11,20 @@ [app.common.data :as d] [cuerdas.core :as str])) +(defrecord WrappedValue [obj] + clojure.lang.IDeref + (deref [_] obj)) + +(defn wrap + ([] + (WrappedValue. nil)) + ([o] + (WrappedValue. o))) + +(defn wrapped? + [o] + (instance? WrappedValue o)) + (defmacro defmethod [sname & body] (let [[docs body] (if (string? (first body)) diff --git a/backend/test/app/test_helpers.clj b/backend/test/app/test_helpers.clj index f91e22aa6..59ed7e40a 100644 --- a/backend/test/app/test_helpers.clj +++ b/backend/test/app/test_helpers.clj @@ -23,6 +23,7 @@ [app.rpc.mutations.projects :as projects] [app.rpc.mutations.teams :as teams] [app.util.blob :as blob] + [app.util.services :as sv] [app.util.time :as dt] [clojure.java.io :as io] [clojure.spec.alpha :as s] @@ -278,8 +279,10 @@ (defmacro try-on! [expr] `(try - {:error nil - :result (deref ~expr)} + (let [result# (deref ~expr) + result# (cond-> result# (sv/wrapped? result#) deref)] + {:error nil + :result result#}) (catch Exception e# {:error (handle-error e#) :result nil})))