diff --git a/backend/src/app/binfile/common.clj b/backend/src/app/binfile/common.clj index 739b272e1..b272a87b3 100644 --- a/backend/src/app/binfile/common.clj +++ b/backend/src/app/binfile/common.clj @@ -52,6 +52,15 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(def file-attrs + #{:id + :name + :features + :project-id + :is-shared + :version + :data}) + (def xf-map-id (map :id)) @@ -129,10 +138,11 @@ (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)] (when-let [file (db/get* conn :file {:id file-id} {::db/remove-deleted false})] - (-> file - (decode-row) - (update :data feat.fdata/process-pointers deref) - (update :data feat.fdata/process-objects (partial into {})))))))) + (let [file (feat.fdata/resolve-file-data cfg file)] + (-> file + (decode-row) + (update :data feat.fdata/process-pointers deref) + (update :data feat.fdata/process-objects (partial into {}))))))))) (defn clean-file-features [file] diff --git a/backend/src/app/binfile/v3.clj b/backend/src/app/binfile/v3.clj index b191fc764..ff2d620b5 100644 --- a/backend/src/app/binfile/v3.clj +++ b/backend/src/app/binfile/v3.clj @@ -56,7 +56,6 @@ [:map [:id ::sm/uuid] [:name :string] - [:project-id ::sm/uuid] [:features ::cfeat/features]]]] [:relations {:optional true} @@ -79,10 +78,15 @@ [:tag :string] [:media-id ::sm/uuid]]) +(def ^:private schema:file + [:merge + ctf/schema:file + [:map [:options {:optional true} ctf/schema:options]]]) + ;; --- ENCODERS (def encode-file - (sm/encoder ::ctf/file sm/json-transformer)) + (sm/encoder schema:file sm/json-transformer)) (def encode-page (sm/encoder ::ctp/page sm/json-transformer)) @@ -126,7 +130,7 @@ (sm/decoder ::ctcl/color sm/json-transformer)) (def decode-file - (sm/decoder ::ctf/file sm/json-transformer)) + (sm/decoder schema:file sm/json-transformer)) (def decode-page (sm/decoder ::ctp/page sm/json-transformer)) @@ -198,8 +202,9 @@ (throw (IllegalArgumentException. "the `include-libraries` and `embed-assets` are mutally excluding options"))) - (let [detach? (and (not embed-assets) (not include-libraries))] - (cond-> (bfc/get-file cfg file-id) + (let [detach? (and (not embed-assets) (not include-libraries)) + file (bfc/get-file cfg file-id)] + (cond-> file detach? (-> (ctf/detach-external-references file-id) (dissoc :libraries)) @@ -263,13 +268,16 @@ (vswap! bfc/*state* update :files assoc file-id {:id file-id - :project-id (:project-id file) :name (:name file) :features (:features file)}) - (let [file (cond-> (dissoc file :data) + (let [file (cond-> (select-keys file bfc/file-attrs) (:options data) (assoc :options (:options data)) + + :always + (dissoc :data) + :always (encode-file)) path (str "files/" file-id ".json")] @@ -623,7 +631,7 @@ (not-empty))) (defn- read-file-data - [{:keys [] :as cfg}] + [cfg] (let [colors (read-file-colors cfg) typographies (read-file-typographies cfg) components (read-file-components cfg) @@ -678,7 +686,7 @@ (cond-> (:options file) (assoc :options (:options file)))) - file (-> file + file (-> (select-keys file bfc/file-attrs) (assoc :id file-id') (assoc :data data) (assoc :name file-name) diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index 8236631ef..fa52b75ac 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -63,10 +63,15 @@ (def schema:pages-index [:map-of {:gen/max 5} ::sm/uuid ::ctp/page]) +(def schema:options + [:map {:title "FileOptions"} + [:components-v2 {:optional true} ::sm/boolean]]) + (def schema:data [:map {:title "FileData"} [:pages [:vector ::sm/uuid]] [:pages-index schema:pages-index] + [:options {:optional true} schema:options] [:colors {:optional true} schema:colors] [:components {:optional true} schema:components] [:typographies {:optional true} schema:typographies] @@ -78,7 +83,15 @@ because sometimes we want to validate file without the data." [:map {:title "file"} [:id ::sm/uuid] + [:revn {:optional true} :int] + [:vern {:optional true} :int] + [:created-at {:optional true} ::sm/inst] + [:modified-at {:optional true} ::sm/inst] + [:deleted-at {:optional true} ::sm/inst] + [:project-id {:optional true} ::sm/uuid] + [:is-shared {:optional true} ::sm/boolean] [:data {:optional true} schema:data] + [:version :int] [:features ::cfeat/features]]) (sm/register! ::data schema:data)