/
conn.cljs
99 lines (84 loc) · 2.57 KB
/
conn.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
(ns frontend.db.conn
"Contains db connections."
(:require [clojure.string :as string]
[frontend.db-schema :as db-schema]
[frontend.db.default :as default-db]
[frontend.util :as util]
[frontend.mobile.util :as mobile-util]
[frontend.state :as state]
[frontend.config :as config]
[frontend.text :as text]
[datascript.core :as d]))
(defonce conns (atom {}))
(defn get-repo-path
[url]
(if (util/starts-with? url "http")
(->> (take-last 2 (string/split url #"/"))
(string/join "/"))
url))
(defn get-repo-name
[repo]
(cond
(mobile-util/native-platform?)
(text/get-graph-name-from-path repo)
(config/local-db? repo)
(config/get-local-dir repo)
:else
(get-repo-path repo)))
(defn get-short-repo-name
"repo-path: output of `get-repo-name`"
[repo-path]
(if (or (util/electron?)
(mobile-util/native-platform?))
(text/get-file-basename repo-path)
repo-path))
(defn datascript-db
[repo]
(when repo
(let [path (get-repo-path repo)]
(str (if (util/electron?) "" config/idb-db-prefix)
path))))
(defn get-db
([]
(get-db (state/get-current-repo) true))
([repo-or-deref?]
(if (boolean? repo-or-deref?)
(get-db (state/get-current-repo) repo-or-deref?)
(get-db repo-or-deref? true)))
([repo deref?]
(let [repo (if repo repo (state/get-current-repo))]
(when-let [conn (get @conns (datascript-db repo))]
(if deref?
@conn
conn)))))
(defn reset-conn! [conn db]
(reset! conn db))
(defn remove-conn!
[repo]
(swap! conns dissoc (datascript-db repo)))
(defn me-tx
[_db {:keys [name email avatar]}]
(util/remove-nils {:me/name name
:me/email email
:me/avatar avatar}))
(defn start!
([me repo]
(start! me repo {}))
([me repo {:keys [db-type listen-handler]}]
(let [db-name (datascript-db repo)
db-conn (d/create-conn db-schema/schema)]
(swap! conns assoc db-name db-conn)
(d/transact! db-conn [(cond-> {:schema/version db-schema/version}
db-type
(assoc :db/type db-type))
{:block/name "card"
:block/original-name "card"
:block/uuid (d/squuid)}])
(when me
(d/transact! db-conn [(me-tx (d/db db-conn) me)]))
(d/transact! db-conn default-db/built-in-pages)
(when listen-handler
(listen-handler repo)))))
(defn destroy-all!
[]
(reset! conns {}))