mirror of
https://github.com/penpot/penpot.git
synced 2025-05-26 01:16:11 +02:00
📎 Move repair and validate srepl helpers to srepl.main
This commit is contained in:
parent
43b8ccb52e
commit
c07dbc9843
2 changed files with 71 additions and 65 deletions
|
@ -15,9 +15,7 @@
|
||||||
[app.common.features :as cfeat]
|
[app.common.features :as cfeat]
|
||||||
[app.common.files.changes :as cpc]
|
[app.common.files.changes :as cpc]
|
||||||
[app.common.files.migrations :as fmg]
|
[app.common.files.migrations :as fmg]
|
||||||
[app.common.files.repair :as repair]
|
|
||||||
[app.common.files.validate :as cfv]
|
[app.common.files.validate :as cfv]
|
||||||
[app.common.files.validate :as validate]
|
|
||||||
[app.common.logging :as l]
|
[app.common.logging :as l]
|
||||||
[app.common.pprint :refer [pprint]]
|
[app.common.pprint :refer [pprint]]
|
||||||
[app.common.spec :as us]
|
[app.common.spec :as us]
|
||||||
|
@ -134,69 +132,6 @@
|
||||||
{:data data}
|
{:data data}
|
||||||
{:id id}))))
|
{:id id}))))
|
||||||
|
|
||||||
(defn validate-file
|
|
||||||
"Validate structure, referencial integrity and semantic coherence of
|
|
||||||
all contents of a file. Returns a list of errors."
|
|
||||||
[id]
|
|
||||||
(db/tx-run! main/system
|
|
||||||
(fn [{:keys [::db/conn] :as system}]
|
|
||||||
(let [id (if (string? id) (parse-uuid id) id)
|
|
||||||
file (get-file system id)
|
|
||||||
libs (->> (files/get-file-libraries conn id)
|
|
||||||
(into [file] (map (fn [{:keys [id]}]
|
|
||||||
(get-file system id))))
|
|
||||||
(d/index-by :id))]
|
|
||||||
(validate/validate-file file libs)))))
|
|
||||||
|
|
||||||
(defn repair-file*
|
|
||||||
"Internal helper for validate and repair the file. The operation is
|
|
||||||
applied multiple times untile file is fixed or max iteration counter
|
|
||||||
is reached (default 10)"
|
|
||||||
[system id & {:keys [max-iterations] :or {max-iterations 10}}]
|
|
||||||
(let [id (parse-uuid id)
|
|
||||||
|
|
||||||
validate-and-repair
|
|
||||||
(fn [file libs iteration]
|
|
||||||
(when-let [errors (not-empty (validate/validate-file file libs))]
|
|
||||||
(l/trc :hint "repairing file"
|
|
||||||
:file-id (str id)
|
|
||||||
:iteration iteration
|
|
||||||
:errors (count errors))
|
|
||||||
(let [changes (repair/repair-file file libs errors)]
|
|
||||||
(-> file
|
|
||||||
(update :revn inc)
|
|
||||||
(update :data cpc/process-changes changes)))))
|
|
||||||
|
|
||||||
process-file
|
|
||||||
(fn [file libs]
|
|
||||||
(loop [file file
|
|
||||||
iteration 0]
|
|
||||||
(if (> iteration max-iterations)
|
|
||||||
(do
|
|
||||||
(l/wrn :hint "max retry num reached on repairing file"
|
|
||||||
:file-id (str id)
|
|
||||||
:iteration iteration)
|
|
||||||
file)
|
|
||||||
(if-let [file (validate-and-repair file libs iteration)]
|
|
||||||
(recur file (inc iteration))
|
|
||||||
file))))]
|
|
||||||
|
|
||||||
(db/tx-run! system
|
|
||||||
(fn [{:keys [::db/conn] :as system}]
|
|
||||||
(let [file (get-file system id)
|
|
||||||
libs (->> (files/get-file-libraries conn id)
|
|
||||||
(into [file] (map (fn [{:keys [id]}]
|
|
||||||
(get-file system id))))
|
|
||||||
(d/index-by :id))
|
|
||||||
file (process-file file libs)]
|
|
||||||
(update-file! system file))))))
|
|
||||||
|
|
||||||
(defn repair-file!
|
|
||||||
"Repair the list of errors detected by validation."
|
|
||||||
[id & {:keys [rollback?] :or {rollback? true} :as opts}]
|
|
||||||
(let [system (or *system* (assoc main/system ::db/rollback rollback?))]
|
|
||||||
(repair-file* system id (dissoc opts :rollback?))))
|
|
||||||
|
|
||||||
(defn process-file*
|
(defn process-file*
|
||||||
[system file-id update-fn]
|
[system file-id update-fn]
|
||||||
(let [file (get-file system file-id)
|
(let [file (get-file system file-id)
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
[app.common.data :as d]
|
[app.common.data :as d]
|
||||||
[app.common.data.macros :as dm]
|
[app.common.data.macros :as dm]
|
||||||
[app.common.features :as cfeat]
|
[app.common.features :as cfeat]
|
||||||
|
[app.common.files.changes :as cpc]
|
||||||
|
[app.common.files.repair :as cfr]
|
||||||
|
[app.common.files.validate :as cfv]
|
||||||
[app.common.logging :as l]
|
[app.common.logging :as l]
|
||||||
[app.common.pprint :as p]
|
[app.common.pprint :as p]
|
||||||
[app.common.spec :as us]
|
[app.common.spec :as us]
|
||||||
|
@ -24,6 +27,7 @@
|
||||||
[app.main :as main]
|
[app.main :as main]
|
||||||
[app.msgbus :as mbus]
|
[app.msgbus :as mbus]
|
||||||
[app.rpc.commands.auth :as auth]
|
[app.rpc.commands.auth :as auth]
|
||||||
|
[app.rpc.commands.files :as files]
|
||||||
[app.rpc.commands.files-snapshot :as fsnap]
|
[app.rpc.commands.files-snapshot :as fsnap]
|
||||||
[app.rpc.commands.management :as mgmt]
|
[app.rpc.commands.management :as mgmt]
|
||||||
[app.rpc.commands.profile :as profile]
|
[app.rpc.commands.profile :as profile]
|
||||||
|
@ -383,6 +387,73 @@
|
||||||
(-> (assoc main/system ::db/rollback rollback?)
|
(-> (assoc main/system ::db/rollback rollback?)
|
||||||
(db/tx-run! restore-snapshot))))
|
(db/tx-run! restore-snapshot))))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; FILE VALIDATION & REPAIR
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defn validate-file
|
||||||
|
"Validate structure, referencial integrity and semantic coherence of
|
||||||
|
all contents of a file. Returns a list of errors."
|
||||||
|
[id]
|
||||||
|
(db/tx-run! main/system
|
||||||
|
(fn [{:keys [::db/conn] :as system}]
|
||||||
|
(let [id (if (string? id) (parse-uuid id) id)
|
||||||
|
file (h/get-file system id)
|
||||||
|
libs (->> (files/get-file-libraries conn id)
|
||||||
|
(into [file] (map (fn [{:keys [id]}]
|
||||||
|
(h/get-file system id))))
|
||||||
|
(d/index-by :id))]
|
||||||
|
(cfv/validate-file file libs)))))
|
||||||
|
|
||||||
|
(defn repair-file*
|
||||||
|
"Internal helper for validate and repair the file. The operation is
|
||||||
|
applied multiple times untile file is fixed or max iteration counter
|
||||||
|
is reached (default 10)"
|
||||||
|
[system id & {:keys [max-iterations] :or {max-iterations 10}}]
|
||||||
|
(let [id (parse-uuid id)
|
||||||
|
|
||||||
|
validate-and-repair
|
||||||
|
(fn [file libs iteration]
|
||||||
|
(when-let [errors (not-empty (cfv/validate-file file libs))]
|
||||||
|
(l/trc :hint "repairing file"
|
||||||
|
:file-id (str id)
|
||||||
|
:iteration iteration
|
||||||
|
:errors (count errors))
|
||||||
|
(let [changes (cfr/repair-file file libs errors)]
|
||||||
|
(-> file
|
||||||
|
(update :revn inc)
|
||||||
|
(update :data cpc/process-changes changes)))))
|
||||||
|
|
||||||
|
process-file
|
||||||
|
(fn [file libs]
|
||||||
|
(loop [file file
|
||||||
|
iteration 0]
|
||||||
|
(if (< iteration max-iterations)
|
||||||
|
(if-let [file (validate-and-repair file libs iteration)]
|
||||||
|
(recur file (inc iteration))
|
||||||
|
file)
|
||||||
|
(do
|
||||||
|
(l/wrn :hint "max retry num reached on repairing file"
|
||||||
|
:file-id (str id)
|
||||||
|
:iteration iteration)
|
||||||
|
file))))]
|
||||||
|
|
||||||
|
(db/tx-run! system
|
||||||
|
(fn [{:keys [::db/conn] :as system}]
|
||||||
|
(let [file (h/get-file system id)
|
||||||
|
libs (->> (files/get-file-libraries conn id)
|
||||||
|
(into [file] (map (fn [{:keys [id]}]
|
||||||
|
(h/get-file system id))))
|
||||||
|
(d/index-by :id))
|
||||||
|
file (process-file file libs)]
|
||||||
|
(h/update-file! system file))))))
|
||||||
|
|
||||||
|
(defn repair-file!
|
||||||
|
"Repair the list of errors detected by validation."
|
||||||
|
[file-id & {:keys [rollback?] :or {rollback? true} :as opts}]
|
||||||
|
(let [system (assoc main/system ::db/rollback rollback?)]
|
||||||
|
(repair-file* system file-id (dissoc opts :rollback?))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; MISC
|
;; MISC
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue