Skip to content

Commit 77b0ef0

Browse files
committed
fix: not all roles appearing
1 parent 5b82795 commit 77b0ef0

File tree

4 files changed

+82
-77
lines changed

4 files changed

+82
-77
lines changed

src/api/roles.ts

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,31 +40,51 @@ router.post('/', async (req, res) => {
4040
try {
4141
const {
4242
name,
43-
is_super_user = false,
44-
has_create_db_privileges = false,
45-
has_replication_privileges = false,
43+
is_superuser = false,
44+
can_create_db = false,
45+
can_create_role = false,
46+
inherit_role = true,
47+
can_login = false,
48+
is_replication_role = false,
4649
can_bypass_rls = false,
47-
connections = -1,
50+
connection_limit = -1,
51+
password,
4852
valid_until,
53+
member_of,
54+
members,
55+
admins,
4956
} = req.body as {
5057
name: string
51-
is_super_user?: boolean
52-
has_create_db_privileges?: boolean
53-
has_replication_privileges?: boolean
58+
is_superuser?: boolean
59+
can_create_db?: boolean
60+
can_create_role?: boolean
61+
inherit_role?: boolean
62+
can_login?: boolean
63+
is_replication_role?: boolean
5464
can_bypass_rls?: boolean
55-
connections?: number
65+
connection_limit?: number
66+
password?: string
5667
valid_until?: string
68+
member_of?: string[]
69+
members?: string[]
70+
admins?: string[]
5771
}
5872
const sql = `
5973
CREATE ROLE ${name}
6074
WITH
61-
${is_super_user ? 'SUPERUSER' : 'NOSUPERUSER'}
62-
${has_create_db_privileges ? 'CREATEDB' : 'NOCREATEDB'}
63-
${has_replication_privileges ? 'REPLICATION' : 'NOREPLICATION'}
75+
${is_superuser ? 'SUPERUSER' : 'NOSUPERUSER'}
76+
${can_create_db ? 'CREATEDB' : 'NOCREATEDB'}
77+
${can_create_role ? 'CREATEROLE' : 'NOCREATEROLE'}
78+
${inherit_role ? 'INHERIT' : 'NOINHERIT'}
79+
${can_login ? 'LOGIN' : 'NOLOGIN'}
80+
${is_replication_role ? 'REPLICATION' : 'NOREPLICATION'}
6481
${can_bypass_rls ? 'BYPASSRLS' : 'NOBYPASSRLS'}
65-
CONNECTION LIMIT ${connections}
66-
${valid_until === undefined ? '' : `VALID UNTIL '${valid_until}'`}`
67-
console.log(sql)
82+
CONNECTION LIMIT ${connection_limit}
83+
${password === undefined ? '' : `PASSWORD '${password}'`}
84+
${valid_until === undefined ? '' : `VALID UNTIL '${valid_until}'`}
85+
${member_of === undefined ? '' : `IN ROLE ${member_of.join(',')}`}
86+
${members === undefined ? '' : `ROLE ${members.join(',')}`}
87+
${admins === undefined ? '' : `ADMIN ${admins.join(',')}`}`
6888
const { data } = await RunQuery(req.headers.pg, sql)
6989
return res.status(200).json(data)
7090
} catch (error) {

src/lib/interfaces.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
export namespace Roles {
22
export interface Role {
33
name: string
4-
id: number
5-
has_create_db_privileges: boolean
6-
is_super_user: boolean
7-
has_replication_privileges: boolean
4+
is_superuser: boolean
5+
can_create_db: boolean
6+
can_create_role: boolean
7+
inherit_role: boolean
8+
can_login: boolean
9+
is_replication_role: boolean
810
can_bypass_rls: boolean
9-
valid_until: string | null
10-
user_config: string | null
11-
connections: number
12-
max_user_connections: number
13-
max_db_connections: number
11+
connection_limit: number
12+
password: string
13+
valid_until: string
14+
config: string
15+
oid: number
16+
1417
grants: Grant[]
1518
}
1619

src/lib/sql/roles.sql

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,16 @@
11
SELECT
2-
usename AS name,
3-
usesysid AS id,
4-
usecreatedb AS has_create_db_privileges,
5-
usesuper AS is_super_user,
6-
userepl AS has_replication_privileges,
7-
usebypassrls AS can_bypass_rls,
8-
valuntil AS valid_until,
9-
-- Password expiry time (only used for password authentication)
10-
useconfig AS user_config,
11-
-- Session defaults for run-time configuration variables
12-
active_connections.connections,
13-
pg_roles.rolconnlimit AS max_user_connections,
14-
max_db_connections.max_connections :: int2 AS max_db_connections
2+
rolname AS name,
3+
rolsuper AS is_superuser,
4+
rolcreatedb AS can_create_db,
5+
rolcreaterole AS can_create_role,
6+
rolinherit AS inherit_role,
7+
rolcanlogin AS can_login,
8+
rolreplication AS is_replication_role,
9+
rolbypassrls AS can_bypass_rls,
10+
rolconnlimit AS connection_limit,
11+
rolpassword AS password,
12+
rolvaliduntil AS valid_until,
13+
rolconfig AS config,
14+
oid
1515
FROM
16-
pg_user AS users
17-
INNER JOIN pg_roles ON users.usename = pg_roles.rolname
18-
INNER JOIN LATERAL (
19-
SELECT
20-
count(*) AS connections
21-
FROM
22-
pg_stat_activity AS active_connections
23-
WHERE
24-
state = 'active'
25-
AND users.usename = active_connections.usename
26-
) AS active_connections ON 1 = 1
27-
INNER JOIN LATERAL (
28-
SELECT
29-
setting AS max_connections
30-
FROM
31-
pg_settings
32-
WHERE
33-
name = 'max_connections'
34-
) AS max_db_connections ON 1 = 1
16+
pg_catalog.pg_roles

test/integration/index.spec.js

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -197,31 +197,31 @@ describe('/roles', () => {
197197
it('GET', async () => {
198198
const res = await axios.get(`${URL}/roles`)
199199
const datum = res.data.find((x) => x.name == 'postgres')
200-
const hasSystemSchema = res.data[0].grants.some((x) => x.schema == 'information_schema')
201-
const hasPublicSchema = res.data[0].grants.some((x) => x.schema == 'public')
200+
const hasSystemSchema = datum.grants.some((x) => x.schema == 'information_schema')
201+
const hasPublicSchema = datum.grants.some((x) => x.schema == 'public')
202202
assert.equal(res.status, STATUS.SUCCESS)
203203
assert.equal(true, !!datum)
204204
assert.equal(hasSystemSchema, false)
205205
assert.equal(hasPublicSchema, true)
206206
})
207-
// it('POST', async () => {
208-
// await axios.post(`${URL}/roles`, {
209-
// name: 'test',
210-
// is_super_user: true,
211-
// has_create_db_privileges: true,
212-
// has_replication_privileges: true,
213-
// can_bypass_rls: true,
214-
// connections: 100,
215-
// valid_until: '2020-01-01',
216-
// })
217-
// const { data: roles } = await axios.get(`${URL}/roles`)
218-
// const test = roles.find((role) => role.name === 'test')
219-
// assert.equal(test.is_super_user, true)
220-
// assert.equal(test.has_create_db_privileges, true)
221-
// assert.equal(test.has_replication_privileges, true)
222-
// assert.equal(test.can_bypass_rls, true)
223-
// assert.equal(test.connections, 100)
224-
// assert.equal(test.valid_until, '2020-01-01')
225-
// await axios.post(`${URL}/roles`, { query: 'DROP ROLE test' })
226-
// })
207+
it('POST', async () => {
208+
await axios.post(`${URL}/roles`, {
209+
name: 'test',
210+
is_superuser: true,
211+
can_create_db: true,
212+
is_replication_role: true,
213+
can_bypass_rls: true,
214+
connection_limit: 100,
215+
valid_until: '2020-01-01T00:00:00.000Z',
216+
})
217+
const { data: roles } = await axios.get(`${URL}/roles`)
218+
const test = roles.find((role) => role.name === 'test')
219+
assert.equal(test.is_superuser, true)
220+
assert.equal(test.can_create_db, true)
221+
assert.equal(test.is_replication_role, true)
222+
assert.equal(test.can_bypass_rls, true)
223+
assert.equal(test.connection_limit, 100)
224+
assert.equal(test.valid_until, '2020-01-01T00:00:00.000Z')
225+
await axios.post(`${URL}/query`, { query: 'DROP ROLE test;' })
226+
})
227227
})

0 commit comments

Comments
 (0)