mirror of
https://github.com/penpot/penpot.git
synced 2025-05-10 16:36:38 +02:00
- Fix bugs related to orphan teams on profile deletion - Separate session based profile-id param from api user provided
89 lines
3.4 KiB
Clojure
89 lines
3.4 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS INC
|
|
|
|
(ns app.rpc.commands.files.create
|
|
(:require
|
|
[app.common.data :as d]
|
|
[app.common.files.features :as ffeat]
|
|
[app.common.types.file :as ctf]
|
|
[app.common.uuid :as uuid]
|
|
[app.db :as db]
|
|
[app.loggers.audit :as-alias audit]
|
|
[app.loggers.webhooks :as-alias webhooks]
|
|
[app.rpc :as-alias rpc]
|
|
[app.rpc.commands.files :as files]
|
|
[app.rpc.doc :as-alias doc]
|
|
[app.rpc.permissions :as perms]
|
|
[app.rpc.queries.projects :as proj]
|
|
[app.util.blob :as blob]
|
|
[app.util.objects-map :as omap]
|
|
[app.util.pointer-map :as pmap]
|
|
[app.util.services :as sv]
|
|
[clojure.spec.alpha :as s]))
|
|
|
|
(defn create-file-role!
|
|
[conn {:keys [file-id profile-id role]}]
|
|
(let [params {:file-id file-id
|
|
:profile-id profile-id}]
|
|
(->> (perms/assign-role-flags params role)
|
|
(db/insert! conn :file-profile-rel))))
|
|
|
|
(defn create-file
|
|
[conn {:keys [id name project-id is-shared data revn
|
|
modified-at deleted-at create-page
|
|
ignore-sync-until features]
|
|
:or {is-shared false revn 0 create-page true}
|
|
:as params}]
|
|
(let [id (or id (:id data) (uuid/next))
|
|
features (-> (into files/default-features features)
|
|
(files/check-features-compatibility!))
|
|
|
|
data (or data
|
|
(binding [ffeat/*current* features
|
|
ffeat/*wrap-with-objects-map-fn* (if (features "storate/objects-map") omap/wrap identity)
|
|
ffeat/*wrap-with-pointer-map-fn* (if (features "storage/pointer-map") pmap/wrap identity)]
|
|
(if create-page
|
|
(ctf/make-file-data id)
|
|
(ctf/make-file-data id nil))))
|
|
|
|
features (db/create-array conn "text" features)
|
|
file (db/insert! conn :file
|
|
(d/without-nils
|
|
{:id id
|
|
:project-id project-id
|
|
:name name
|
|
:revn revn
|
|
:is-shared is-shared
|
|
:data (blob/encode data)
|
|
:features features
|
|
:ignore-sync-until ignore-sync-until
|
|
:modified-at modified-at
|
|
:deleted-at deleted-at}))]
|
|
|
|
(->> (assoc params :file-id id :role :owner)
|
|
(create-file-role! conn))
|
|
|
|
(files/decode-row file)))
|
|
|
|
(s/def ::create-file
|
|
(s/keys :req [::rpc/profile-id]
|
|
:req-un [::files/name
|
|
::files/project-id]
|
|
:opt-un [::files/id
|
|
::files/is-shared
|
|
::files/features]))
|
|
|
|
(sv/defmethod ::create-file
|
|
{::doc/added "1.17"
|
|
::webhooks/event? true}
|
|
[{:keys [pool] :as cfg} {:keys [::rpc/profile-id project-id] :as params}]
|
|
(db/with-atomic [conn pool]
|
|
(proj/check-edition-permissions! conn profile-id project-id)
|
|
(let [team-id (files/get-team-id conn project-id)
|
|
params (assoc params :profile-id profile-id)]
|
|
(-> (create-file conn params)
|
|
(vary-meta assoc ::audit/props {:team-id team-id})))))
|
|
|