Selaa lähdekoodia

enhance(rtc): add :db/ident in :update op

rcmerci 1 vuosi sitten
vanhempi
sitoutus
bc2b7bade6

+ 1 - 0
src/main/frontend/worker/rtc/client.cljs

@@ -161,6 +161,7 @@
              [:update (cond-> {:block-uuid block-uuid
                                :pos pos
                                :av-coll other-av-coll}
+                        (:db/ident block) (assoc :db/ident (:db/ident block))
                         card-one-attrs (assoc :card-one-attrs card-one-attrs))]))
     (when update-schema-op
       (swap! *remote-ops conj update-schema-op))

+ 1 - 0
src/main/frontend/worker/rtc/const.cljs

@@ -46,6 +46,7 @@
     [:cat :keyword
      [:map
       [:block-uuid :uuid]
+      [:db/ident {:optional true} :keyword]
       [:pos block-pos-schema]
       [:av-coll [:sequential av-schema]]
       [:card-one-attrs {:optional true} [:sequential :keyword]]]]]

+ 9 - 3
src/main/frontend/worker/rtc/db_listener.cljs

@@ -23,14 +23,20 @@
   #{:block/content :block/created-at :block/updated-at :block/alias
     :block/tags :block/type :block/schema :block/link :block/journal-day
     :class/parent :class/schema.properties :property/schema.classes :property.value/content
-    :db/ident :db/index :db/valueType :db/cardinality})
+    :db/index :db/valueType :db/cardinality})
+
+(def ^:private watched-attr-ns
+  #{"logseq.property" "logseq.property.tldraw" "logseq.property.pdf" "logseq.task"
+    "logseq.property.linked-references"
+    "logseq.class" "logseq.kv"})
 
 (defn- watched-attr?
   [attr]
   (or (contains? watched-attrs attr)
       (let [ns (namespace attr)]
-        (or (= "logseq.task" ns)        ;e.g. :logseq.task/status
-            (string/ends-with? ns ".property"))))) ; :logseq.property/xxx, :user.property/xxx
+        (or (contains? watched-attr-ns ns)
+            (string/ends-with? ns ".property")
+            (string/ends-with? ns ".class")))))
 
 (defn- ref-attr?
   [db attr]

+ 31 - 3
src/test/frontend/worker/rtc/client_test.cljs

@@ -9,6 +9,35 @@
 (def empty-db (d/empty-db db-schema/schema-for-db-based-graph))
 
 (deftest local-block-ops->remote-ops-test
+  (testing "user.class/yyy creation"
+    (let [block-uuid (random-uuid)
+          db (d/db-with empty-db [{:block/uuid block-uuid,
+                                   :block/updated-at 1720017595873,
+                                   :block/created-at 1720017595872,
+                                   :block/format :markdown,
+                                   :db/ident :user.class/yyy,
+                                   :block/type ["class"],
+                                   :block/name "yyy",
+                                   :block/original-name "yyy"}])]
+      (is (= [[:update
+               {:block-uuid block-uuid
+                :db/ident :user.class/yyy
+                :pos [nil nil],
+                :av-coll
+                [[:block/name "[\"~#'\",\"yyy\"]" 1 true]
+                 [:block/original-name "[\"~#'\",\"yyy\"]" 1 true]
+                 [:block/type "[\"~#'\",\"class\"]" 1 true]]}]]
+             (:remote-ops
+              (#'subject/local-block-ops->remote-ops
+               db
+               {:move [:move 1 {:block-uuid block-uuid}]
+                :update
+                [:update 1 {:block-uuid block-uuid
+                            :av-coll
+                            [[:block/name (ldb/write-transit-str "yyy") 1 true]
+                             [:block/original-name (ldb/write-transit-str "yyy") 1 true]
+                             [:block/type (ldb/write-transit-str "class") 1 true]]}]}))))))
+
   (testing "user.property/xxx creation"
     (let [block-uuid (random-uuid)
           block-order "b0P"
@@ -28,10 +57,10 @@
       (is (=
            [[:update
              {:block-uuid block-uuid,
+              :db/ident :user.property/xxx
               :pos [nil block-order],
               :av-coll
-              [[:db/ident "[\"~#'\",\"~:user.property/xxx\"]" 1 true]
-               [:block/name "[\"~#'\",\"xxx\"]" 1 true]
+              [[:block/name "[\"~#'\",\"xxx\"]" 1 true]
                [:block/original-name "[\"~#'\",\"xxx\"]" 1 true]
                [:block/type "[\"~#'\",\"property\"]" 1 true]]}]
             [:update-schema
@@ -48,7 +77,6 @@
               [:update 1 {:block-uuid block-uuid
                           :av-coll
                           [[:db/valueType (ldb/write-transit-str :db.type/ref) 1 true]
-                           [:db/ident (ldb/write-transit-str :user.property/xxx) 1 true]
                            [:block/name (ldb/write-transit-str "xxx") 1 true]
                            [:block/original-name (ldb/write-transit-str "xxx") 1 true]
                            [:block/type (ldb/write-transit-str "property") 1 true]

+ 32 - 2
src/test/frontend/worker/rtc/db_listener_test.cljs

@@ -13,7 +13,6 @@
         id->same-entity-datoms (group-by first datom-vec-coll)]
     (update-vals id->same-entity-datoms #'worker-db-listener/entity-datoms=>a->add?->v->t)))
 
-
 (deftest entity-datoms=>ops-test
   (testing "remove whiteboard page-block"
     (let [conn (d/conn-from-db empty-db)
@@ -62,8 +61,39 @@
                        [:block/created-at "[\"~#'\",1716882111476]"]
                        [:block/schema "[\"^ \",\"~:type\",\"~:number\"]"]
                        [:db/cardinality "[\"~#'\",\"~:db.cardinality/one\"]"]
-                       [:db/ident "[\"~#'\",\"~:user.property/qqq\"]"]
+                       ;; [:db/ident "[\"~#'\",\"~:user.property/qqq\"]"]
                        [:block/type "[\"~#'\",\"property\"]"]]}]]
+           (map (fn [[op-type _t op-value]]
+                  [op-type (cond-> op-value
+                             (:av-coll op-value)
+                             (assoc :av-coll (map #(take 2 %) (:av-coll op-value))))])
+                ops)))))
+
+  (testing "create user-class"
+    (let [conn (d/conn-from-db empty-db)
+          tx-data [[:db/add 62 :block/uuid #uuid "66856a29-6eb3-4122-af97-8580a853c6a6" 536870954]
+                   [:db/add 62 :block/updated-at 1720019497643 536870954]
+                   [:db/add 62 :class/parent 4 536870954]
+                   [:db/add 62 :block/created-at 1720019497643 536870954]
+                   [:db/add 62 :block/format :markdown 536870954]
+                   [:db/add 62 :db/ident :user.class/zzz 536870954]
+                   [:db/add 62 :block/type "class" 536870954]
+                   [:db/add 62 :block/name "zzz" 536870954]
+                   [:db/add 62 :block/original-name "zzz" 536870954]]
+          {:keys [db-before db-after tx-data]} (d/transact! conn tx-data)
+          ops (#'subject/entity-datoms=>ops db-before db-after
+                                            (tx-data=>e->a->add?->v->t tx-data)
+                                            (map vec tx-data))]
+      (is (=
+           [[:update-page {:block-uuid #uuid "66856a29-6eb3-4122-af97-8580a853c6a6"}]
+            [:update {:block-uuid #uuid "66856a29-6eb3-4122-af97-8580a853c6a6",
+                      :av-coll
+                      [[:block/updated-at "[\"~#'\",1720019497643]"]
+                       [:block/created-at "[\"~#'\",1720019497643]"]
+                       [:block/type "[\"~#'\",\"class\"]"]
+                       ;;1. no :class/parent, because db/id 4 block doesn't exist in empty-db
+                       ;;2. shouldn't have :db/ident, :db/ident is special, will be handled later
+                       ]}]]
            (map (fn [[op-type _t op-value]]
                   [op-type (cond-> op-value
                              (:av-coll op-value)