0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-03-16 01:31:22 -05:00

Properly handle page history.

This commit is contained in:
Andrey Antukh 2019-11-29 12:54:24 +01:00
parent cd43a6c90e
commit 50b54683c4
4 changed files with 80 additions and 56 deletions

View file

@ -59,9 +59,15 @@
;; --- Pages creation ;; --- Pages creation
(def create-page-sql (def create-page-sql
"insert into pages (id, user_id, project_id, name, ordering, data, metadata) "insert into pages (id, user_id, project_id, name,
values ($1, $2, $3, $4, $5, $6, $7) version, ordering, data, metadata)
returning *;") values ($1, $2, $3, $4, $5, $6, $7, $8)
returning id;")
(def create-page-history-sql
"insert into pages_history (page_id, user_id, version, data, metadata)
values ($1, $2, $3, $4, $5)
returning id;")
(defn create-page (defn create-page
[conn [pjid paid uid]] [conn [pjid paid uid]]
@ -73,15 +79,25 @@
:x1 200 :x1 200
:y1 200 :y1 200
:x2 1224 :x2 1224
:y2 968}]}] :y2 968}]}
(db/query-one conn [create-page-sql data (blob/encode data)
(mk-uuid "page" pjid paid uid) mdata (blob/encode {})]
(mk-uuid "user" uid) (p/do!
(mk-uuid "project" pjid uid) (db/query-one conn [create-page-sql
(str "page " paid) (mk-uuid "page" pjid paid uid)
paid (mk-uuid "user" uid)
(blob/encode data) (mk-uuid "project" pjid uid)
(blob/encode {})]))) (str "page " paid)
0
paid
data
mdata])
(db/query-one conn [create-page-history-sql
(mk-uuid "page" pjid paid uid)
(mk-uuid "user" uid)
0
data
mdata]))))
(def num-users 5) (def num-users 5)

View file

@ -19,9 +19,9 @@
java.util.Map$Entry java.util.Map$Entry
java.util.HashMap)) java.util.HashMap))
(def context-interceptor ;; (def context-interceptor
{:enter (fn [data] ;; {:enter (fn [data]
(update data :request assoc ::ctx (vc/get-or-create-context system)))}) ;; (update data :request assoc ::ctx (vc/get-or-create-context system)))})
(def logging-interceptor (def logging-interceptor
{:enter (fn [data] {:enter (fn [data]

View file

@ -31,9 +31,7 @@
(s/def ::upsert-kvstore (s/def ::upsert-kvstore
(s/keys :req-un [::key ::value ::user])) (s/keys :req-un [::key ::value ::user]))
(sv/defmutation :upsert-kvstore (sv/defmutation ::upsert-kvstore
{:doc "Update or insert kvstore entry."
:spec ::upsert-kvstore}
[{:keys [key value user] :as params}] [{:keys [key value user] :as params}]
(let [sql "insert into kvstore (key, value, user_id) (let [sql "insert into kvstore (key, value, user_id)
values ($1, $2, $3) values ($1, $2, $3)
@ -48,9 +46,7 @@
(s/def ::kvstore-entry (s/def ::kvstore-entry
(s/keys :req-un [::key ::user])) (s/keys :req-un [::key ::user]))
(sv/defquery :kvstore-entry (sv/defquery ::kvstore-entry
{:doc "Retrieve kvstore entry."
:spec ::kvstore-entry}
[{:keys [key user]}] [{:keys [key user]}]
(let [sql "select kv.* (let [sql "select kv.*
from kvstore as kv from kvstore as kv
@ -65,9 +61,7 @@
(s/def ::delete-kvstore (s/def ::delete-kvstore
(s/keys :req-un [::key ::user])) (s/keys :req-un [::key ::user]))
(sv/defmutation :delete-kvstore (sv/defmutation ::delete-kvstore
{:doc "Delete kvstore entry."
:spec ::delete-kvstore}
[{:keys [user key] :as params}] [{:keys [user key] :as params}]
(let [sql "delete from kvstore (let [sql "delete from kvstore
where user_id = $2 where user_id = $2

View file

@ -28,7 +28,6 @@
(s/def ::project-id ::us/uuid) (s/def ::project-id ::us/uuid)
(s/def ::metadata any?) (s/def ::metadata any?)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Queries ;; Queries
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -38,9 +37,7 @@
(s/def ::pages-by-project (s/def ::pages-by-project
(s/keys :req-un [::user ::project-id])) (s/keys :req-un [::user ::project-id]))
(sv/defquery :pages-by-project (sv/defquery ::pages-by-project
{:doc "List pages by project id."
:spec ::pages-by-project}
[{:keys [user project-id] :as params}] [{:keys [user project-id] :as params}]
(let [sql "select pg.*, (let [sql "select pg.*,
pg.data, pg.data,
@ -58,9 +55,7 @@
(s/def ::page (s/def ::page
(s/keys :req-un [::user ::id])) (s/keys :req-un [::user ::id]))
(sv/defquery :page (sv/defquery ::page
{:doc "Retrieve page by id."
:spec ::page}
[{:keys [user id] :as params}] [{:keys [user id] :as params}]
(let [sql "select pg.*, (let [sql "select pg.*,
pg.data, pg.data,
@ -121,9 +116,7 @@
(s/keys :req-un [::data ::user ::project-id ::name ::metadata] (s/keys :req-un [::data ::user ::project-id ::name ::metadata]
:opt-un [::id])) :opt-un [::id]))
(sv/defmutation :create-page (sv/defmutation ::create-page
{:doc "Create a new page."
:spec ::create-page}
[{:keys [id user project-id name data metadata]}] [{:keys [id user project-id name data metadata]}]
(let [sql "insert into pages (id, user_id, project_id, name, data, metadata) (let [sql "insert into pages (id, user_id, project_id, name, data, metadata)
values ($1, $2, $3, $4, $5, $6) returning *" values ($1, $2, $3, $4, $5, $6) returning *"
@ -139,32 +132,55 @@
(s/def ::update-page (s/def ::update-page
(s/keys :req-un [::data ::user ::project-id ::name ::data ::metadata ::id])) (s/keys :req-un [::data ::user ::project-id ::name ::data ::metadata ::id]))
(sv/defmutation :update-page (letfn [(select-for-update [conn id]
{:doc "Update an existing page." (let [sql "select p.id, p.version
:spec ::update-page} from pages as p
[{:keys [id user project-id name data metadata]}] where p.id = $1
(let [sql "update pages and deleted_at is null
set name = $1, for update;"]
data = $2, (-> (db/query-one conn [sql id])
metadata = $3 (p/then' sv/raise-not-found-if-nil))))
where id = $4
and user_id = $5
and deleted_at is null
returning *"
data (blob/encode data)
mdata (blob/encode metadata)]
(-> (db/query-one db/pool [sql name data mdata id user])
(p/then' decode-row))))
(update-page [conn {:keys [id name version data metadata user]}]
(let [sql "update pages
set name = $1,
version = $2,
data = $3,
metadata = $4
where id = $5
and user_id = $6"]
(-> (db/query-one conn [sql name version data metadata id user])
(p/then' sv/constantly-nil))))
(update-history [conn {:keys [user id version data metadata]}]
(let [sql "insert into pages_history (user_id, page_id, version, data, metadata)
values ($1, $2, $3, $4, $5)"]
(-> (db/query-one conn [sql user id version data metadata])
(p/then' sv/constantly-nil))))]
(sv/defmutation ::update-page
[{:keys [id data metadata] :as params}]
(db/with-atomic [conn db/pool]
(-> (select-for-update conn id)
(p/then (fn [{:keys [id version]}]
(let [data (blob/encode data)
mdata (blob/encode metadata)
version (inc version)
params (assoc params
:id id
:version version
:data data
:metadata mdata)]
(p/do! (update-page conn params)
(update-history conn params)
(select-keys params [:id :version])))))))))
;; --- Mutation: Update Page Metadata ;; --- Mutation: Update Page Metadata
(s/def ::update-page-metadata (s/def ::update-page-metadata
(s/keys :req-un [::user ::project-id ::name ::metadata ::id])) (s/keys :req-un [::user ::project-id ::name ::metadata ::id]))
(sv/defmutation :update-page-metadata (sv/defmutation ::update-page-metadata
{:doc "Update an existing page."
:spec ::update-page-metadata}
[{:keys [id user project-id name metadata]}] [{:keys [id user project-id name metadata]}]
(let [sql "update pages (let [sql "update pages
set name = $3, set name = $3,
@ -182,9 +198,7 @@
(s/def ::delete-page (s/def ::delete-page
(s/keys :req-un [::user ::id])) (s/keys :req-un [::user ::id]))
(sv/defmutation :delete-page (sv/defmutation ::delete-page
{:doc "Delete existing page."
:spec ::delete-page}
[{:keys [id user]}] [{:keys [id user]}]
(let [sql "update pages (let [sql "update pages
set deleted_at = clock_timestamp() set deleted_at = clock_timestamp()