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

This commit is contained in:
Tienson Qin
2026-01-21 22:56:51 +08:00
parent 83a3a7cdf9
commit fe313b50dc
3 changed files with 48 additions and 3 deletions

View File

@@ -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)

View File

@@ -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))

View File

@@ -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 []