From 77741b49a79add8b8b8c49f79434e6c20108e878 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 4 Jul 2025 11:01:25 +0200 Subject: [PATCH] :sparkles: Add tracking for referer on the import-binfile --- backend/src/app/binfile/v3.clj | 43 ++++++++++++------------ backend/src/app/rpc/commands/binfile.clj | 17 +++++++--- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/backend/src/app/binfile/v3.clj b/backend/src/app/binfile/v3.clj index f90ff08621..7208a54f39 100644 --- a/backend/src/app/binfile/v3.clj +++ b/backend/src/app/binfile/v3.clj @@ -12,7 +12,6 @@ [app.binfile.common :as bfc] [app.binfile.migrations :as bfm] [app.common.data :as d] - [app.common.data.macros :as dm] [app.common.exceptions :as ex] [app.common.features :as cfeat] [app.common.files.migrations :as-alias fmg] @@ -373,6 +372,7 @@ params {:type "penpot/export-files" :version 1 :generated-by (str "penpot/" (:full cf/version)) + :refer "penpot" :files (vec (vals files)) :relations rels}] (write-entry! output "manifest.json" params)))) @@ -878,13 +878,8 @@ (defn- import-files [{:keys [::bfc/timestamp ::bfc/input ::bfc/name] :or {timestamp (dt/now)} :as cfg}] - (dm/assert! - "expected zip file" - (instance? ZipFile input)) - - (dm/assert! - "expected valid instant" - (dt/instant? timestamp)) + (assert (instance? ZipFile input) "expected zip file") + (assert (dt/instant? timestamp) "expected valid instant") (let [manifest (-> (read-manifest input) (validate-manifest)) @@ -896,6 +891,7 @@ :hint "unexpected type on manifest" :manifest manifest)) + ;; Check if all files referenced on manifest are present (doseq [{file-id :id features :features} (:files manifest)] (let [path (str "files/" file-id ".json")] @@ -956,14 +952,13 @@ [{:keys [::bfc/ids] :as cfg} output] - (dm/assert! - "expected a set of uuid's for `::bfc/ids` parameter" - (and (set? ids) - (every? uuid? ids))) + (assert + (and (set? ids) (every? uuid? ids)) + "expected a set of uuid's for `::bfc/ids` parameter") - (dm/assert! - "expected instance of jio/IOFactory for `input`" - (satisfies? jio/IOFactory output)) + (assert + (satisfies? jio/IOFactory output) + "expected instance of jio/IOFactory for `input`") (let [id (uuid/next) tp (dt/tpoint) @@ -1002,14 +997,14 @@ (defn import-files! [{:keys [::bfc/input] :as cfg}] - (dm/assert! - "expected valid profile-id and project-id on `cfg`" + (assert (and (uuid? (::bfc/profile-id cfg)) - (uuid? (::bfc/project-id cfg)))) + (uuid? (::bfc/project-id cfg))) + "expected valid profile-id and project-id on `cfg`") - (dm/assert! - "expected instance of jio/IOFactory for `input`" - (io/coercible? input)) + (assert + (io/coercible? input) + "expected instance of jio/IOFactory for `input`") (let [id (uuid/next) tp (dt/tpoint) @@ -1029,3 +1024,9 @@ :id (str id) :elapsed (dt/format-duration (tp)) :error? (some? @cs)))))) + +(defn get-manifest + [path] + (with-open [input (ZipFile. (fs/file path))] + (-> (read-manifest input) + (validate-manifest)))) diff --git a/backend/src/app/rpc/commands/binfile.clj b/backend/src/app/rpc/commands/binfile.clj index 60b524ee38..0dc301c71e 100644 --- a/backend/src/app/rpc/commands/binfile.clj +++ b/backend/src/app/rpc/commands/binfile.clj @@ -134,11 +134,18 @@ ::webhooks/event? true ::sse/stream? true ::sm/params schema:import-binfile} - [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id version] :as params}] + [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id version file] :as params}] (projects/check-edition-permissions! pool profile-id project-id) - (let [params (-> params - (assoc :profile-id profile-id) - (assoc :version (or version 1)))] + (let [version (or version 1) + params (-> params + (assoc :profile-id profile-id) + (assoc :version version)) + manifest (case (int version) + 1 nil + 3 (bf.v3/get-manifest (:path file)))] + (with-meta (sse/response (partial import-binfile cfg params)) - {::audit/props {:file nil}}))) + {::audit/props {:file nil + :generated-by (:generated-by manifest) + :referer (:referer manifest)}})))