From defcef3e593564a43e2d223982449e31ee015add Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 25 Jul 2024 15:14:16 +0200 Subject: [PATCH 1/3] :sparkles: Resolve file thumbnail on frontend instead of backend --- backend/src/app/rpc/commands/files.clj | 8 +++----- .../src/app/rpc/commands/files_thumbnails.clj | 3 ++- frontend/src/app/main/data/dashboard.cljs | 11 +++++------ frontend/src/app/main/ui/dashboard/grid.cljs | 19 ++++++++++--------- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index b0c74feb12..53cbf23c5f 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -671,7 +671,7 @@ f.modified_at, f.name, f.is_shared, - ft.media_id, + ft.media_id AS thumbnail_id, row_number() over w as row_num from file as f inner join project as p on (p.id = f.project_id) @@ -690,10 +690,8 @@ [conn team-id] (->> (db/exec! conn [sql:team-recent-files team-id]) (mapv (fn [row] - (if-let [media-id (:media-id row)] - (-> row - (dissoc :media-id) - (assoc :thumbnail-uri (resolve-public-uri media-id))) + (if-let [media-id (:thumbnail-id row)] + (assoc row :thumbnail-uri (resolve-public-uri media-id)) (dissoc row :media-id)))))) (def ^:private schema:get-team-recent-files diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index 760e3bcd3a..38252787a1 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -406,4 +406,5 @@ (when-not (db/read-only? conn) (let [cfg (update cfg ::sto/storage media/configure-assets-storage) media (create-file-thumbnail! cfg params)] - {:uri (files/resolve-public-uri (:id media))}))))) + {:uri (files/resolve-public-uri (:id media)) + :id (:id media)}))))) diff --git a/frontend/src/app/main/data/dashboard.cljs b/frontend/src/app/main/data/dashboard.cljs index 6e5e53d1a1..7a0e3297ae 100644 --- a/frontend/src/app/main/data/dashboard.cljs +++ b/frontend/src/app/main/data/dashboard.cljs @@ -898,8 +898,7 @@ (-> state (d/update-in-when [:dashboard-files id :is-shared] (constantly is-shared)) (d/update-in-when [:dashboard-recent-files id :is-shared] (constantly is-shared)) - (cond-> - (not is-shared) + (cond-> (not is-shared) (d/update-when :dashboard-shared-files dissoc id)))) ptk/WatchEvent @@ -909,7 +908,7 @@ (rx/ignore)))))) (defn set-file-thumbnail - [file-id thumbnail-uri] + [file-id thumbnail-id] (ptk/reify ::set-file-thumbnail ptk/UpdateEvent (update [_ state] @@ -917,10 +916,10 @@ (->> files (mapv #(cond-> % (= file-id (:id %)) - (assoc :thumbnail-uri thumbnail-uri)))))] + (assoc :thumbnail-id thumbnail-id)))))] (-> state - (d/update-in-when [:dashboard-files file-id] assoc :thumbnail-uri thumbnail-uri) - (d/update-in-when [:dashboard-recent-files file-id] assoc :thumbnail-uri thumbnail-uri) + (d/update-in-when [:dashboard-files file-id] assoc :thumbnail-id thumbnail-id) + (d/update-in-when [:dashboard-recent-files file-id] assoc :thumbnail-id thumbnail-id) (d/update-when :dashboard-search-result update-search-files)))))) ;; --- EVENT: create-file diff --git a/frontend/src/app/main/ui/dashboard/grid.cljs b/frontend/src/app/main/ui/dashboard/grid.cljs index dfffc9c669..b9a84fe3be 100644 --- a/frontend/src/app/main/ui/dashboard/grid.cljs +++ b/frontend/src/app/main/ui/dashboard/grid.cljs @@ -11,6 +11,7 @@ [app.common.data.macros :as dm] [app.common.geom.point :as gpt] [app.common.logging :as log] + [app.config :as cf] [app.main.data.dashboard :as dd] [app.main.data.messages :as msg] [app.main.features :as features] @@ -47,7 +48,7 @@ [file-id revn blob] (let [params {:file-id file-id :revn revn :media blob}] (->> (rp/cmd! :create-file-thumbnail params) - (rx/map :uri)))) + (rx/map :id)))) (defn render-thumbnail [file-id revn] @@ -71,15 +72,15 @@ (mf/defc grid-item-thumbnail {::mf/wrap-props false} - [{:keys [file-id revn thumbnail-uri background-color]}] + [{:keys [file-id revn thumbnail-id background-color]}] (let [container (mf/use-ref) visible? (h/use-visible container :once? true)] - (mf/with-effect [file-id revn visible? thumbnail-uri] - (when (and visible? (not thumbnail-uri)) + (mf/with-effect [file-id revn visible? thumbnail-id] + (when (and visible? (not thumbnail-id)) (->> (ask-for-thumbnail file-id revn) - (rx/subs! (fn [url] - (st/emit! (dd/set-file-thumbnail file-id url))) + (rx/subs! (fn [thumbnail-id] + (st/emit! (dd/set-file-thumbnail file-id thumbnail-id))) (fn [cause] (log/error :hint "unable to render thumbnail" :file-if file-id @@ -90,9 +91,9 @@ :style {:background-color background-color} :ref container} (when visible? - (if thumbnail-uri + (if thumbnail-id [:img {:class (stl/css :grid-item-thumbnail-image) - :src thumbnail-uri + :src (cf/resolve-media thumbnail-id) :loading "lazy" :decoding "async"}] i/loader-pencil))])) @@ -365,7 +366,7 @@ [:& grid-item-thumbnail {:file-id (:id file) :revn (:revn file) - :thumbnail-uri (:thumbnail-uri file) + :thumbnail-id (:thumbnail-id file) :background-color (dm/get-in file [:data :options :background])}]) (when (and (:is-shared file) (not library-view?)) From af389fe63a0b2ebc30b24fba17851ae8a6b7c6de Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 25 Jul 2024 15:46:08 +0200 Subject: [PATCH 2/3] :bug: Fix error reporting regression --- backend/src/app/http.clj | 2 +- backend/src/app/http/errors.clj | 12 ++++-------- backend/src/app/http/middleware.clj | 17 +++++++++-------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index c45c95c1cd..672d1ec60f 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -150,8 +150,8 @@ [["" {:middleware [[mw/server-timing] [mw/params] [mw/format-response] - [mw/errors errors/handle] [mw/parse-request] + [mw/errors errors/handle] [session/soft-auth cfg] [actoken/soft-auth cfg] [mw/restrict-methods]]} diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 14f4cb2233..8101db116c 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -14,32 +14,28 @@ [app.http :as-alias http] [app.http.access-token :as-alias actoken] [app.http.session :as-alias session] + [app.util.inet :as inet] [clojure.spec.alpha :as s] - [cuerdas.core :as str] [ring.request :as rreq] [ring.response :as rres])) -(defn- parse-client-ip - [request] - (or (some-> (rreq/get-header request "x-forwarded-for") (str/split ",") first) - (rreq/get-header request "x-real-ip") - (rreq/remote-addr request))) - (defn request->context "Extracts error report relevant context data from request." [request] (let [claims (-> {} (into (::session/token-claims request)) (into (::actoken/token-claims request)))] + {:request/path (:path request) :request/method (:method request) :request/params (:params request) :request/user-agent (rreq/get-header request "user-agent") - :request/ip-addr (parse-client-ip request) + :request/ip-addr (inet/parse-request request) :request/profile-id (:uid claims) :version/frontend (or (rreq/get-header request "x-frontend-version") "unknown") :version/backend (:full cf/version)})) + (defmulti handle-error (fn [cause _ _] (-> cause ex-data :type))) diff --git a/backend/src/app/http/middleware.clj b/backend/src/app/http/middleware.clj index a6eabd9a4f..f70e102adf 100644 --- a/backend/src/app/http/middleware.clj +++ b/backend/src/app/http/middleware.clj @@ -10,6 +10,7 @@ [app.common.logging :as l] [app.common.transit :as t] [app.config :as cf] + [app.http.errors :as errors] [clojure.data.json :as json] [cuerdas.core :as str] [ring.request :as rreq] @@ -70,12 +71,12 @@ :else request))) - (handle-error [cause] + (handle-error [cause request] (cond (instance? RuntimeException cause) (if-let [cause (ex-cause cause)] - (handle-error cause) - (throw cause)) + (handle-error cause request) + (errors/handle cause request)) (instance? RequestTooBigException cause) (ex/raise :type :validation @@ -89,14 +90,14 @@ :cause cause) :else - (throw cause)))] + (errors/handle cause request)))] (fn [request] (if (= (rreq/method request) :post) - (let [request (ex/try! (process-request request))] - (if (ex/exception? request) - (handle-error request) - (handler request))) + (try + (-> request process-request handler) + (catch Throwable cause + (handle-error cause request))) (handler request))))) (def parse-request From a261a57868fcf6831221197860802f822fb1b9b9 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 25 Jul 2024 15:46:36 +0200 Subject: [PATCH 3/3] :sparkles: Prevent double error asignation on persistence error --- frontend/src/app/main/data/persistence.cljs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/persistence.cljs b/frontend/src/app/main/data/persistence.cljs index 2e917e7844..9a17eda3fc 100644 --- a/frontend/src/app/main/data/persistence.cljs +++ b/frontend/src/app/main/data/persistence.cljs @@ -12,7 +12,6 @@ [app.common.uuid :as uuid] [app.main.data.changes :as dch] [app.main.repo :as rp] - [app.util.router :as rt] [beicon.v2.core :as rx] [potok.v2.core :as ptk])) @@ -131,8 +130,7 @@ (rx/concat (if (= :authentication (:type cause)) (rx/empty) - (rx/of (rt/assign-exception cause) - (ptk/data-event ::error cause) + (rx/of (ptk/data-event ::error cause) (update-status :error))) (rx/of (discard-persistence-state)) (rx/throw cause))))))))))