Explorar el Código

enhance(rtc): generate migration new classes client-ops when rtc-start

rcmerci hace 7 meses
padre
commit
eac17d4a74

+ 23 - 13
src/main/frontend/worker/rtc/gen_client_op.cljs

@@ -134,17 +134,27 @@
             db-before db-after e->a->v->add?->t rtc-const/ignore-attrs-when-syncing)
    same-entity-datoms-coll))
 
+(defn- generate-rtc-ops-from-entities
+  [ents]
+  (let [db (d/entity-db (first ents))
+        id->same-entity-datoms
+        (into {}
+              (map (fn [ent]
+                     (let [e (:db/id ent)
+                           datoms (d/datoms db :eavt e)]
+                       [e datoms])))
+              ents)
+        e->a->v->add?->t (update-vals id->same-entity-datoms entity-datoms=>a->add?->v->t)]
+    (generate-rtc-ops db db (vals id->same-entity-datoms) e->a->v->add?->t)))
+
 (defn generate-rtc-ops-from-property-entities
-  [property-entities]
-  (when (seq property-entities)
-    (assert (every? ldb/property? property-entities))
-    (let [db (d/entity-db (first property-entities))
-          id->same-entity-datoms
-          (into {}
-                (map (fn [prop-ent]
-                       (let [e (:db/id prop-ent)
-                             datoms (d/datoms db :eavt e)]
-                         [e datoms])))
-                property-entities)
-          e->a->v->add?->t (update-vals id->same-entity-datoms entity-datoms=>a->add?->v->t)]
-      (generate-rtc-ops db db (vals id->same-entity-datoms) e->a->v->add?->t))))
+  [property-ents]
+  (when (seq property-ents)
+    (assert (every? ldb/property? property-ents))
+    (generate-rtc-ops-from-entities property-ents)))
+
+(defn generate-rtc-ops-from-class-entities
+  [class-ents]
+  (when (seq class-ents)
+    (assert (every? ldb/class? class-ents))
+    (generate-rtc-ops-from-entities class-ents)))

+ 7 - 3
src/main/frontend/worker/rtc/migrate.cljs

@@ -23,11 +23,15 @@
            (map second)))))
 
 (defn- migration-updates->client-ops
-  "TODO: support :classes in migration-updates"
+  "convert :classes, :properties from frontend.worker.db.migrate/schema-version->updates into client-ops"
   [db client-schema-version migrate-updates]
   (let [property-ks (mapcat :properties migrate-updates)
-        new-property-entites (keep (fn [k] (d/entity db k)) property-ks)
-        client-ops (vec (gen-client-op/generate-rtc-ops-from-property-entities new-property-entites))
+        class-ks (mapcat :classes migrate-updates)
+        d-entity-fn (partial d/entity db)
+        new-property-entities (keep d-entity-fn property-ks)
+        new-class-entities (keep d-entity-fn class-ks)
+        client-ops (vec (concat (gen-client-op/generate-rtc-ops-from-property-entities new-property-entities)
+                                (gen-client-op/generate-rtc-ops-from-class-entities new-class-entities)))
         max-t (apply max 0 (map second client-ops))]
     (conj client-ops
           [:update-kv-value

+ 31 - 4
src/test/frontend/worker/rtc/gen_client_op_test.cljs

@@ -1,5 +1,6 @@
 (ns frontend.worker.rtc.gen-client-op-test
   (:require [cljs.test :as t :refer [deftest is testing]]
+            [clojure.set :as set]
             [datascript.core :as d]
             [frontend.db.conn :as conn]
             [frontend.state :as state]
@@ -11,7 +12,8 @@
             [frontend.worker.state :as worker-state]
             [logseq.db.test.helper :as db-test]
             [logseq.outliner.batch-tx :as batch-tx]
-            [logseq.outliner.core :as outliner-core]))
+            [logseq.outliner.core :as outliner-core]
+            [meander.epsilon :as me]))
 
 (t/use-fixtures :each
   test-helper/db-based-start-and-destroy-db-map-fixture
@@ -160,6 +162,31 @@
 (deftest generate-rtc-ops-from-property-entity-test
   (let [repo (state/get-current-repo)
         db (conn/get-db repo true)
-        ent (d/entity db :logseq.property.view/feature-type)]
-    (is (= #{:move :update-page :update}
-           (set (map first (subject/generate-rtc-ops-from-property-entities [ent])))))))
+        ent (d/entity db :logseq.property.view/feature-type)
+        av-coll-attrs #{:logseq.property/type :logseq.property/built-in?
+                        :logseq.property/public? :logseq.property/hide?
+                        :block/tags :block/title :db/cardinality}]
+    #_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]}
+    (is (->> (me/find (subject/generate-rtc-ops-from-property-entities [ent])
+               ([:move _ {:block-uuid ?block-uuid}]
+                [:update-page _ {:block-uuid ?block-uuid}]
+                [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
+               !av-coll-attrs)
+             set
+             (set/difference av-coll-attrs)
+             empty?))))
+
+(deftest generate-rtc-ops-from-class-entity-test
+  (let [repo (state/get-current-repo)
+        db (conn/get-db repo true)
+        ent (d/entity db :logseq.class/Template)
+        av-coll-attrs #{:logseq.property.class/properties :logseq.property/built-in? :logseq.property/parent
+                        :block/tags :block/title}]
+    #_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]}
+    (is (->> (me/find (subject/generate-rtc-ops-from-class-entities [ent])
+               ([:update-page _ {:block-uuid ?block-uuid}]
+                [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
+               !av-coll-attrs)
+             set
+             (set/difference av-coll-attrs)
+             empty?))))