From ce234fbeda74dd17a56a56d3304109978188f38a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 22 Dec 2025 12:30:39 +0100 Subject: [PATCH] :sparkles: Allow get thumbnails for deleted files --- backend/src/app/http/assets.clj | 2 +- backend/src/app/rpc/commands/files.clj | 12 +++++------ .../src/app/rpc/commands/files_thumbnails.clj | 21 ++++++++++++------- backend/src/app/rpc/commands/viewer.clj | 1 - 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/backend/src/app/http/assets.clj b/backend/src/app/http/assets.clj index 7a33e17527..c716ce8b85 100644 --- a/backend/src/app/http/assets.clj +++ b/backend/src/app/http/assets.clj @@ -30,7 +30,7 @@ (defn- get-file-media-object [pool id] - (db/get pool :file-media-object {:id id})) + (db/get pool :file-media-object {:id id} {::db/remove-deleted false})) (defn- serve-object-from-s3 [{:keys [::sto/storage] :as cfg} obj] diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index 6fadfae4fe..de7a027e96 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -688,11 +688,10 @@ "Get libraries used by the specified file." {::doc/added "1.17" ::sm/params schema:get-file-libraries} - [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id]}] - (dm/with-open [conn (db/open pool)] - (check-read-permissions! conn profile-id file-id) - (bfc/get-file-libraries conn file-id))) - + [cfg {:keys [::rpc/profile-id file-id]}] + (bfc/check-file-exists cfg file-id) + (check-read-permissions! cfg profile-id file-id) + (bfc/get-file-libraries cfg file-id)) ;; --- COMMAND QUERY: Files that use this File library @@ -785,8 +784,7 @@ FROM file AS f INNER JOIN project AS p ON (p.id = f.project_id) LEFT JOIN file_thumbnail AS ft on (ft.file_id = f.id - AND ft.revn = f.revn - AND ft.deleted_at is null) + AND ft.revn = f.revn) WHERE p.team_id = ? AND (p.deleted_at > ?::timestamptz OR f.deleted_at > ?::timestamptz) diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index f9e7318b3b..0e318645d4 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -199,15 +199,13 @@ [cfg {:keys [::rpc/profile-id file-id strip-frames-with-thumbnails] :as params}] (db/run! cfg (fn [{:keys [::db/conn] :as cfg}] (files/check-read-permissions! conn profile-id file-id) - (let [team (teams/get-team conn :profile-id profile-id :file-id file-id) - file (bfc/get-file cfg file-id + :include-deleted? true :realize? true :read-only? true) - strip-frames-with-thumbnails (or (nil? strip-frames-with-thumbnails) ;; if not present, default to true (true? strip-frames-with-thumbnails))] @@ -333,12 +331,16 @@ ;; --- MUTATION COMMAND: create-file-thumbnail -(defn- create-file-thumbnail! - [{:keys [::db/conn ::sto/storage]} {:keys [file-id revn props media] :as params}] +(defn- create-file-thumbnail + [{:keys [::db/conn ::sto/storage] :as cfg} {:keys [file-id revn props media] :as params}] (media/validate-media-type! media) (media/validate-media-size! media) - (let [props (db/tjson (or props {})) + (let [file (bfc/get-file cfg file-id + :include-deleted? true + :load-data? false) + + props (db/tjson (or props {})) path (:path media) mtype (:mtype media) hash (sto/calculate-hash path) @@ -367,7 +369,7 @@ (db/update! conn :file-thumbnail {:media-id (:id media) - :deleted-at nil + :deleted-at (:deleted-at file) :updated-at tnow :props props} {:file-id file-id @@ -378,6 +380,7 @@ :revn revn :created-at tnow :updated-at tnow + :deleted-at (:deleted-at file) :props props :media-id (:id media)})) @@ -402,6 +405,8 @@ ::rtry/when rtry/conflict-exception? ::sm/params schema:create-file-thumbnail} + ;; FIXME: do not run the thumbnail upload inside a transaction + [cfg {:keys [::rpc/profile-id file-id] :as params}] (db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}] ;; TODO For now we check read permissions instead of write, @@ -409,6 +414,6 @@ ;; review this approach on the future. (files/check-read-permissions! conn profile-id file-id) (when-not (db/read-only? conn) - (let [media (create-file-thumbnail! cfg params)] + (let [media (create-file-thumbnail cfg params)] {:uri (files/resolve-public-uri (:id media)) :id (:id media)}))))) diff --git a/backend/src/app/rpc/commands/viewer.clj b/backend/src/app/rpc/commands/viewer.clj index a1025b6dbf..49d901979f 100644 --- a/backend/src/app/rpc/commands/viewer.clj +++ b/backend/src/app/rpc/commands/viewer.clj @@ -13,7 +13,6 @@ [app.config :as cf] [app.db :as db] [app.rpc :as-alias rpc] - [app.rpc.commands.files :as files] [app.rpc.commands.teams :as teams] [app.rpc.cond :as-alias cond] [app.rpc.doc :as-alias doc]