ソースを参照

fix: only manager can delete remote graph

Fixes LOG-3118
Tienson Qin 1 年間 前
コミット
18079d7e84
2 ファイル変更70 行追加51 行削除
  1. 53 50
      src/main/frontend/components/repo.cljs
  2. 17 1
      src/main/frontend/handler/user.cljs

+ 53 - 50
src/main/frontend/components/repo.cljs

@@ -65,58 +65,61 @@
 
      [:div.controls
       [:div.flex.flex-row.items-center
-       (ui/tippy {:html [:div.text-sm.max-w-xs
-                         (cond
-                           only-cloud?
-                           "Deletes this remote graph. Note this can't be recovered."
+       (let [current-repo (state/get-current-repo)
+             db-graph? (config/db-based-graph? current-repo)
+             manager? (and db-graph? (user-handler/manager? current-repo))]
+         (when-not (and db-graph? only-cloud? (not manager?))
+           (ui/tippy {:html [:div.text-sm.max-w-xs
+                             (cond
+                               only-cloud?
+                               "Deletes this remote graph. Note this can't be recovered."
 
-                           db-based?
-                           "Unsafe delete this DB-based graph. Note this can't be recovered."
+                               db-based?
+                               "Unsafe delete this DB-based graph. Note this can't be recovered."
 
-                           :else
-                           "Removes Logseq's access to the local file path of your graph. It won't remove your local files.")]
-                  :class "tippy-hover"
-                  :interactive true}
-                 [:a.text-gray-400.ml-4.font-medium.text-sm.whitespace-nowrap
-                  {:on-click (fn []
-                               (let [has-prompt? (or only-cloud? db-based?)
-                                     prompt-str (cond only-cloud?
-                                                      (str "Are you sure to permanently delete the graph \"" GraphName "\" from our server?")
-                                                      db-based?
-                                                      (str "Are you sure to permanently delete the graph \"" url "\" from Logseq?")
-                                                      :else
-                                                      "")
-                                     unlink-or-remote-fn (fn []
-                                                           (let [current-repo (state/get-current-repo)]
-                                                             (repo-handler/remove-repo! repo)
-                                                             (state/pub-event! [:graph/unlinked repo current-repo])))
-                                     action-confirm-fn (if only-cloud?
-                                                         (fn []
-                                                           (let [current-repo (state/get-current-repo)
-                                                                 delete-graph (if (config/db-based-graph? current-repo)
-                                                                                rtc-handler/<rtc-delete-graph!
-                                                                                file-sync/<delete-graph)]
-                                                             (state/set-state! [:file-sync/remote-graphs :loading] true)
-                                                             (go (<! (delete-graph GraphUUID))
-                                                                 (state/delete-repo! repo)
-                                                                 (state/delete-remote-graph! repo)
-                                                                 (state/set-state! [:file-sync/remote-graphs :loading] false))))
-                                                         unlink-or-remote-fn)
-                                     confirm-fn
-                                     (fn []
-                                       (ui/make-confirm-modal
-                                        {:title      [:div
-                                                      {:style {:max-width 700}}
-                                                      prompt-str]
-                                         :sub-title   [:div.small.mt-1
-                                                       "Notice that we can't recover this graph after being deleted. Make sure you have backups before deleting it."]
-                                         :on-confirm (fn [_ {:keys [close-fn]}]
-                                                       (close-fn)
-                                                       (action-confirm-fn))}))]
-                                 (if has-prompt?
-                                   (state/set-modal! (confirm-fn))
-                                   (unlink-or-remote-fn))))}
-                  (if only-cloud? "Remove (server)" "Unlink (local)")])]]]))
+                               :else
+                               "Removes Logseq's access to the local file path of your graph. It won't remove your local files.")]
+                      :class "tippy-hover"
+                      :interactive true}
+                     [:a.text-gray-400.ml-4.font-medium.text-sm.whitespace-nowrap
+                      {:on-click (fn []
+                                   (let [has-prompt? (or only-cloud? db-based?)
+                                         prompt-str (cond only-cloud?
+                                                          (str "Are you sure to permanently delete the graph \"" GraphName "\" from our server?")
+                                                          db-based?
+                                                          (str "Are you sure to permanently delete the graph \"" url "\" from Logseq?")
+                                                          :else
+                                                          "")
+                                         unlink-or-remote-fn (fn []
+                                                               (repo-handler/remove-repo! repo)
+                                                               (state/pub-event! [:graph/unlinked repo current-repo]))
+                                         action-confirm-fn (if only-cloud?
+                                                             (fn []
+                                                               (when (or manager? (not db-graph?))
+                                                                 (let [delete-graph (if db-graph?
+                                                                                      rtc-handler/<rtc-delete-graph!
+                                                                                      file-sync/<delete-graph)]
+                                                                   (state/set-state! [:file-sync/remote-graphs :loading] true)
+                                                                   (go (<! (delete-graph GraphUUID))
+                                                                       (state/delete-repo! repo)
+                                                                       (state/delete-remote-graph! repo)
+                                                                       (state/set-state! [:file-sync/remote-graphs :loading] false)))))
+                                                             unlink-or-remote-fn)
+                                         confirm-fn
+                                         (fn []
+                                           (ui/make-confirm-modal
+                                            {:title      [:div
+                                                          {:style {:max-width 700}}
+                                                          prompt-str]
+                                             :sub-title   [:div.small.mt-1
+                                                           "Notice that we can't recover this graph after being deleted. Make sure you have backups before deleting it."]
+                                             :on-confirm (fn [_ {:keys [close-fn]}]
+                                                           (close-fn)
+                                                           (action-confirm-fn))}))]
+                                     (if has-prompt?
+                                       (state/set-modal! (confirm-fn))
+                                       (unlink-or-remote-fn))))}
+                      (if only-cloud? "Remove (server)" "Unlink (local)")])))]]]))
 
 (rum/defc repos < rum/reactive
   []

+ 17 - 1
src/main/frontend/handler/user.cljs

@@ -13,7 +13,9 @@
             [frontend.state :as state]
             [goog.crypt :as crypt]
             [goog.crypt.Hmac]
-            [goog.crypt.Sha256]))
+            [goog.crypt.Sha256]
+            [logseq.db :as ldb]
+            [frontend.db :as db]))
 
 (defn set-preferred-format!
   [format]
@@ -276,6 +278,20 @@
   []
   (or (alpha-user?) (beta-user?)))
 
+(defn get-user-type
+  [repo]
+  (when-let [uuid (ldb/get-graph-rtc-uuid (db/get-db repo))]
+    (-> (some #(when (= uuid (:GraphUUID %)) %) (:rtc/graphs @state/state))
+        :graph<->user-user-type)))
+
+(defn manager?
+  [repo]
+  (= (get-user-type repo) "manager"))
+
+(defn member?
+  [repo]
+  (= (get-user-type repo) "member"))
+
 (comment
   ;; We probably need this for some new features later
   (defonce feature-matrix {:file-sync :beta})