From 7fa9e689eddcc3637c8e8d45479bc20cc4f2bf87 Mon Sep 17 00:00:00 2001 From: rcmerci Date: Sat, 8 Mar 2025 22:17:49 +0800 Subject: [PATCH] enhance(rtc): generate migration new classes client-ops when rtc-start --- .../frontend/worker/rtc/gen_client_op.cljs | 36 ++++++++++++------- src/main/frontend/worker/rtc/migrate.cljs | 10 ++++-- .../worker/rtc/gen_client_op_test.cljs | 35 +++++++++++++++--- 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/src/main/frontend/worker/rtc/gen_client_op.cljs b/src/main/frontend/worker/rtc/gen_client_op.cljs index fbc186845b..be7c7d3d61 100644 --- a/src/main/frontend/worker/rtc/gen_client_op.cljs +++ b/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))) diff --git a/src/main/frontend/worker/rtc/migrate.cljs b/src/main/frontend/worker/rtc/migrate.cljs index dc0e83db2f..c1f4ff679e 100644 --- a/src/main/frontend/worker/rtc/migrate.cljs +++ b/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 diff --git a/src/test/frontend/worker/rtc/gen_client_op_test.cljs b/src/test/frontend/worker/rtc/gen_client_op_test.cljs index 8a95a42681..0b7346ad3b 100644 --- a/src/test/frontend/worker/rtc/gen_client_op_test.cljs +++ b/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?))))