-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdatabase.mjs
168 lines (148 loc) · 4.11 KB
/
database.mjs
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import { pgPool } from './database-config.mjs'
import format from 'pg-format'
export async function getTokensByPubKey(pubkey) {
const result = await pgPool.query(
`SELECT DISTINCT TOKEN AS token, MAX(ID) as max_id
FROM subscriptions
WHERE PUB_KEY = $1
GROUP BY TOKEN
ORDER BY max_id DESC`,
[pubkey]
);
if (!result || !result.rows || !result.rows.length) return [];
let tokens = []
for (let row of result.rows) {
tokens.push(row.token)
}
return tokens
}
export async function getAllKeys() {
const result = await pgPool.query(
`SELECT DISTINCT PUB_KEY AS key
FROM subscriptions
`
)
if (!result || !result.rows || !result.rows.length) return [];
let keys = []
for (let row of result.rows) {
keys.push(row.key)
}
return keys
}
export async function getAllRelays() {
const result = await pgPool.query(
`SELECT RTRIM(TRIM(RELAY),'/') AS relay, COUNT(*) AS votes
FROM subscriptions
group by RTRIM(TRIM(RELAY),'/')
order by votes desc
`
)
if (!result || !result.rows || !result.rows.length) return [];
let relays = []
for (let row of result.rows) {
relays.push(row.relay)
}
return relays
}
export async function registerInDatabase(pubkey, relays, token) {
for (let relay of relays) {
pgPool.query(
`INSERT INTO subscriptions (PUB_KEY, RELAY, TOKEN)
VALUES ($1, $2, $3)
ON CONFLICT (PUB_KEY, RELAY, TOKEN)
DO NOTHING;
`,
[pubkey, relay || null, token],
(err, res) => {
if (err) {
console.log("Database Insert: " + err)
}
}
)
}
}
export async function registerInDatabaseTuples(pubkeyRelaysTokenTuples) {
pgPool.query(
format(
`INSERT INTO subscriptions (PUB_KEY, RELAY, TOKEN)
VALUES %L
ON CONFLICT (PUB_KEY, RELAY, TOKEN)
DO NOTHING;
`, pubkeyRelaysTokenTuples
),
[],
(err, res) => {
if (err) {
console.log("Multi Database Insert: " + err)
}
}
)
}
export async function deleteToken(token) {
pgPool.query(
`DELETE from subscriptions
WHERE TOKEN = $1
`,
[token],
(err, res) => {
if (err) {
console.log("Delete Token Error: " + err)
}
if (res) {
console.log("Token Deleted: " + token)
}
}
)
}
export async function deleteRelay(relayUrl) {
pgPool.query(
`DELETE from subscriptions
WHERE rtrim(TRIM(RELAY),'/') = $1
`,
[relayUrl],
(err, res) => {
if (err) {
console.log("Delete Relay Error: " + err)
}
if (res) {
console.log("Relay Deleted: " + relayUrl)
}
}
)
}
export async function checkIfPubKeyExists(pubkey) {
const result = await pgPool.query(
`SELECT COUNT(*) AS instances
FROM subscriptions
WHERE PUB_KEY = $1
`,
[pubkey]
);
if (!result || !result.rows || !result.rows.length) return [];
return result.rows[0].instances && result.rows[0].instances > 0
}
export async function checkIfRelayExists(relay) {
const result = await pgPool.query(
`SELECT COUNT(*) AS instances
FROM subscriptions
WHERE RELAY = $1
`,
[relay]
);
if (!result || !result.rows || !result.rows.length) return [];
return result.rows[0].instances && result.rows[0].instances > 0
}
export async function checkIfThereIsANewRelay(relayList) {
const result = await pgPool.query(
format(
`VALUES %L
EXCEPT ALL
SELECT RELAY from subscriptions
`,
relayList.map( url => [url])
),
[]
);
if (!result || !result.rows || !result.rows.length) return false;
return result.rows.length > 0
}