From 25c5bb2019cb7917fd5fe81adefb17156114c49a Mon Sep 17 00:00:00 2001 From: Dexterity <173429049+Dexterity104@users.noreply.github.com> Date: Thu, 30 Apr 2026 02:35:02 -0400 Subject: [PATCH] :zap: Restore deleted team files in bulk instead of per file (#9248) --- backend/src/app/rpc/commands/files.clj | 74 ++++++++++++++------------ 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index 0ef8bec466..a2075a2807 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -1226,38 +1226,43 @@ AND t.id = ? AND f.id = ANY(?::uuid[])") +(def ^:private sql:restore-files + "UPDATE file SET deleted_at = null, has_media_trimmed = false + WHERE id = ANY(?::uuid[])") + +(def ^:private sql:restore-file-media-objects + "UPDATE file_media_object SET deleted_at = null + WHERE file_id = ANY(?::uuid[])") + +(def ^:private sql:restore-file-changes + "UPDATE file_change SET deleted_at = null + WHERE file_id = ANY(?::uuid[])") + +(def ^:private sql:restore-file-data + "UPDATE file_data SET deleted_at = null + WHERE file_id = ANY(?::uuid[])") + +(def ^:private sql:restore-file-thumbnails + "UPDATE file_thumbnail SET deleted_at = null + WHERE file_id = ANY(?::uuid[])") + +(def ^:private sql:restore-file-tagged-object-thumbnails + "UPDATE file_tagged_object_thumbnail SET deleted_at = null + WHERE file_id = ANY(?::uuid[])") + +(defn- restore-files + [conn file-ids] + (let [file-ids (db/create-array conn "uuid" file-ids)] + (db/exec-one! conn [sql:restore-files file-ids]) + (db/exec-one! conn [sql:restore-file-media-objects file-ids]) + (db/exec-one! conn [sql:restore-file-changes file-ids]) + (db/exec-one! conn [sql:restore-file-data file-ids]) + (db/exec-one! conn [sql:restore-file-thumbnails file-ids]) + (db/exec-one! conn [sql:restore-file-tagged-object-thumbnails file-ids]))) + (defn- restore-file [conn file-id] - (db/update! conn :file - {:deleted-at nil - :has-media-trimmed false} - {:id file-id} - {::db/return-keys false}) - - (db/update! conn :file-media-object - {:deleted-at nil} - {:file-id file-id} - {::db/return-keys false}) - - (db/update! conn :file-change - {:deleted-at nil} - {:file-id file-id} - {::db/return-keys false}) - - (db/update! conn :file-data - {:deleted-at nil} - {:file-id file-id} - {::db/return-keys false}) - - (db/update! conn :file-thumbnail - {:deleted-at nil} - {:file-id file-id} - {::db/return-keys false}) - - (db/update! conn :file-tagged-object-thumbnail - {:deleted-at nil} - {:file-id file-id} - {::db/return-keys false})) + (restore-files conn [file-id])) (def ^:private sql:restore-projects "UPDATE project SET deleted_at = null WHERE id = ANY(?::uuid[])") @@ -1278,17 +1283,18 @@ (reduce (fn [result {:keys [id project-id]}] (let [index (-> result :files count)] (events/tap :progress {:file-id id :index (inc index) :total total-files}) - (restore-file conn id) - (-> result (update :files conj id) (update :projects conj project-id)))) - {:files #{} :projects #{}} (db/plan conn [sql:resolve-editable-files team-id (db/create-array conn "uuid" ids)]))] - (restore-projects conn projects) + (when (seq files) + (restore-files conn files)) + + (when (seq projects) + (restore-projects conn projects)) files))