mirror of
https://github.com/penpot/penpot.git
synced 2025-05-03 20:45:53 +02:00
108 lines
3.4 KiB
Clojure
108 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-temp
|
|
(:require
|
|
[app.common.exceptions :as ex]
|
|
[app.common.pages :as cp]
|
|
[app.common.spec :as us]
|
|
[app.common.uuid :as uuid]
|
|
[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-update :as-alias files.update]
|
|
[app.rpc.doc :as-alias doc]
|
|
[app.rpc.queries.projects :as proj]
|
|
[app.util.blob :as blob]
|
|
[app.util.services :as sv]
|
|
[app.util.time :as dt]
|
|
[clojure.spec.alpha :as s]))
|
|
|
|
;; --- MUTATION COMMAND: create-temp-file
|
|
|
|
(s/def ::create-page ::us/boolean)
|
|
|
|
(s/def ::create-temp-file
|
|
(s/keys :req [::rpc/profile-id]
|
|
:req-un [::files/name
|
|
::files/project-id]
|
|
:opt-un [::files/id
|
|
::files/is-shared
|
|
::files/features
|
|
::create-page]))
|
|
|
|
(sv/defmethod ::create-temp-file
|
|
{::doc/added "1.17"}
|
|
[{: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)
|
|
(create-file conn (assoc params :profile-id profile-id :deleted-at (dt/in-future {:days 1})))))
|
|
|
|
;; --- 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
|
|
::files.update/revn
|
|
::files.update/session-id
|
|
::files/id]))
|
|
|
|
(sv/defmethod ::update-temp-file
|
|
{::doc/added "1.17"}
|
|
[{:keys [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))
|
|
|
|
;; --- MUTATION COMMAND: persist-temp-file
|
|
|
|
(defn persist-temp-file
|
|
[conn {:keys [id] :as params}]
|
|
(let [file (db/get-by-id conn :file id)
|
|
revs (db/query conn :file-change
|
|
{:file-id id}
|
|
{:order-by [[:revn :asc]]})
|
|
revn (count revs)]
|
|
|
|
(when (nil? (:deleted-at file))
|
|
(ex/raise :type :validation
|
|
:code :cant-persist-already-persisted-file))
|
|
|
|
(loop [revs (seq revs)
|
|
data (blob/decode (:data file))]
|
|
(if-let [rev (first revs)]
|
|
(recur (rest revs)
|
|
(->> rev :changes blob/decode (cp/process-changes data)))
|
|
(db/update! conn :file
|
|
{:deleted-at nil
|
|
:revn revn
|
|
:data (blob/encode data)}
|
|
{:id id})))
|
|
nil))
|
|
|
|
(s/def ::persist-temp-file
|
|
(s/keys :req [::rpc/profile-id]
|
|
:req-un [::files/id]))
|
|
|
|
(sv/defmethod ::persist-temp-file
|
|
{::doc/added "1.17"}
|
|
[{:keys [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)))
|