Skip to content

Commit 745f529

Browse files
committed
refactor: factor out SQL queries into pure fns
1 parent 985c4aa commit 745f529

File tree

4 files changed

+142
-117
lines changed

4 files changed

+142
-117
lines changed

src/api/columns.ts

Lines changed: 62 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,13 @@ router.post('/', async (req, res) => {
3636
name: string
3737
type: string
3838
}
39-
const getTableQuery = SQL``.append(tables).append(SQL` AND c.oid = ${tableId}`)
39+
const getTableQuery = getTableSqlize(tableId)
4040
const { name: table, schema } = (await RunQuery(req.headers.pg, getTableQuery)).data[0]
4141

42-
const query = `ALTER TABLE "${schema}"."${table}" ADD COLUMN "${name}" "${type}"`
42+
const query = addColumnSqlize({ schema, table, name, type })
4343
await RunQuery(req.headers.pg, query)
4444

45-
const getColumnQuery = SQL``
46-
.append(columns)
47-
.append(SQL` WHERE c.oid = ${tableId} AND column_name = ${name}`)
45+
const getColumnQuery = getColumnSqlize(tableId, name)
4846
const column = (await RunQuery(req.headers.pg, getColumnQuery)).data[0]
4947

5048
return res.status(200).json(column)
@@ -56,32 +54,17 @@ router.post('/', async (req, res) => {
5654

5755
router.patch('/:id', async (req, res) => {
5856
try {
59-
const [tableId, ordinalPos] = req.params.id.split('.')
60-
const getColumnQuery = SQL``
61-
.append(columns)
62-
.append(SQL` WHERE c.oid = ${tableId} AND ordinal_position = ${ordinalPos}`)
63-
const { schema, table, name: oldName } = (
64-
await RunQuery(req.headers.pg, getColumnQuery)
65-
).data[0]
57+
const [tableId, ordinalPos] = req.params.id.split('.').map(Number)
58+
const getColumnQuery = getColumnByPosSqlize(tableId, ordinalPos)
59+
const column = (await RunQuery(req.headers.pg, getColumnQuery)).data[0]
60+
const { schema, table, name: oldName } = column
6661

6762
const { name, type } = req.body as {
6863
name?: string
6964
type?: string
7065
}
7166

72-
const query = `
73-
BEGIN;
74-
${
75-
type === undefined
76-
? ''
77-
: `ALTER TABLE "${schema}"."${table}" ALTER COLUMN "${oldName}" SET DATA TYPE "${type}";`
78-
}
79-
${
80-
name === undefined
81-
? ''
82-
: `ALTER TABLE "${schema}"."${table}" RENAME COLUMN "${oldName}" TO "${name}";`
83-
}
84-
COMMIT;`
67+
const query = patchColumnSqlize({ schema, table, oldName, name, type })
8568
await RunQuery(req.headers.pg, query)
8669

8770
const updated = (await RunQuery(req.headers.pg, getColumnQuery)).data[0]
@@ -94,15 +77,12 @@ COMMIT;`
9477

9578
router.delete('/:id', async (req, res) => {
9679
try {
97-
const [tableId, ordinalPos] = req.params.id.split('.')
98-
99-
const getColumnQuery = SQL``
100-
.append(columns)
101-
.append(SQL` WHERE c.oid = ${tableId} AND ordinal_position = ${ordinalPos} `)
80+
const [tableId, ordinalPos] = req.params.id.split('.').map(Number)
81+
const getColumnQuery = getColumnByPosSqlize(tableId, ordinalPos)
10282
const column = (await RunQuery(req.headers.pg, getColumnQuery)).data[0]
10383
const { schema, table, name } = column
10484

105-
const query = `ALTER TABLE "${schema}"."${table}" DROP COLUMN "${name}"`
85+
const query = dropColumnSqlize(schema, table, name)
10686
await RunQuery(req.headers.pg, query)
10787

10888
return res.status(200).json(column)
@@ -112,30 +92,63 @@ router.delete('/:id', async (req, res) => {
11292
}
11393
})
11494

115-
const removeSystemSchemas = (data: Tables.Column[]) => {
116-
return data.filter((x) => !DEFAULT_SYSTEM_SCHEMAS.includes(x.schema))
95+
const getTableSqlize = (id: number) => {
96+
return SQL``.append(tables).append(SQL` AND c.oid = ${id}`)
11797
}
118-
const newColumnSql = ({
98+
const addColumnSqlize = ({
99+
schema,
100+
table,
119101
name,
120-
default_value,
121-
is_identity = false,
122-
is_nullable = true,
123-
is_primary_key = false,
124-
data_type,
102+
type,
125103
}: {
104+
schema: string
105+
table: string
126106
name: string
127-
default_value?: string
128-
is_identity?: boolean
129-
is_nullable?: boolean
130-
is_primary_key?: boolean
131-
data_type: string
107+
type: string
108+
}) => {
109+
return `ALTER TABLE "${schema}"."${table}" ADD COLUMN "${name}" "${type}"`
110+
}
111+
const getColumnSqlize = (tableId: number, name: string) => {
112+
return SQL``.append(columns).append(SQL` WHERE c.oid = ${tableId} AND column_name = ${name}`)
113+
}
114+
const getColumnByPosSqlize = (tableId: number, ordinalPos: number) => {
115+
return SQL``
116+
.append(columns)
117+
.append(SQL` WHERE c.oid = ${tableId} AND ordinal_position = ${ordinalPos}`)
118+
}
119+
const patchColumnSqlize = ({
120+
schema,
121+
table,
122+
oldName,
123+
name,
124+
type,
125+
}: {
126+
schema: string
127+
table: string
128+
oldName: string
129+
name?: string
130+
type?: string
132131
}) => {
132+
const nameSql =
133+
name === undefined
134+
? ''
135+
: `ALTER TABLE "${schema}"."${table}" RENAME COLUMN "${oldName}" TO "${name}";`
136+
const typeSql =
137+
type === undefined
138+
? ''
139+
: `ALTER TABLE "${schema}"."${table}" ALTER COLUMN "${oldName}" SET DATA TYPE "${type}";`
140+
// Make sure typeSql comes first
133141
return `
134-
${name} ${data_type}
135-
${default_value === undefined ? '' : `DEFAULT ${default_value}`}
136-
${is_identity ? 'GENERATED BY DEFAULT AS IDENTITY' : ''}
137-
${is_nullable ? '' : 'NOT NULL'}
138-
${is_primary_key ? 'PRIMARY KEY' : ''}`
142+
BEGIN;
143+
${typeSql}
144+
${nameSql}
145+
COMMIT;`
146+
}
147+
const dropColumnSqlize = (schema: string, table: string, name: string) => {
148+
return `ALTER TABLE "${schema}"."${table}" DROP COLUMN "${name}"`
149+
}
150+
const removeSystemSchemas = (data: Tables.Column[]) => {
151+
return data.filter((x) => !DEFAULT_SYSTEM_SCHEMAS.includes(x.schema))
139152
}
140153

141154
export = router

src/api/schemas.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@ router.patch('/:id', async (req, res) => {
8585

8686
router.delete('/:id', async (req, res) => {
8787
try {
88-
const id = req.params.id
89-
const getNameQuery = SQL``.append(schemas).append(SQL` WHERE nsp.oid = ${id}`)
88+
const id = parseInt(req.params.id)
89+
const getNameQuery = selectSingleSql(id)
9090
const schema = (await RunQuery(req.headers.pg, getNameQuery)).data[0]
9191

92-
const cascade = req.query.cascade
93-
const query = `DROP SCHEMA "${schema.name}" ${cascade === 'true' ? 'CASCADE' : 'RESTRICT'}`
92+
const cascade = req.query.cascade === 'true'
93+
const query = dropSchemaSqlize(schema.name, cascade)
9494
await RunQuery(req.headers.pg, query)
9595

9696
return res.status(200).json(schema)
@@ -121,6 +121,10 @@ const alterSchemaOwner = (schemaName: string, newOwner: string) => {
121121
const query = SQL``.append(`ALTER SCHEMA ${schemaName} OWNER TO ${newOwner}`)
122122
return query
123123
}
124+
const dropSchemaSqlize = (name: string, cascade: boolean) => {
125+
const query = `DROP SCHEMA "${name}" ${cascade ? 'CASCADE' : 'RESTRICT'}`
126+
return query
127+
}
124128
const removeSystemSchemas = (data: Schemas.Schema[]) => {
125129
return data.filter((x) => !DEFAULT_SYSTEM_SCHEMAS.includes(x.name))
126130
}

src/api/tables.ts

Lines changed: 52 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,7 @@ const router = Router()
1818

1919
router.get('/', async (req, res) => {
2020
try {
21-
const sql = `
22-
WITH tables AS ( ${tables} ),
23-
columns AS ( ${columns} ),
24-
grants AS ( ${grants} ),
25-
policies AS ( ${policies} ),
26-
primary_keys AS ( ${primary_keys} ),
27-
relationships AS ( ${relationships} )
28-
SELECT
29-
*,
30-
${coalesceRowsToArray('columns', 'SELECT * FROM columns WHERE columns.table_id = tables.id')},
31-
${coalesceRowsToArray('grants', 'SELECT * FROM grants WHERE grants.table_id = tables.id')},
32-
${coalesceRowsToArray('policies', 'SELECT * FROM policies WHERE policies.table_id = tables.id')},
33-
${coalesceRowsToArray(
34-
'primary_keys',
35-
'SELECT * FROM primary_keys WHERE primary_keys.table_id = tables.id'
36-
)},
37-
${coalesceRowsToArray(
38-
'relationships',
39-
`SELECT
40-
*
41-
FROM
42-
relationships
43-
WHERE
44-
(relationships.source_schema = tables.schema AND relationships.source_table_name = tables.name)
45-
OR (relationships.target_table_schema = tables.schema AND relationships.target_table_name = tables.name)`
46-
)}
47-
FROM
48-
tables`
21+
const sql = getTablesSqlize({ tables, columns, grants, policies, primary_keys, relationships })
4922
const { data } = await RunQuery(req.headers.pg, sql)
5023
const query: QueryParams = req.query
5124
const includeSystemSchemas = query?.includeSystemSchemas === 'true'
@@ -111,13 +84,13 @@ router.patch('/:id', async (req, res) => {
11184

11285
router.delete('/:id', async (req, res) => {
11386
try {
114-
const id = req.params.id
115-
const getTableQuery = SQL``.append(tables).append(SQL` AND c.oid = ${id}`)
87+
const id = parseInt(req.params.id)
88+
const getTableQuery = selectSingleSql(id)
11689
const table = (await RunQuery(req.headers.pg, getTableQuery)).data[0]
11790
const { name, schema } = table
11891

119-
const cascade = req.query.cascade
120-
const query = `DROP TABLE "${schema}"."${name}" ${cascade === 'true' ? 'CASCADE' : 'RESTRICT'}`
92+
const cascade = req.query.cascade === 'true'
93+
const query = dropTableSqlize(schema, name, cascade)
12194
await RunQuery(req.headers.pg, query)
12295

12396
return res.status(200).json(table)
@@ -127,6 +100,50 @@ router.delete('/:id', async (req, res) => {
127100
}
128101
})
129102

103+
const getTablesSqlize = ({
104+
tables,
105+
columns,
106+
grants,
107+
policies,
108+
primary_keys,
109+
relationships,
110+
}: {
111+
tables: string
112+
columns: string
113+
grants: string
114+
policies: string
115+
primary_keys: string
116+
relationships: string
117+
}) => {
118+
return `
119+
WITH tables AS ( ${tables} ),
120+
columns AS ( ${columns} ),
121+
grants AS ( ${grants} ),
122+
policies AS ( ${policies} ),
123+
primary_keys AS ( ${primary_keys} ),
124+
relationships AS ( ${relationships} )
125+
SELECT
126+
*,
127+
${coalesceRowsToArray('columns', 'SELECT * FROM columns WHERE columns.table_id = tables.id')},
128+
${coalesceRowsToArray('grants', 'SELECT * FROM grants WHERE grants.table_id = tables.id')},
129+
${coalesceRowsToArray('policies', 'SELECT * FROM policies WHERE policies.table_id = tables.id')},
130+
${coalesceRowsToArray(
131+
'primary_keys',
132+
'SELECT * FROM primary_keys WHERE primary_keys.table_id = tables.id'
133+
)},
134+
${coalesceRowsToArray(
135+
'relationships',
136+
`SELECT
137+
*
138+
FROM
139+
relationships
140+
WHERE
141+
(relationships.source_schema = tables.schema AND relationships.source_table_name = tables.name)
142+
OR (relationships.target_table_schema = tables.schema AND relationships.target_table_name = tables.name)`
143+
)}
144+
FROM
145+
tables`
146+
}
130147
const selectSingleSql = (id: number) => {
131148
return SQL``.append(tables).append(SQL` and c.oid = ${id}`)
132149
}
@@ -141,6 +158,9 @@ const alterTableName = (previousName: string, newName: string, schema: string) =
141158
const query = SQL``.append(`ALTER TABLE "${schema}"."${previousName}" RENAME TO "${newName}"`)
142159
return query
143160
}
161+
const dropTableSqlize = (schema: string, name: string, cascade: boolean) => {
162+
return `DROP TABLE "${schema}"."${name}" ${cascade ? 'CASCADE' : 'RESTRICT'}`
163+
}
144164
const removeSystemSchemas = (data: Tables.Table[]) => {
145165
return data.filter((x) => !DEFAULT_SYSTEM_SCHEMAS.includes(x.schema))
146166
}

0 commit comments

Comments
 (0)