skeleton.cljs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. (ns frontend.worker.rtc.skeleton
  2. "Validate skeleton data between server and client"
  3. (:require [datascript.core :as d]
  4. [frontend.worker.rtc.ws-util :as ws-util]
  5. [logseq.db :as ldb]
  6. [missionary.core :as m]))
  7. (defn- block-ref-type-attributes
  8. [db-schema]
  9. (->> db-schema
  10. (keep (fn [[k v]]
  11. (when (and (keyword? k)
  12. (= :db.type/ref (:db/valueType v)))
  13. k)))
  14. set))
  15. (defn- block-card-many-attributes
  16. [db-schema]
  17. (->> db-schema
  18. (keep (fn [[k v]]
  19. (when (and (keyword? k)
  20. (= :db.cardinality/many (:db/cardinality v)))
  21. k)))
  22. set))
  23. (defn- get-builtin-db-ident-blocks
  24. [db]
  25. (let [db-schema (d/schema db)
  26. block-ref-type-attrs (block-ref-type-attributes db-schema)
  27. block-card-many-attrs (block-card-many-attributes db-schema)
  28. pull-pattern ['* (into {} (map (fn [k] [k [:block/uuid]]) block-ref-type-attrs))]
  29. block-ids (->> (d/q '[:find ?b
  30. :in $
  31. :where
  32. [?b :db/ident]
  33. [?b :block/uuid]
  34. [?b :logseq.property/built-in?]]
  35. db)
  36. (apply concat))]
  37. (map (fn [m]
  38. (into {}
  39. (keep
  40. (fn [[k v]]
  41. (when-not (contains? #{:db/id} k)
  42. (let [v-converter
  43. (case [(contains? block-ref-type-attrs k)
  44. (contains? block-card-many-attrs k)]
  45. [true true] (partial map :block/uuid)
  46. [true false] :block/uuid
  47. [false true] (partial map ldb/write-transit-str)
  48. [false false] ldb/write-transit-str)
  49. v* (v-converter v)
  50. v** (if (contains? #{:db/ident :block/order} k)
  51. (ldb/read-transit-str v*)
  52. v*)]
  53. [k v**]))))
  54. m))
  55. (d/pull-many db pull-pattern block-ids))))
  56. (defn- get-schema-version
  57. [db]
  58. (:kv/value (d/entity db :logseq.kv/schema-version)))
  59. (defn new-task--calibrate-graph-skeleton
  60. [get-ws-create-task graph-uuid conn t]
  61. (m/sp
  62. (let [db @conn
  63. db-ident-blocks (get-builtin-db-ident-blocks db)
  64. r (m/? (ws-util/send&recv get-ws-create-task
  65. {:action "calibrate-graph-skeleton"
  66. :graph-uuid graph-uuid
  67. :t t
  68. :db-ident-blocks db-ident-blocks
  69. :schema-version (get-schema-version db)}))]
  70. (if-let [remote-ex (:ex-data r)]
  71. (do (prn {:remote-ex remote-ex})
  72. (throw (ex-info "Unavailable2" {:remote-ex remote-ex})))
  73. (let [server-only-db-ident-blocks (some-> (:server-only-db-ident-blocks r)
  74. ldb/read-transit-str)]
  75. (when (seq server-only-db-ident-blocks)
  76. (throw (ex-info "different graph skeleton between server and client"
  77. {:type :rtc.exception/different-graph-skeleton
  78. :server-schema-version (:server-schema-version r)
  79. :server-only-db-ident-blocks server-only-db-ident-blocks}))))))))