Browse Source

enhance: store remote graph uuid in metadata.edn

We need the remote graph uuid to bind current local db (if exists)
with the remote one.
Tienson Qin 1 year ago
parent
commit
0aa8ab5fab

+ 3 - 17
src/main/frontend/components/repo.cljs

@@ -22,7 +22,7 @@
             [frontend.util.fs :as fs-util]
             [frontend.handler.user :as user-handler]
             [logseq.shui.ui :as shui]
-            [frontend.persist-db.browser :as db-browser]))
+            [frontend.handler.db-based.rtc :as rtc-handler]))
 
 (rum/defc normalized-graph-label
   [{:keys [url remote? GraphName GraphUUID] :as graph} on-click]
@@ -292,20 +292,6 @@
   (or (fs-util/include-reserved-chars? graph-name)
       (string/includes? graph-name "+")))
 
-(defn- rtc-create-graph!
-  [repo]
-  (let [token (state/get-auth-id-token)
-        ^js worker @db-browser/*worker]
-    (.rtc-upload-graph worker repo token)))
-
-(defn- rtc-start!
-  [repo]
-  (let [token (state/get-auth-id-token)
-        ^object worker @db-browser/*worker]
-    (.rtc-start worker repo token
-                (and config/dev?
-                     (state/sub [:ui/developer-mode?])))))
-
 (rum/defcs new-db-graph <
   (rum/local "" ::graph-name)
   (rum/local false ::cloud?)
@@ -318,8 +304,8 @@
                        (invalid-graph-name-warning)
                        (p/let [repo (repo-handler/new-db! @*graph-name)]
                          (when @*cloud?
-                           (p/let [_create-result (rtc-create-graph! repo)
-                                   _start-result (rtc-start! repo)]
+                           (p/let [_create-result (rtc-handler/<rtc-create-graph! repo)
+                                   _start-result (rtc-handler/<rtc-start! repo)]
                              ;; TODO: can't pr-str result
                              (state/close-modal!)))))))]
     [:div.new-graph.flex.flex-col.p-4.gap-4

+ 13 - 8
src/main/frontend/db/persist.cljs

@@ -11,15 +11,20 @@
 
 (defn get-all-graphs
   []
-  (p/let [repos (idb/get-nfs-dbs)
-          db-repos (persist-db/<list-db)
-          db-repos' (map
-                      #(if (config/local-file-based-graph? %)
-                         %
-                         (str config/db-version-prefix %))
-                      db-repos)
+  (p/let [idb-repos (idb/get-nfs-dbs)
+          repos (persist-db/<list-db)
+          repos' (map
+                  (fn [{:keys [name] :as repo}]
+                    (assoc repo :name
+                           (if (config/local-file-based-graph? name)
+                             name
+                             (str config/db-version-prefix name))))
+                  repos)
           electron-disk-graphs (when (util/electron?) (ipc/ipc "getGraphs"))]
-    (distinct (concat repos db-repos' (some-> electron-disk-graphs bean/->clj)))))
+    (distinct (concat
+               repos'
+               (map (fn [repo-name] {:name repo-name})
+                 (concat idb-repos (some-> electron-disk-graphs bean/->clj)))))))
 
 (defn delete-graph!
   [graph]

+ 37 - 19
src/main/frontend/db_worker.cljs

@@ -206,6 +206,37 @@
                         (rest dirs))]
             (p/recur result dirs)))))))
 
+(defn- <list-all-dbs
+  []
+  (let [dir? #(= (.-kind %) "directory")]
+    (p/let [^js root (.getDirectory js/navigator.storage)
+            values-iter (when (dir? root) (.values root))
+            values (when values-iter (iter->vec values-iter))
+            current-dir-dirs (filter dir? values)
+            db-dirs (filter (fn [file]
+                              (string/starts-with? (.-name file) ".logseq-pool-"))
+                            current-dir-dirs)]
+      (p/all (map (fn [dir]
+                    (p/let [graph-name (-> (.-name dir)
+                                           (string/replace-first ".logseq-pool-" "")
+                                         ;; TODO: DRY
+                                           (string/replace "+3A+" ":")
+                                           (string/replace "++" "/"))
+                            metadata-file-handle (.getFileHandle dir "metadata.edn" #js {:create true})
+                            metadata-file (.getFile metadata-file-handle)
+                            metadata (.text metadata-file)]
+                      {:name graph-name
+                       :metadata (edn/read-string metadata)})) db-dirs)))))
+
+(defn- <store-metadata
+  [graph metadata-str]
+  (p/let [^js root (.getDirectory js/navigator.storage)
+          dir-handle (.getDirectoryHandle root (str "." (get-pool-name graph)))
+          file-handle (.getFileHandle dir-handle "metadata.edn" #js {:create true})
+          writable (.createWritable file-handle)
+          _ (.write writable metadata-str)]
+    (.close writable)))
+
 (defn- <db-exists?
   [graph]
   (->
@@ -246,26 +277,13 @@
    (reset! worker-state/*rtc-ws-url rtc-ws-url)
    (init-sqlite-module!))
 
+  (storeMetadata
+   [_this graph metadata-str]
+   (<store-metadata graph metadata-str))
+
   (listDB
    [_this]
-   (p/let [all-files (<list-all-files)
-           dbs (->>
-                (keep (fn [file]
-                        (when (and
-                               (= (.-kind file) "directory")
-                               (string/starts-with? (.-name file) ".logseq-pool-"))
-                          (-> (.-name file)
-                              (string/replace-first ".logseq-pool-" "")
-                              ;; TODO: DRY
-                              (string/replace "+3A+" ":")
-                              (string/replace "++" "/"))))
-                      all-files)
-                distinct)]
-     ;; (prn :debug :all-files (map #(.-name %) all-files))
-     ;; (prn :debug :all-files-count (count (filter
-     ;;                                      #(= (.-kind %) "file")
-     ;;                                      all-files)))
-     ;; (prn :dbs dbs)
+   (p/let [dbs (<list-all-dbs)]
      (bean/->js dbs)))
 
   (createOrOpenDB
@@ -641,7 +659,7 @@
   (dangerousRemoveAllDbs
    [this repo]
    (p/let [dbs (.listDB this)]
-     (p/all (map #(.unsafeUnlinkDB this %) dbs)))))
+     (p/all (map #(.unsafeUnlinkDB this (:name %)) dbs)))))
 
 (defn init
   "web worker entry"

+ 38 - 0
src/main/frontend/handler/db_based/rtc.cljs

@@ -0,0 +1,38 @@
+(ns frontend.handler.db-based.rtc
+  "RTC handler"
+  (:require [frontend.state :as state]
+            [cljs-bean.core :as bean]
+            [promesa.core :as p]
+            [frontend.config :as config]))
+
+(defn <rtc-create-graph!
+  [repo]
+  (let [token (state/get-auth-id-token)
+        ^js worker @state/*db-worker]
+    (.rtc-upload-graph worker repo token)))
+
+(defn <rtc-start!
+  [repo]
+  (let [token (state/get-auth-id-token)
+        ^object worker @state/*db-worker]
+    (.rtc-start worker repo token
+                (and config/dev?
+                     (state/sub [:ui/developer-mode?])))))
+
+;; TODO: rtc-get-graphs should be using HTTP GET instead of websocket,
+;; because the user may not create any remote graph yet.
+;; FIXME: missing graph name
+(defn <get-remote-graphs
+  []
+  (let [repo (state/get-current-repo)
+        token (state/get-auth-id-token)
+        ^object worker @state/*db-worker]
+    (p/let [result (.rtc-get-graphs worker repo token)
+            graph-list (bean/->clj result)]
+      graph-list
+      ;; (swap! debug-state assoc
+      ;;        :remote-graphs
+      ;;        (map
+      ;;         #(select-keys % [:graph-uuid :graph-status])
+      ;;         graph-list))
+      )))

+ 11 - 7
src/main/frontend/handler/repo.cljs

@@ -106,9 +106,12 @@
   []
   (p/let [nfs-dbs (db-persist/get-all-graphs)
           nfs-dbs (map (fn [db]
-                         {:url db
-                          :root (config/get-local-dir db)
-                          :nfs? true}) nfs-dbs)
+                         (let [graph-name (:name db)]
+                           {:url graph-name
+                            :metadata (:metadata db)
+                            :root (config/get-local-dir graph-name)
+                            :nfs? true}))
+                       nfs-dbs)
           nfs-dbs (and (seq nfs-dbs)
                        (cond (util/electron?)
                              (ipc/ipc :inflateGraphsInfo nfs-dbs)
@@ -128,10 +131,11 @@
         :example? true}])))
 
 (defn combine-local-&-remote-graphs
-  [demo-repos remote-repos]
-  (when-let [repos' (seq (concat (map #(if-let [sync-meta (seq (:sync-meta %))]
-                                         (assoc % :GraphUUID (second sync-meta)) %)
-                                   demo-repos)
+  [local-repos remote-repos]
+  (when-let [repos' (seq (concat (map (fn [{:keys [sync-meta metadata] :as repo}]
+                                        (let [graph-id (or (:graph/uuid metadata) (second sync-meta))]
+                                          (if graph-id (assoc repo :GraphUUID graph-id) repo)))
+                                      local-repos)
                                  (some->> remote-repos
                                           (map #(assoc % :remote? true)))))]
     (let [repos' (group-by :GraphUUID repos')

+ 12 - 5
src/main/frontend/worker/rtc/full_upload_download_graph.cljs

@@ -51,11 +51,18 @@
         (let [r (<! (get-result-ch))]
           (if-not (:graph-uuid r)
             (ex-info "upload graph failed" r)
-            (do (op-mem-layer/init-empty-ops-store! repo)
-                (op-mem-layer/update-graph-uuid! repo (:graph-uuid r))
-                (op-mem-layer/update-local-tx! repo (:t r))
-                (<! (op-mem-layer/<sync-to-idb-layer! repo))
-                r)))))))
+            (let [^js worker-obj (:worker/object @worker-state/*state)]
+              (d/transact! conn
+                           [{:db/ident :graph/uuid :graph/uuid (:graph-uuid r)}
+                            {:db/ident :graph/local-tx :graph/local-tx (:graph-uuid r)}])
+              (<! (p->c
+                   (p/do!
+                     (.storeMetadata worker-obj repo (pr-str {:graph/uuid (:graph-uuid r)})))))
+              (op-mem-layer/init-empty-ops-store! repo)
+              (op-mem-layer/update-graph-uuid! repo (:graph-uuid r))
+              (op-mem-layer/update-local-tx! repo (:t r))
+              (<! (op-mem-layer/<sync-to-idb-layer! repo))
+              r)))))))
 
 (def block-type-kw->str
   {:block-type/property     "property"