Add general features handling improvements

This commit is contained in:
Andrey Antukh 2023-12-13 21:17:28 +01:00
parent bdb1742d59
commit 611594a392
6 changed files with 149 additions and 126 deletions

View file

@ -769,7 +769,7 @@
fdata (migrate-graphics fdata)] fdata (migrate-graphics fdata)]
(update fdata :options assoc :components-v2 true))))) (update fdata :options assoc :components-v2 true)))))
(defn- process-fdata (defn- prepare-fdata
[fdata id] [fdata id]
(-> fdata (-> fdata
(assoc :id id) (assoc :id id)
@ -788,12 +788,10 @@
(defn- process-file (defn- process-file
[{:keys [::db/conn] :as system} id & {:keys [validate? throw-on-validate?]}] [{:keys [::db/conn] :as system} id & {:keys [validate? throw-on-validate?]}]
(binding [pmap/*tracked* (pmap/create-tracked) (let [file (binding [cfeat/*new* (atom #{})
pmap/*load-fn* (partial fdata/load-pointer *system* id)] pmap/*load-fn* (partial fdata/load-pointer system id)]
(let [file (binding [cfeat/*new* (atom #{})]
(-> (files/get-file system id :migrate? false) (-> (files/get-file system id :migrate? false)
(update :data process-fdata id) (update :data prepare-fdata id)
(update :features into (deref cfeat/*new*)) (update :features into (deref cfeat/*new*))
(update :features cfeat/migrate-legacy-features))) (update :features cfeat/migrate-legacy-features)))
@ -801,30 +799,35 @@
(into [file] (map (fn [{:keys [id]}] (into [file] (map (fn [{:keys [id]}]
(binding [pmap/*load-fn* (partial fdata/load-pointer system id)] (binding [pmap/*load-fn* (partial fdata/load-pointer system id)]
(-> (files/get-file system id :migrate? false) (-> (files/get-file system id :migrate? false)
(update :data process-fdata id)))))) (update :data prepare-fdata id))))))
(d/index-by :id)) (d/index-by :id))
pmap? (contains? (:features file) "fdata/pointer-map")
file (-> file file (-> file
(update :data migrate-fdata libs) (update :data migrate-fdata libs)
(update :features conj "components/v2") (update :features conj "components/v2"))
(cond-> pmap? (fdata/enable-pointer-map)))
]
(when validate? _ (when validate?
(validate-file! file libs throw-on-validate?)) (validate-file! file libs throw-on-validate?))
file (if (contains? (:features file) "fdata/objects-map")
(fdata/enable-objects-map file)
file)
file (if (contains? (:features file) "fdata/pointer-map")
(binding [pmap/*tracked* (pmap/create-tracked)]
(let [file (fdata/enable-pointer-map file)]
(fdata/persist-pointers! system id)
file))
file)]
(db/update! conn :file (db/update! conn :file
{:data (blob/encode (:data file)) {:data (blob/encode (:data file))
:features (db/create-array conn "text" (:features file)) :features (db/create-array conn "text" (:features file))
:revn (:revn file)} :revn (:revn file)}
{:id (:id file)}) {:id (:id file)}
{::db/return-keys? false})
(when pmap? (dissoc file :data)))
(fdata/persist-pointers! system id))
(dissoc file :data))))
(defn migrate-file! (defn migrate-file!
[system file-id & {:keys [validate? throw-on-validate?]}] [system file-id & {:keys [validate? throw-on-validate?]}]

View file

@ -701,6 +701,25 @@
(update :object-id #(str/replace-first % #"^(.*?)/" (str file-id "/"))))) (update :object-id #(str/replace-first % #"^(.*?)/" (str file-id "/")))))
thumbnails)) thumbnails))
(defn- process-fdata
[fdata id]
(-> fdata
(dissoc :recent-colors)
(assoc :id id)
(cond-> (> (:version fdata) cfd/version)
(assoc :version cfd/version))
;; FIXME: We're temporarily activating all
;; migrations because a problem in the
;; environments messed up with the version
;; numbers When this problem is fixed delete
;; the following line
(assoc :version 22)
(pmg/migrate-data)
(update :pages-index relink-shapes)
(update :components relink-shapes)
(update :media relink-media)))
(defmethod read-section :v1/files (defmethod read-section :v1/files
[{:keys [::db/conn ::input ::project-id ::enabled-features ::timestamp ::overwrite?] :as system}] [{:keys [::db/conn ::input ::project-id ::enabled-features ::timestamp ::overwrite?] :as system}]
@ -754,54 +773,36 @@
(l/dbg :hint "update media references" ::l/sync? true) (l/dbg :hint "update media references" ::l/sync? true)
(vswap! *state* update :media into (map #(update % :id lookup-index)) media)) (vswap! *state* update :media into (map #(update % :id lookup-index)) media))
(binding [pmap/*tracked* (pmap/create-tracked) (let [file (binding [cfeat/*new* (atom #{})]
cfeat/*new* (atom #{})] (-> file
(let [file (-> file
(assoc :id file-id') (assoc :id file-id')
(assoc :features features) (assoc :features features)
(assoc :project-id project-id) (assoc :project-id project-id)
(assoc :created-at timestamp) (assoc :created-at timestamp)
(assoc :modified-at timestamp) (assoc :modified-at timestamp)
(dissoc :thumbnails) (dissoc :thumbnails)
(update :data (fn [data] (update :data process-fdata file-id')
(-> data (update :features into (deref cfeat/*new*))))
(dissoc :recent-colors)
(assoc :id file-id')
(cond-> (> (:version data) cfd/version)
(assoc :version cfd/version))
;; FIXME: We're temporarily activating all _ (when (contains? cf/flags :file-schema-validation)
;; migrations because a problem in the (fval/validate-file-schema! file))
;; environments messed up with the version
;; numbers When this problem is fixed delete
;; the following line
(assoc :version 22)
(update :pages-index relink-shapes)
(update :components relink-shapes)
(update :media relink-media)
(pmg/migrate-data)
(d/without-nils)))))
;; Add to file features all possible features added on
;; migration process.
file (update file :features into (deref cfeat/*new*))
file (if (contains? cf/flags :file-schema-validation)
(fval/validate-file-schema! file)
file)
_ (when (contains? cf/flags :soft-file-schema-validation) _ (when (contains? cf/flags :soft-file-schema-validation)
(try (let [result (ex/try! (fval/validate-file-schema! file))]
(fval/validate-file-schema! file) (when (ex/exception? result)
(catch Throwable cause (l/error :hint "file schema validation error" :cause result))))
(l/error :hint "file schema validation error" :cause cause))))
file (cond-> file file (if (contains? (:features file) "fdata/objects-map")
(contains? (:features file) "fdata/objects-map") (feat.fdata/enable-objects-map file)
(feat.fdata/enable-objects-map) file)
file (if (contains? (:features file) "fdata/pointer-map")
(binding [pmap/*tracked* (pmap/create-tracked)]
(let [file (feat.fdata/enable-pointer-map file)]
(feat.fdata/persist-pointers! system file-id')
file))
file)
(contains? (:features file) "fdata/pointer-map")
(feat.fdata/enable-pointer-map))
file (-> file file (-> file
(update :features #(db/create-array conn "text" %)) (update :features #(db/create-array conn "text" %))
@ -813,12 +814,10 @@
(create-or-update-file! conn file) (create-or-update-file! conn file)
(db/insert! conn :file file)) (db/insert! conn :file file))
(feat.fdata/persist-pointers! system file-id')
(when overwrite? (when overwrite?
(db/delete! conn :file-thumbnail {:file-id file-id'})) (db/delete! conn :file-thumbnail {:file-id file-id'}))
file-id'))))) file-id'))))
(defmethod read-section :v1/rels (defmethod read-section :v1/rels
[{:keys [::db/conn ::input ::timestamp]}] [{:keys [::db/conn ::input ::timestamp]}]

View file

@ -34,7 +34,6 @@
[app.util.pointer-map :as pmap] [app.util.pointer-map :as pmap]
[app.util.services :as sv] [app.util.services :as sv]
[app.util.time :as dt] [app.util.time :as dt]
[clojure.set :as set]
[clojure.spec.alpha :as s] [clojure.spec.alpha :as s]
[cuerdas.core :as str])) [cuerdas.core :as str]))
@ -227,7 +226,10 @@
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id) (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)
pmap/*tracked* (pmap/create-tracked) pmap/*tracked* (pmap/create-tracked)
cfeat/*new* (atom #{})] cfeat/*new* (atom #{})]
(let [file (fmg/migrate-file file)] (let [file (-> (fmg/migrate-file file)
(update :features into (deref cfeat/*new*))
(update :features cfeat/migrate-legacy-features))]
;; NOTE: when file is migrated, we break the rule of no perform ;; NOTE: when file is migrated, we break the rule of no perform
;; mutations on get operations and update the file with all ;; mutations on get operations and update the file with all
;; migrations applied ;; migrations applied
@ -235,16 +237,17 @@
;; NOTE: the following code will not work on read-only mode, it ;; NOTE: the following code will not work on read-only mode, it
;; is a known issue; we keep is not implemented until we really ;; is a known issue; we keep is not implemented until we really
;; need this ;; need this
(if (fmg/migrated? file) (when (fmg/migrated? file)
(let [file (update file :features cfeat/migrate-legacy-features)
features (set/union (deref cfeat/*new*) (:features file))]
(db/update! conn :file (db/update! conn :file
{:data (blob/encode (:data file)) {:data (blob/encode (:data file))
:features (db/create-array conn "text" features)} :features (db/create-array conn "text" (:features file))}
{:id id}) {:id id}
(feat.fdata/persist-pointers! cfg id) {::db/return-keys? false})
(assoc file :features features))
file)))) (when (contains? (:features file) "fdata/pointer-map")
(feat.fdata/persist-pointers! cfg id)))
file)))
(defn get-file (defn get-file
[{:keys [::db/conn] :as cfg} id & {:keys [project-id migrate? [{:keys [::db/conn] :as cfg} id & {:keys [project-id migrate?

View file

@ -182,9 +182,6 @@
(defn update-file (defn update-file
[{:keys [::db/conn ::mtx/metrics] :as cfg} [{:keys [::db/conn ::mtx/metrics] :as cfg}
{:keys [id file features changes changes-with-metadata] :as params}] {:keys [id file features changes changes-with-metadata] :as params}]
(binding [cfeat/*current* features
cfeat/*previous* (:features file)]
(let [features (-> features (let [features (-> features
(set/difference cfeat/frontend-only-features) (set/difference cfeat/frontend-only-features)
(set/union (:features file))) (set/union (:features file)))
@ -216,6 +213,8 @@
{:features features} {:features features}
{:id id}))) {:id id})))
(binding [cfeat/*current* features
cfeat/*previous* (:features file)]
(let [file (assoc file :features features) (let [file (assoc file :features features)
params (-> params params (-> params
(assoc :file file) (assoc :file file)

View file

@ -109,23 +109,37 @@
(update-fdata [fdata new-id] (update-fdata [fdata new-id]
(-> fdata (-> fdata
(assoc :id new-id) (assoc :id new-id)
(feat.fdata/process-pointers deref)
(pmg/migrate-data) (pmg/migrate-data)
(update :pages-index relink-shapes) (update :pages-index relink-shapes)
(update :components relink-shapes) (update :components relink-shapes)
(update :media relink-media) (update :media relink-media)
(d/without-nils) (d/without-nils)))]
(feat.fdata/process-pointers pmap/clone)))]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id) (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)
pmap/*tracked* (pmap/create-tracked) pmap/*tracked* (pmap/create-tracked)
cfeat/*new* (atom #{})] cfeat/*new* (atom #{})]
(let [new-id (get index id) (let [new-id (get index id)
file (-> file file (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)
cfeat/*new* (atom #{})]
(-> file
(assoc :id new-id) (assoc :id new-id)
(update :data update-fdata new-id) (update :data update-fdata new-id)
(update :features into (deref cfeat/*new*)) (update :features into (deref cfeat/*new*))
(update :features cfeat/migrate-legacy-features))] (update :features cfeat/migrate-legacy-features)))
(feat.fdata/persist-pointers! cfg new-id)
file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
file (if (contains? (:features file) "fdata/pointer-map")
(binding [pmap/*tracked* (pmap/create-tracked)]
(let [file (feat.fdata/enable-pointer-map file)]
(feat.fdata/persist-pointers! cfg (:id file))
file))
file)]
file)))) file))))
(def sql:get-used-libraries (def sql:get-used-libraries
@ -191,20 +205,22 @@
(db/insert! conn :file (db/insert! conn :file
(-> file (-> file
(update :features #(db/create-array conn "text" %)) (update :features #(db/create-array conn "text" %))
(update :data blob/encode))) (update :data blob/encode))
{::db/return-keys? false})
(db/insert! conn :file-profile-rel (db/insert! conn :file-profile-rel
{:file-id (:id file) {:file-id (:id file)
:profile-id profile-id :profile-id profile-id
:is-owner true :is-owner true
:is-admin true :is-admin true
:can-edit true}) :can-edit true}
{::db/return-keys? false})
(doseq [params flibs] (doseq [params flibs]
(db/insert! conn :file-library-rel params)) (db/insert! conn :file-library-rel params ::db/return-keys? false))
(doseq [params fmeds] (doseq [params fmeds]
(db/insert! conn :file-media-object params)) (db/insert! conn :file-media-object params ::db/return-keys? false))
file)) file))

View file

@ -51,7 +51,10 @@
"layout/grid"}) "layout/grid"})
;; A set of features enabled by default for each file, they are ;; A set of features enabled by default for each file, they are
;; implicit and are enabled by default and can't be disabled ;; implicit and are enabled by default and can't be disabled. The
;; features listed in this set are mainly freatures addedby file
;; migrations process, so all features referenced in migrations should
;; be here.
(def default-enabled-features (def default-enabled-features
#{"fdata/shape-data-type"}) #{"fdata/shape-data-type"})