enhance(rtc): update fns to add/remove asset ops

This commit is contained in:
rcmerci
2024-01-09 20:14:09 +08:00
parent 1c6ff89d4a
commit 3d5b9937ba
2 changed files with 60 additions and 9 deletions

View File

@@ -158,7 +158,7 @@
[asset-uuid->ops asset-uuid]
(block-uuid->min-epoch asset-uuid->ops asset-uuid))
(defn add-ops-to-block-uuid->ops
(defn add-ops-aux
[ops block-uuid->ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map]
(loop [block-uuid->ops block-uuid->ops
epoch->block-uuid-sorted-map epoch->block-uuid-sorted-map
@@ -307,11 +307,11 @@
asset-uuid->ops epoch->asset-uuid-sorted-map]} :current-branch}
(get @*ops-store repo)
{:keys [block-uuid->ops epoch->block-uuid-sorted-map]}
(add-ops-to-block-uuid->ops ops block-uuid->ops epoch->block-uuid-sorted-map
(add-ops-aux ops block-uuid->ops epoch->block-uuid-sorted-map
asset-uuid->ops epoch->asset-uuid-sorted-map)
{old-branch-block-uuid->ops :block-uuid->ops old-epoch->block-uuid-sorted-map :epoch->block-uuid-sorted-map}
(when old-branch
(add-ops-to-block-uuid->ops ops old-branch-block-uuid->ops old-epoch->block-uuid-sorted-map
(add-ops-aux ops old-branch-block-uuid->ops old-epoch->block-uuid-sorted-map
old-branch-asset-uuid->ops old-epoch->asset-uuid-sorted-map))]
(swap! *ops-store update repo
(fn [{:keys [current-branch old-branch]}]
@@ -325,6 +325,36 @@
:block-uuid->ops old-branch-block-uuid->ops
:epoch->block-uuid-sorted-map old-epoch->block-uuid-sorted-map)))))))
(defn add-asset-ops!
[repo ops]
(assert (contains? (@*ops-store repo) :current-branch) (@*ops-store repo))
(let [ops (ops-coercer ops)
{{old-branch-block-uuid->ops :block-uuid->ops
old-epoch->block-uuid-sorted-map :epoch->block-uuid-sorted-map
old-branch-asset-uuid->ops :asset-uuid->ops
old-epoch->asset-uuid-sorted-map :epoch->asset-uuid-sorted-map
:as old-branch} :old-branch
{:keys [block-uuid->ops epoch->block-uuid-sorted-map
asset-uuid->ops epoch->asset-uuid-sorted-map]} :current-branch}
(get @*ops-store repo)
{:keys [asset-uuid->ops epoch->asset-uuid-sorted-map]}
(add-ops-aux ops block-uuid->ops epoch->block-uuid-sorted-map
asset-uuid->ops epoch->asset-uuid-sorted-map)
{old-branch-asset-uuid->ops :asset-uuid->ops old-epoch->asset-uuid-sorted-map :epoch->asset-uuid-sorted-map}
(when old-branch
(add-ops-aux ops old-branch-block-uuid->ops old-epoch->block-uuid-sorted-map
old-branch-asset-uuid->ops old-epoch->asset-uuid-sorted-map))]
(swap! *ops-store update repo
(fn [{:keys [current-branch old-branch]}]
(cond-> {:current-branch
(assoc current-branch
:asset-uuid->ops asset-uuid->ops
:epoch->asset-uuid-sorted-map epoch->asset-uuid-sorted-map)}
old-branch
(assoc :old-branch
(assoc old-branch
:asset-uuid->ops old-branch-asset-uuid->ops
:epoch->asset-uuid-sorted-map old-epoch->asset-uuid-sorted-map)))))))
(defn update-local-tx!
[repo t]
@@ -426,6 +456,17 @@
:block-uuid->ops (dissoc block-uuid->ops block-uuid)
:epoch->block-uuid-sorted-map (dissoc epoch->block-uuid-sorted-map min-epoch)))))
(defn remove-asset-ops!
[repo asset-uuid]
{:pre [(uuid? asset-uuid)]}
(let [repo-ops-store (get @*ops-store repo)
{:keys [epoch->asset-uuid-sorted-map asset-uuid->ops]} (:current-branch repo-ops-store)]
(assert (contains? repo-ops-store :current-branch) repo)
(let [min-epoch (asset-uuid->min-epoch asset-uuid->ops asset-uuid)]
(swap! *ops-store update-in [repo :current-branch] assoc
:asset-uuid->ops (dissoc asset-uuid->ops asset-uuid)
:epoch->asset-uuid-sorted-map (dissoc epoch->asset-uuid-sorted-map min-epoch)))))
(defn <init-load-from-indexeddb!
[repo]
@@ -440,7 +481,7 @@
ops-from-store-coercer
(map second))
{:keys [block-uuid->ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map]}
(add-ops-to-block-uuid->ops ops {} (sorted-map-by <) {} (sorted-map-by <))
(add-ops-aux ops {} (sorted-map-by <) {} (sorted-map-by <))
r (cond-> {:block-uuid->ops block-uuid->ops
:epoch->block-uuid-sorted-map epoch->block-uuid-sorted-map
:asset-uuid->ops asset-uuid->ops

View File

@@ -17,7 +17,7 @@
(let [ops [["move" {:block-uuid "f4abd682-fb9e-4f1a-84bf-5fe11fe7844b" :epoch 1}]
["move" {:block-uuid "8e6d8355-ded7-4500-afaa-6f721f3b0dc6" :epoch 2}]]
{:keys [block-uuid->ops epoch->block-uuid-sorted-map]}
(op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))]
(op-layer/add-ops-aux (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))]
(is (= [{#uuid"f4abd682-fb9e-4f1a-84bf-5fe11fe7844b"
{:move ["move" {:block-uuid #uuid"f4abd682-fb9e-4f1a-84bf-5fe11fe7844b", :epoch 1}]},
#uuid"8e6d8355-ded7-4500-afaa-6f721f3b0dc6"
@@ -34,7 +34,7 @@
["update" {:block-uuid "f639f13e-ef6f-4ba5-83b4-67527d27cd02" :epoch 3
:updated-attrs {:type {:add #{"type1"}}}}]]
{:keys [block-uuid->ops epoch->block-uuid-sorted-map]}
(op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))]
(op-layer/add-ops-aux (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))]
(is (= [{#uuid"f639f13e-ef6f-4ba5-83b4-67527d27cd02"
{:move
["move" {:block-uuid #uuid"f639f13e-ef6f-4ba5-83b4-67527d27cd02", :epoch 1}],
@@ -52,7 +52,7 @@
["update" {:block-uuid "f639f13e-ef6f-4ba5-83b4-67527d27cd02" :epoch 4
:updated-attrs {:content nil :link nil}}]]
{:keys [block-uuid->ops]}
(op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))]
(op-layer/add-ops-aux (op-layer/ops-coercer ops) {} (sorted-map-by <) {} (sorted-map-by <))]
(is (= ["update"
{:block-uuid #uuid "f639f13e-ef6f-4ba5-83b4-67527d27cd02"
:updated-attrs {:content nil :link nil}
@@ -62,15 +62,25 @@
(let [ops1 [["update-page" {:block-uuid #uuid "65564abe-1e79-4ae8-af60-215826cefea9" :epoch 1}]]
ops2 [["remove-page" {:block-uuid #uuid "65564abe-1e79-4ae8-af60-215826cefea9" :epoch 2}]]
{:keys [block-uuid->ops epoch->block-uuid-sorted-map asset-uuid->ops epoch->asset-uuid-sorted-map]}
(op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops1) {} (sorted-map-by <) {} (sorted-map-by <))
(op-layer/add-ops-aux (op-layer/ops-coercer ops1) {} (sorted-map-by <) {} (sorted-map-by <))
{block-uuid->ops2 :block-uuid->ops}
(op-layer/add-ops-to-block-uuid->ops (op-layer/ops-coercer ops2)
(op-layer/add-ops-aux (op-layer/ops-coercer ops2)
block-uuid->ops epoch->block-uuid-sorted-map
asset-uuid->ops epoch->asset-uuid-sorted-map)]
(is (= {#uuid "65564abe-1e79-4ae8-af60-215826cefea9"
{:remove-page ["remove-page" {:block-uuid #uuid "65564abe-1e79-4ae8-af60-215826cefea9", :epoch 2}]}}
block-uuid->ops2)))))
(deftest add-ops-to-asset-uuid->ops-test
(let [[uuid1 uuid2] (repeatedly random-uuid)
ops1 [["update-asset" {:asset-uuid uuid1 :epoch 1}]
["update-asset" {:asset-uuid uuid2 :epoch 2}]]
{:keys [asset-uuid->ops]}
(op-layer/add-ops-aux (op-layer/ops-coercer ops1) {} (sorted-map-by <) {} (sorted-map-by <))]
(is (= {uuid1 {:update-asset ["update-asset" {:asset-uuid uuid1 :epoch 1}]}
uuid2 {:update-asset ["update-asset" {:asset-uuid uuid2 :epoch 2}]}}
asset-uuid->ops))))
(deftest process-test
(let [repo (make-db-graph-repo-name "process-test")