diff --git a/backend/src/app/rpc/commands/files_temp.clj b/backend/src/app/rpc/commands/files_temp.clj index 85902a0fa..83cbfea03 100644 --- a/backend/src/app/rpc/commands/files_temp.clj +++ b/backend/src/app/rpc/commands/files_temp.clj @@ -7,21 +7,26 @@ (ns app.rpc.commands.files-temp (:require [app.common.exceptions :as ex] + [app.common.features :as cfeat] [app.common.pages :as cp] [app.common.spec :as us] [app.common.uuid :as uuid] + [app.config :as cf] [app.db :as db] [app.rpc :as-alias rpc] [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.projects :as projects] + [app.rpc.commands.teams :as teams] [app.rpc.doc :as-alias doc] [app.util.blob :as blob] [app.util.services :as sv] [app.util.time :as dt] + [clojure.set :as set] [clojure.spec.alpha :as s])) + ;; --- MUTATION COMMAND: create-temp-file (s/def ::create-page ::us/boolean) @@ -38,25 +43,35 @@ (sv/defmethod ::create-temp-file {::doc/added "1.17" ::doc/module :files} - [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id] :as params}] - (db/with-atomic [conn pool] - (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}))))) + [cfg {:keys [::rpc/profile-id project-id] :as params}] + (db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}] + (projects/check-edition-permissions! conn profile-id project-id) + (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 -(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/keys :req [::rpc/profile-id] :req-un [::files.update/changes @@ -67,10 +82,18 @@ (sv/defmethod ::update-temp-file {::doc/added "1.17" ::doc/module :files} - [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id] :as params}] - (db/with-atomic [conn pool] - (update-temp-file conn (assoc params :profile-id profile-id)) - nil)) + [cfg {:keys [::rpc/profile-id session-id id revn changes] :as params}] + (db/tx-run! cfg (fn [{:keys [::db/conn]}] + (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)}) + nil))) ;; --- MUTATION COMMAND: persist-temp-file @@ -105,7 +128,7 @@ (sv/defmethod ::persist-temp-file {::doc/added "1.17" ::doc/module :files} - [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}] - (db/with-atomic [conn pool] - (files/check-edition-permissions! conn profile-id id) - (persist-temp-file conn params))) + [cfg {:keys [::rpc/profile-id id] :as params}] + (db/tx-run! cfg (fn [{:keys [::db/conn]}] + (files/check-edition-permissions! conn profile-id id) + (persist-temp-file conn params)))) diff --git a/frontend/src/app/main/ui/dashboard/import.cljs b/frontend/src/app/main/ui/dashboard/import.cljs index 57aba1b11..120119193 100644 --- a/frontend/src/app/main/ui/dashboard/import.cljs +++ b/frontend/src/app/main/ui/dashboard/import.cljs @@ -13,6 +13,7 @@ [app.main.data.events :as ev] [app.main.data.messages :as msg] [app.main.data.modal :as modal] + [app.main.features :as features] [app.main.store :as st] [app.main.ui.components.file-uploader :refer [file-uploader]] [app.main.ui.icons :as i] @@ -272,7 +273,8 @@ (->> (uw/ask-many! {:cmd :import-files :project-id project-id - :files files}) + :files files + :features @features/features-ref}) (rx/subs (fn [{:keys [file-id status message errors] :as msg}] (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) pending-analysis? (> (->> files (filter #(= (:status %) :analyzing)) count) 0) pending-import? (> num-importing 0) - + valid-files? (or (some? template) (> (+ (->> files (filterv (fn [x] (not= (:status x) :analyze-error))) count)) 0))] diff --git a/frontend/src/app/worker/import.cljs b/frontend/src/app/worker/import.cljs index e52e1c508..8e46f3846 100644 --- a/frontend/src/app/worker/import.cljs +++ b/frontend/src/app/worker/import.cljs @@ -126,10 +126,9 @@ (defn create-file "Create a new file on the back-end" - [context] + [context features] (let [resolve-fn (:resolve context) - file-id (resolve-fn (:file-id context)) - features (into #{} (:features context))] + file-id (resolve-fn (:file-id context))] (rp/cmd! :create-temp-file {:id file-id :name (:name context) @@ -575,14 +574,14 @@ (rx/tap #(rx/end! progress-str)))])) (defn create-files - [context files] + [{:keys [features] :as context} files] (let [data (group-by :file-id files)] (rx/concat (->> (rx/from files) (rx/map #(merge context %)) (rx/flat-map (fn [context] - (->> (create-file context) + (->> (create-file context features) (rx/map #(vector % (first (get data (:file-id context))))))))) (->> (rx/from files) @@ -641,10 +640,11 @@ (rx/of {:uri (:uri file) :error error})))))))))) (defmethod impl/handler :import-files - [{:keys [project-id files]}] + [{:keys [project-id files features]}] (let [context {:project-id project-id - :resolve (resolve-factory)} + :resolve (resolve-factory) + :features features} zip-files (filter #(= "application/zip" (:type %)) files) binary-files (filter #(= "application/octet-stream" (:type %)) files)] @@ -691,5 +691,9 @@ (rx/catch (fn [cause] (log/error :hint "unexpected error on import process" :project-id project-id - :cause cause)))))) + :cause cause) + (if (map? cause) + (js/console.error (pr-str cause)) + (js/console.error cause))))))) +