Просмотр исходного кода

fix: ensure user doesn't have graphs with same name

Tienson Qin 1 месяц назад
Родитель
Сommit
fe313b50dc

+ 10 - 0
deps/db-sync/src/logseq/db_sync/index.cljs

@@ -75,6 +75,16 @@
    (common/<d1-run db "delete from graph_members where graph_id = ?" graph-id)
    (common/<d1-run db "delete from graphs where graph_id = ?" graph-id)))
 
+(defn <graph-name-exists?
+  [db graph-name user-id]
+  (when (and (string? graph-name) (string? user-id))
+    (p/let [result (common/<d1-all db
+                                   "select graph_id from graphs where graph_name = ? and user_id = ?"
+                                   graph-name
+                                   user-id)
+            rows (common/get-sql-rows result)]
+      (boolean (seq rows)))))
+
 (defn <user-upsert! [db claims]
   (let [user-id (aget claims "sub")]
     (when (string? user-id)

+ 6 - 3
deps/db-sync/src/logseq/db_sync/worker.cljs

@@ -923,9 +923,12 @@
 
                            :else
                            (p/let [{:keys [graph-name schema-version]} body
-                                   _ (index/<index-upsert! db graph-id graph-name user-id schema-version)
-                                   _ (index/<graph-member-upsert! db graph-id user-id "manager" user-id)]
-                             (json-response :graphs/create {:graph-id graph-id})))))))
+                                   name-exists? (index/<graph-name-exists? db graph-name user-id)]
+                             (if name-exists?
+                               (bad-request "duplicate graph name")
+                               (p/let [_ (index/<index-upsert! db graph-id graph-name user-id schema-version)
+                                       _ (index/<graph-member-upsert! db graph-id user-id "manager" user-id)]
+                                 (json-response :graphs/create {:graph-id graph-id})))))))))
 
             (and (= method "GET")
                  (= 3 (count parts))

+ 32 - 0
deps/db-sync/test/logseq/db_sync/index_test.cljs

@@ -111,6 +111,16 @@
                              (filter (fn [row] (contains? member-ids (:graph-id row)))))]
       (js-rows (concat owned member-graphs)))
 
+    (string/includes? sql "select graph_id from graphs where graph_name")
+    (let [[graph-name user-id] args
+          rows (->> (:graphs @state)
+                    vals
+                    (filter (fn [row]
+                              (and (= graph-name (:graph-name row))
+                                   (= user-id (:user-id row)))))
+                    (map (fn [row] {:graph-id (:graph-id row)})))]
+      (js-rows rows))
+
     :else
     (js-rows [])))
 
@@ -171,6 +181,28 @@
                           (is false (str e))
                           (done)))))))
 
+(deftest graph-name-exists-test
+  (async done
+         (let [state (atom {:executed []
+                            :users {}
+                            :graph-members {}
+                            :graphs {}})
+               db (make-d1 state)]
+           (-> (p/do!
+                (index/<index-upsert! db "graph-1" "alpha" "user-1" "1")
+                (index/<index-upsert! db "graph-2" "beta" "user-2" "1"))
+               (p/then (fn [_]
+                         (p/let [exists? (index/<graph-name-exists? db "alpha" "user-1")
+                                 missing? (index/<graph-name-exists? db "alpha" "user-2")
+                                 other? (index/<graph-name-exists? db "beta" "user-1")]
+                           (is (true? exists?))
+                           (is (false? missing?))
+                           (is (false? other?))
+                           (done))))
+               (p/catch (fn [e]
+                          (is false (str e))
+                          (done)))))))
+
 (deftest graph-member-upsert-test
   (async done
          (let [state (atom {:executed []