mirror of
https://github.com/penpot/penpot.git
synced 2025-06-10 12:51:38 +02:00
🐛 Fix importation of zip files
This commit is contained in:
parent
aadd312e39
commit
fbdba39be9
3 changed files with 64 additions and 35 deletions
|
@ -7,21 +7,26 @@
|
||||||
(ns app.rpc.commands.files-temp
|
(ns app.rpc.commands.files-temp
|
||||||
(:require
|
(:require
|
||||||
[app.common.exceptions :as ex]
|
[app.common.exceptions :as ex]
|
||||||
|
[app.common.features :as cfeat]
|
||||||
[app.common.pages :as cp]
|
[app.common.pages :as cp]
|
||||||
[app.common.spec :as us]
|
[app.common.spec :as us]
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
|
[app.config :as cf]
|
||||||
[app.db :as db]
|
[app.db :as db]
|
||||||
[app.rpc :as-alias rpc]
|
[app.rpc :as-alias rpc]
|
||||||
[app.rpc.commands.files :as files]
|
[app.rpc.commands.files :as files]
|
||||||
[app.rpc.commands.files-create :refer [create-file]]
|
[app.rpc.commands.files-create :as files.create]
|
||||||
[app.rpc.commands.files-update :as-alias files.update]
|
[app.rpc.commands.files-update :as-alias files.update]
|
||||||
[app.rpc.commands.projects :as projects]
|
[app.rpc.commands.projects :as projects]
|
||||||
|
[app.rpc.commands.teams :as teams]
|
||||||
[app.rpc.doc :as-alias doc]
|
[app.rpc.doc :as-alias doc]
|
||||||
[app.util.blob :as blob]
|
[app.util.blob :as blob]
|
||||||
[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]))
|
||||||
|
|
||||||
|
|
||||||
;; --- MUTATION COMMAND: create-temp-file
|
;; --- MUTATION COMMAND: create-temp-file
|
||||||
|
|
||||||
(s/def ::create-page ::us/boolean)
|
(s/def ::create-page ::us/boolean)
|
||||||
|
@ -38,25 +43,35 @@
|
||||||
(sv/defmethod ::create-temp-file
|
(sv/defmethod ::create-temp-file
|
||||||
{::doc/added "1.17"
|
{::doc/added "1.17"
|
||||||
::doc/module :files}
|
::doc/module :files}
|
||||||
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id] :as params}]
|
[cfg {:keys [::rpc/profile-id project-id] :as params}]
|
||||||
(db/with-atomic [conn pool]
|
(db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}]
|
||||||
(projects/check-edition-permissions! conn profile-id project-id)
|
(projects/check-edition-permissions! conn profile-id project-id)
|
||||||
(create-file conn (assoc params :profile-id profile-id :deleted-at (dt/in-future {:days 1})))))
|
(let [team (teams/get-team cfg
|
||||||
|
:profile-id profile-id
|
||||||
|
:project-id project-id)
|
||||||
|
|
||||||
|
;; When we create files, we only need to respect the team
|
||||||
|
;; features, because some features can be enabled
|
||||||
|
;; globally, but the team is still not migrated properly.
|
||||||
|
features (-> (cfeat/get-team-enabled-features cf/flags team)
|
||||||
|
(cfeat/check-client-features! (:features params)))
|
||||||
|
|
||||||
|
;; We also include all no migration features declared by
|
||||||
|
;; client; that enables the ability to enable a runtime
|
||||||
|
;; feature on frontend and make it permanent on file
|
||||||
|
features (-> (:features params #{})
|
||||||
|
(set/intersection cfeat/no-migration-features)
|
||||||
|
(set/union features))
|
||||||
|
|
||||||
|
params (-> params
|
||||||
|
(assoc :profile-id profile-id)
|
||||||
|
(assoc :deleted-at (dt/in-future {:days 1}))
|
||||||
|
(assoc :features features))]
|
||||||
|
|
||||||
|
(files.create/create-file cfg params)))))
|
||||||
|
|
||||||
;; --- MUTATION COMMAND: update-temp-file
|
;; --- MUTATION COMMAND: update-temp-file
|
||||||
|
|
||||||
(defn update-temp-file
|
|
||||||
[conn {:keys [profile-id session-id id revn changes] :as params}]
|
|
||||||
(db/insert! conn :file-change
|
|
||||||
{:id (uuid/next)
|
|
||||||
:session-id session-id
|
|
||||||
:profile-id profile-id
|
|
||||||
:created-at (dt/now)
|
|
||||||
:file-id id
|
|
||||||
:revn revn
|
|
||||||
:data nil
|
|
||||||
:changes (blob/encode changes)}))
|
|
||||||
|
|
||||||
(s/def ::update-temp-file
|
(s/def ::update-temp-file
|
||||||
(s/keys :req [::rpc/profile-id]
|
(s/keys :req [::rpc/profile-id]
|
||||||
:req-un [::files.update/changes
|
:req-un [::files.update/changes
|
||||||
|
@ -67,10 +82,18 @@
|
||||||
(sv/defmethod ::update-temp-file
|
(sv/defmethod ::update-temp-file
|
||||||
{::doc/added "1.17"
|
{::doc/added "1.17"
|
||||||
::doc/module :files}
|
::doc/module :files}
|
||||||
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id] :as params}]
|
[cfg {:keys [::rpc/profile-id session-id id revn changes] :as params}]
|
||||||
(db/with-atomic [conn pool]
|
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
|
||||||
(update-temp-file conn (assoc params :profile-id profile-id))
|
(db/insert! conn :file-change
|
||||||
nil))
|
{:id (uuid/next)
|
||||||
|
:session-id session-id
|
||||||
|
:profile-id profile-id
|
||||||
|
:created-at (dt/now)
|
||||||
|
:file-id id
|
||||||
|
:revn revn
|
||||||
|
:data nil
|
||||||
|
:changes (blob/encode changes)})
|
||||||
|
nil)))
|
||||||
|
|
||||||
;; --- MUTATION COMMAND: persist-temp-file
|
;; --- MUTATION COMMAND: persist-temp-file
|
||||||
|
|
||||||
|
@ -105,7 +128,7 @@
|
||||||
(sv/defmethod ::persist-temp-file
|
(sv/defmethod ::persist-temp-file
|
||||||
{::doc/added "1.17"
|
{::doc/added "1.17"
|
||||||
::doc/module :files}
|
::doc/module :files}
|
||||||
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}]
|
[cfg {:keys [::rpc/profile-id id] :as params}]
|
||||||
(db/with-atomic [conn pool]
|
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
|
||||||
(files/check-edition-permissions! conn profile-id id)
|
(files/check-edition-permissions! conn profile-id id)
|
||||||
(persist-temp-file conn params)))
|
(persist-temp-file conn params))))
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
[app.main.data.events :as ev]
|
[app.main.data.events :as ev]
|
||||||
[app.main.data.messages :as msg]
|
[app.main.data.messages :as msg]
|
||||||
[app.main.data.modal :as modal]
|
[app.main.data.modal :as modal]
|
||||||
|
[app.main.features :as features]
|
||||||
[app.main.store :as st]
|
[app.main.store :as st]
|
||||||
[app.main.ui.components.file-uploader :refer [file-uploader]]
|
[app.main.ui.components.file-uploader :refer [file-uploader]]
|
||||||
[app.main.ui.icons :as i]
|
[app.main.ui.icons :as i]
|
||||||
|
@ -272,7 +273,8 @@
|
||||||
(->> (uw/ask-many!
|
(->> (uw/ask-many!
|
||||||
{:cmd :import-files
|
{:cmd :import-files
|
||||||
:project-id project-id
|
:project-id project-id
|
||||||
:files files})
|
:files files
|
||||||
|
:features @features/features-ref})
|
||||||
(rx/subs
|
(rx/subs
|
||||||
(fn [{:keys [file-id status message errors] :as msg}]
|
(fn [{:keys [file-id status message errors] :as msg}]
|
||||||
(swap! state update :files update-status file-id status message errors))))))
|
(swap! state update :files update-status file-id status message errors))))))
|
||||||
|
@ -347,7 +349,7 @@
|
||||||
success-files (->> files (filter #(and (= (:status %) :import-finish) (empty? (:errors %)))) count)
|
success-files (->> files (filter #(and (= (:status %) :import-finish) (empty? (:errors %)))) count)
|
||||||
pending-analysis? (> (->> files (filter #(= (:status %) :analyzing)) count) 0)
|
pending-analysis? (> (->> files (filter #(= (:status %) :analyzing)) count) 0)
|
||||||
pending-import? (> num-importing 0)
|
pending-import? (> num-importing 0)
|
||||||
|
|
||||||
valid-files? (or (some? template)
|
valid-files? (or (some? template)
|
||||||
(> (+ (->> files (filterv (fn [x] (not= (:status x) :analyze-error))) count)) 0))]
|
(> (+ (->> files (filterv (fn [x] (not= (:status x) :analyze-error))) count)) 0))]
|
||||||
|
|
||||||
|
|
|
@ -126,10 +126,9 @@
|
||||||
|
|
||||||
(defn create-file
|
(defn create-file
|
||||||
"Create a new file on the back-end"
|
"Create a new file on the back-end"
|
||||||
[context]
|
[context features]
|
||||||
(let [resolve-fn (:resolve context)
|
(let [resolve-fn (:resolve context)
|
||||||
file-id (resolve-fn (:file-id context))
|
file-id (resolve-fn (:file-id context))]
|
||||||
features (into #{} (:features context))]
|
|
||||||
(rp/cmd! :create-temp-file
|
(rp/cmd! :create-temp-file
|
||||||
{:id file-id
|
{:id file-id
|
||||||
:name (:name context)
|
:name (:name context)
|
||||||
|
@ -575,14 +574,14 @@
|
||||||
(rx/tap #(rx/end! progress-str)))]))
|
(rx/tap #(rx/end! progress-str)))]))
|
||||||
|
|
||||||
(defn create-files
|
(defn create-files
|
||||||
[context files]
|
[{:keys [features] :as context} files]
|
||||||
|
|
||||||
(let [data (group-by :file-id files)]
|
(let [data (group-by :file-id files)]
|
||||||
(rx/concat
|
(rx/concat
|
||||||
(->> (rx/from files)
|
(->> (rx/from files)
|
||||||
(rx/map #(merge context %))
|
(rx/map #(merge context %))
|
||||||
(rx/flat-map (fn [context]
|
(rx/flat-map (fn [context]
|
||||||
(->> (create-file context)
|
(->> (create-file context features)
|
||||||
(rx/map #(vector % (first (get data (:file-id context)))))))))
|
(rx/map #(vector % (first (get data (:file-id context)))))))))
|
||||||
|
|
||||||
(->> (rx/from files)
|
(->> (rx/from files)
|
||||||
|
@ -641,10 +640,11 @@
|
||||||
(rx/of {:uri (:uri file) :error error}))))))))))
|
(rx/of {:uri (:uri file) :error error}))))))))))
|
||||||
|
|
||||||
(defmethod impl/handler :import-files
|
(defmethod impl/handler :import-files
|
||||||
[{:keys [project-id files]}]
|
[{:keys [project-id files features]}]
|
||||||
|
|
||||||
(let [context {:project-id project-id
|
(let [context {:project-id project-id
|
||||||
:resolve (resolve-factory)}
|
:resolve (resolve-factory)
|
||||||
|
:features features}
|
||||||
zip-files (filter #(= "application/zip" (:type %)) files)
|
zip-files (filter #(= "application/zip" (:type %)) files)
|
||||||
binary-files (filter #(= "application/octet-stream" (:type %)) files)]
|
binary-files (filter #(= "application/octet-stream" (:type %)) files)]
|
||||||
|
|
||||||
|
@ -691,5 +691,9 @@
|
||||||
(rx/catch (fn [cause]
|
(rx/catch (fn [cause]
|
||||||
(log/error :hint "unexpected error on import process"
|
(log/error :hint "unexpected error on import process"
|
||||||
:project-id project-id
|
:project-id project-id
|
||||||
:cause cause))))))
|
:cause cause)
|
||||||
|
(if (map? cause)
|
||||||
|
(js/console.error (pr-str cause))
|
||||||
|
(js/console.error cause)))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue