diff --git a/deps/outliner/src/logseq/outliner/property.cljs b/deps/outliner/src/logseq/outliner/property.cljs index 46de4af4b4..292a96619e 100644 --- a/deps/outliner/src/logseq/outliner/property.cljs +++ b/deps/outliner/src/logseq/outliner/property.cljs @@ -669,14 +669,20 @@ :else (batch-remove-property! conn [eid] property-id))))) + (defn- set-block-db-attribute! - [conn db block property property-id v] - (throw-error-if-invalid-property-value db property v) - (when (= property-id :block/alias) - (throw-error-if-invalid-alias db block v)) - (when-not (and (= property-id :block/alias) (= v (:db/id block))) + [conn block property property-id raw-v tx-v] + (let [validation-db @conn + validation-v (if (and (= :db.type/ref (:db/valueType property)) + (some? tx-v)) + tx-v + raw-v)] + (throw-error-if-invalid-property-value validation-db property validation-v) + (when (= property-id :block/alias) + (doseq [alias-id (if (coll? tx-v) tx-v [tx-v])] + (throw-error-if-invalid-alias validation-db block alias-id))) (let [tx-data (cond-> - [{:db/id (:db/id block) property-id v}] + [{:db/id (:db/id block) property-id tx-v}] (= property-id :logseq.property.class/extends) (conj [:db/retract (:db/id block) :logseq.property.class/extends :logseq.class/Root]))] (ldb/transact! conn tx-data @@ -719,7 +725,7 @@ (outliner-validate/validate-extends-property @conn v' [block])) (cond db-attribute? - (set-block-db-attribute! conn db block property property-id v) + (set-block-db-attribute! conn block property property-id v v') :else (let [_ (assert (some? property) (str "Property " property-id " doesn't exist yet")) diff --git a/src/test/frontend/db/model_test.cljs b/src/test/frontend/db/model_test.cljs index edbf555e51..efcebbc760 100644 --- a/src/test/frontend/db/model_test.cljs +++ b/src/test/frontend/db/model_test.cljs @@ -79,6 +79,18 @@ conn (:db/id already-a) :block/alias (:db/id new-target))) "page that is an alias cannot gain its own aliases")))) +(deftest page-alias-converts-string-value-via-set-block-property + (let [conn (db-test/create-conn-with-blocks + {:pages-and-blocks [{:page {:block/title "canonical-string-alias"}}]}) + canonical (db-test/find-page-by-title @conn "canonical-string-alias")] + (outliner-property/set-block-property! + conn (:db/id canonical) :block/alias "string-alias") + (let [alias-page (db-test/find-page-by-title @conn "string-alias") + canonical' (d/entity @conn (:db/id canonical))] + (is alias-page) + (is (= #{(:db/id alias-page)} + (set (map :db/id (:block/alias canonical')))))))) + (deftest page-alias-invariants-reject-invalid-via-batch-set-property (testing "batch path: duplicate owner is rejected" (let [conn (db-test/create-conn-with-blocks