Преглед изворни кода

fix: rebuild block refs & path-refs after downloading a remote graph

Fixes LOG-3115
Tienson Qin пре 2 година
родитељ
комит
eae35d60e4

+ 15 - 1
deps/db/src/logseq/db/frontend/content.cljs

@@ -30,7 +30,7 @@
    refs))
    refs))
 
 
 (defn special-id-ref->page
 (defn special-id-ref->page
-  "Convert special id ref backs to page name."
+  "Convert special id ref backs to page name using refs."
   [content refs]
   [content refs]
   (reduce
   (reduce
    (fn [content ref]
    (fn [content ref]
@@ -45,6 +45,20 @@
    content
    content
    refs))
    refs))
 
 
+(defn db-special-id-ref->page
+  "Convert special id ref backs to page name using `db`."
+  [db content]
+  (let [matches (distinct (re-seq special-id-ref-pattern content))]
+    (if (seq matches)
+      (reduce (fn [content [full-text id]]
+                (if-let [page (d/entity db [:block/uuid (uuid id)])]
+                  (string/replace content full-text
+                                  (str page-ref/left-brackets
+                                       (:block/original-name page)
+                                       page-ref/right-brackets))
+                  content)) content matches)
+      content)))
+
 (defn page-ref->special-id-ref
 (defn page-ref->special-id-ref
   "Convert page ref to special id refs e.g. `[[page name]] -> [[~^...]]"
   "Convert page ref to special id refs e.g. `[[page name]] -> [[~^...]]"
   [content refs]
   [content refs]

+ 7 - 2
deps/graph-parser/src/logseq/graph_parser/block.cljs

@@ -12,7 +12,8 @@
             [logseq.graph-parser.utf8 :as utf8]
             [logseq.graph-parser.utf8 :as utf8]
             [logseq.common.util :as common-util]
             [logseq.common.util :as common-util]
             [logseq.common.util.block-ref :as block-ref]
             [logseq.common.util.block-ref :as block-ref]
-            [logseq.common.util.page-ref :as page-ref]))
+            [logseq.common.util.page-ref :as page-ref]
+            [datascript.impl.entity :as de]))
 
 
 (defn heading-block?
 (defn heading-block?
   [block]
   [block]
@@ -825,8 +826,12 @@
           refs' (->> (concat page-refs block-refs)
           refs' (->> (concat page-refs block-refs)
                      (remove string/blank?)
                      (remove string/blank?)
                      distinct)]
                      distinct)]
-      (-> (map #(if (common-util/uuid-string? %)
+      (-> (map #(cond
+                  (de/entity? %)
+                  {:block/uuid (:block/uuid %)}
+                  (common-util/uuid-string? %)
                   {:block/uuid (uuid %)}
                   {:block/uuid (uuid %)}
+                  :else
                   (page-name->map % true db true date-formatter))
                   (page-name->map % true db true date-formatter))
                refs')
                refs')
           set))))
           set))))

+ 1 - 2
src/main/frontend/db_worker.cljs

@@ -173,8 +173,7 @@
             conn (sqlite-common-db/get-storage-conn storage schema)]
             conn (sqlite-common-db/get-storage-conn storage schema)]
         (swap! *datascript-conns assoc repo conn)
         (swap! *datascript-conns assoc repo conn)
         (p/let [_ (op-mem-layer/<init-load-from-indexeddb! repo)]
         (p/let [_ (op-mem-layer/<init-load-from-indexeddb! repo)]
-          (rtc-db-listener/listen-to-db-changes! repo conn))
-        nil))))
+          (rtc-db-listener/listen-to-db-changes! repo conn))))))
 
 
 (defn- iter->vec [iter]
 (defn- iter->vec [iter]
   (when iter
   (when iter

+ 1 - 17
src/main/frontend/worker/rtc/core.cljs

@@ -6,7 +6,6 @@
             [cljs.core.async :as async :refer [<! >! chan go]]
             [cljs.core.async :as async :refer [<! >! chan go]]
             [cljs.core.async.interop :include-macros true :refer [<p!]]
             [cljs.core.async.interop :include-macros true :refer [<p!]]
             [clojure.set :as set]
             [clojure.set :as set]
-            [clojure.string :as string]
             [cognitect.transit :as transit]
             [cognitect.transit :as transit]
             [datascript.core :as d]
             [datascript.core :as d]
             [frontend.worker.async-util :include-macros true :refer [<? go-try]]
             [frontend.worker.async-util :include-macros true :refer [<? go-try]]
@@ -21,7 +20,6 @@
             [frontend.worker.util :as worker-util]
             [frontend.worker.util :as worker-util]
             [logseq.common.config :as common-config]
             [logseq.common.config :as common-config]
             [logseq.common.util :as common-util]
             [logseq.common.util :as common-util]
-            [logseq.common.util.page-ref :as page-ref]
             [logseq.db :as ldb]
             [logseq.db :as ldb]
             [logseq.db.frontend.content :as db-content]
             [logseq.db.frontend.content :as db-content]
             [logseq.db.frontend.property :as db-property]
             [logseq.db.frontend.property :as db-property]
@@ -351,20 +349,6 @@
         (assert (some? shape) properties*)
         (assert (some? shape) properties*)
         (transact-db! :upsert-whiteboard-block conn [(gp-whiteboard/shape->block repo db shape page-name)])))))
         (transact-db! :upsert-whiteboard-block conn [(gp-whiteboard/shape->block repo db shape page-name)])))))
 
 
-(defn- special-id-ref->page
-  "Convert special id ref backs to page name."
-  [db content]
-  (let [matches (distinct (re-seq db-content/special-id-ref-pattern content))]
-    (if (seq matches)
-      (reduce (fn [content [full-text id]]
-                (if-let [page (d/entity db [:block/uuid (uuid id)])]
-                  (string/replace content full-text
-                                  (str page-ref/left-brackets
-                                       (:block/original-name page)
-                                       page-ref/right-brackets))
-                  content)) content matches)
-      content)))
-
 (defn- need-update-block?
 (defn- need-update-block?
   [conn block-uuid op-value]
   [conn block-uuid op-value]
   (let [ent (d/entity @conn [:block/uuid block-uuid])]
   (let [ent (d/entity @conn [:block/uuid block-uuid])]
@@ -409,7 +393,7 @@
                        (not= (:content op-value)
                        (not= (:content op-value)
                              (:block/raw-content b-ent)))
                              (:block/raw-content b-ent)))
                   (assoc :block/content
                   (assoc :block/content
-                         (special-id-ref->page @conn (:content op-value)))
+                         (db-content/special-id-ref->page @conn (:content op-value)))
 
 
                   (contains? key-set :updated-at)     (assoc :block/updated-at (:updated-at op-value))
                   (contains? key-set :updated-at)     (assoc :block/updated-at (:updated-at op-value))
                   (contains? key-set :created-at)     (assoc :block/created-at (:created-at op-value))
                   (contains? key-set :created-at)     (assoc :block/created-at (:created-at op-value))

+ 27 - 1
src/main/frontend/worker/rtc/full_upload_download_graph.cljs

@@ -13,7 +13,11 @@
             [frontend.worker.state :as worker-state]
             [frontend.worker.state :as worker-state]
             [frontend.worker.util :as worker-util]
             [frontend.worker.util :as worker-util]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.frontend.schema :as db-schema]
-            [promesa.core :as p]))
+            [logseq.outliner.core :as outliner-core]
+            [logseq.db.frontend.content :as db-content]
+            [promesa.core :as p]
+            [clojure.string :as string]
+            [logseq.common.util.page-ref :as page-ref]))
 
 
 (def transit-r (transit/reader :json))
 (def transit-r (transit/reader :json))
 
 
@@ -126,6 +130,27 @@
                 b)))
                 b)))
           blocks)))
           blocks)))
 
 
+(defn- transact-block-refs!
+  [repo]
+  (when-let [conn (worker-state/get-datascript-conn repo)]
+    (let [date-formatter (worker-state/get-date-formatter repo)
+          db @conn
+          ;; get all the block datoms
+          datoms (d/datoms db :avet :block/uuid)
+          refs-tx (keep
+                   (fn [d]
+                     (let [block (d/entity @conn (:e d))
+                           block' (let [content (:block/content block)]
+                                    (if (and content (string/includes? content (str page-ref/left-brackets db-content/page-ref-special-chars)))
+                                      (assoc block :block/content (db-content/db-special-id-ref->page db content))
+                                      block))
+                           refs (outliner-core/rebuild-block-refs repo conn date-formatter block' {})]
+                       (when (seq refs)
+                         {:db/id (:db/id block)
+                          :block/refs refs})))
+                   datoms)]
+      (d/transact! conn refs-tx {:outliner-op :rtc-download-rebuild-block-refs}))))
+
 (defn- <transact-remote-all-blocks-to-sqlite
 (defn- <transact-remote-all-blocks-to-sqlite
   [all-blocks repo graph-uuid]
   [all-blocks repo graph-uuid]
   (go-try
   (go-try
@@ -139,6 +164,7 @@
                (.createOrOpenDB worker-obj repo {:close-other-db? false})
                (.createOrOpenDB worker-obj repo {:close-other-db? false})
                (.exportDB worker-obj repo)
                (.exportDB worker-obj repo)
                (.transact worker-obj repo tx-data {:rtc-download-graph? true} (worker-state/get-context))
                (.transact worker-obj repo tx-data {:rtc-download-graph? true} (worker-state/get-context))
+               (transact-block-refs! repo)
                (.closeDB worker-obj repo))]
                (.closeDB worker-obj repo))]
      (<? (p->c work))
      (<? (p->c work))