Skip to content

Commit 988fe8b

Browse files
committed
refactor: Makes some of the impure functions pure.
It's still a bit shady injecting *all* the templates, but kaizen
1 parent cf00b87 commit 988fe8b

File tree

1 file changed

+51
-62
lines changed

1 file changed

+51
-62
lines changed

src/api/tables.ts

+51-62
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import { Router } from 'express'
2-
import SQL from 'sql-template-strings'
3-
import sqlTemplates = require('../lib/sql')
4-
const { columns, grants, policies, primary_keys, relationships, tables } = sqlTemplates
52
import { coalesceRowsToArray, toTransaction } from '../lib/helpers'
63
import { RunQuery } from '../lib/connectionPool'
74
import { DEFAULT_SYSTEM_SCHEMAS } from '../lib/constants'
85
import { Tables } from '../lib/interfaces'
6+
import sqlTemplates = require('../lib/sql')
97

108
/**
11-
* @param {boolean} [includeSystemSchemas=false] - Return system schemas as well as user schemas
9+
* @param {string} [includeSystemSchemas=false] - Return system schemas as well as user schemas
1210
*/
1311
interface QueryParams {
1412
includeSystemSchemas?: string
@@ -18,7 +16,7 @@ const router = Router()
1816

1917
router.get('/', async (req, res) => {
2018
try {
21-
const sql = getTablesSql({ tables, columns, grants, policies, primary_keys, relationships })
19+
const sql = getTablesSql(sqlTemplates)
2220
const { data } = await RunQuery(req.headers.pg, sql)
2321
const query: QueryParams = req.query
2422
const includeSystemSchemas = query?.includeSystemSchemas === 'true'
@@ -33,20 +31,19 @@ router.get('/', async (req, res) => {
3331

3432
router.post('/', async (req, res) => {
3533
try {
36-
const { schema = 'public', name } = req.body as {
37-
schema?: string
38-
name: string
39-
}
40-
34+
const pcConnection: string = req.headers.pg.toString()
35+
const schema: string = req.body.schema || 'public'
36+
const name: string = req.body.name
37+
4138
// Create the table
4239
const createTableSql = createTable(name, schema)
4340
const alterSql = alterTableSql(req.body)
4441
const transaction = toTransaction([createTableSql, alterSql])
45-
await RunQuery(req.headers.pg, transaction)
42+
await RunQuery(pcConnection, transaction)
4643

4744
// Return fresh details
48-
const getTable = selectSingleByName(schema, name)
49-
const { data: newTableResults } = await RunQuery(req.headers.pg, getTable)
45+
const getTable = selectSingleByName(sqlTemplates, schema, name)
46+
const { data: newTableResults } = await RunQuery(pcConnection, getTable)
5047
let newTable: Tables.Table = newTableResults[0]
5148
return res.status(200).json(newTable)
5249
} catch (error) {
@@ -58,26 +55,27 @@ router.post('/', async (req, res) => {
5855

5956
router.patch('/:id', async (req, res) => {
6057
try {
58+
const pcConnection: string = req.headers.pg.toString()
6159
const id: number = parseInt(req.params.id)
6260
if (!(id > 0)) throw new Error('id is required')
6361

6462
const name: string = req.body.name
6563
const payload: any = { ...req.body }
6664

6765
// Get table
68-
const getTableSql = selectSingleSql(id)
69-
const { data: getTableResults } = await RunQuery(req.headers.pg, getTableSql)
66+
const getTableSql = selectSingleSql(sqlTemplates, id)
67+
const { data: getTableResults } = await RunQuery(pcConnection, getTableSql)
7068
let previousTable: Tables.Table = getTableResults[0]
7169

7270
// Update fields and name
7371
const nameSql = !name ? '' : alterTableName(previousTable.name, name, previousTable.schema)
7472
if (!name) payload.name = previousTable.name
7573
const alterSql = alterTableSql(payload)
7674
const transaction = toTransaction([nameSql, alterSql])
77-
await RunQuery(req.headers.pg, transaction)
75+
await RunQuery(pcConnection, transaction)
7876

7977
// Return fresh details
80-
const { data: freshTableData } = await RunQuery(req.headers.pg, getTableSql)
78+
const { data: freshTableData } = await RunQuery(pcConnection, getTableSql)
8179
let updated: Tables.Table = freshTableData[0]
8280
return res.status(200).json(updated)
8381
} catch (error) {
@@ -90,7 +88,7 @@ router.patch('/:id', async (req, res) => {
9088
router.delete('/:id', async (req, res) => {
9189
try {
9290
const id = parseInt(req.params.id)
93-
const getTableQuery = selectSingleSql(id)
91+
const getTableQuery = selectSingleSql(sqlTemplates, id)
9492
const table = (await RunQuery(req.headers.pg, getTableQuery)).data[0]
9593
const { name, schema } = table
9694

@@ -105,54 +103,45 @@ router.delete('/:id', async (req, res) => {
105103
}
106104
})
107105

108-
const getTablesSql = ({
109-
tables,
110-
columns,
111-
grants,
112-
policies,
113-
primary_keys,
114-
relationships,
115-
}: {
116-
tables: string
117-
columns: string
118-
grants: string
119-
policies: string
120-
primary_keys: string
121-
relationships: string
122-
}) => {
106+
const getTablesSql = (sqlTemplates) => {
107+
const { columns, grants, policies, primary_keys, relationships, tables } = sqlTemplates
123108
return `
124-
WITH tables AS ( ${tables} ),
125-
columns AS ( ${columns} ),
126-
grants AS ( ${grants} ),
127-
policies AS ( ${policies} ),
128-
primary_keys AS ( ${primary_keys} ),
129-
relationships AS ( ${relationships} )
130-
SELECT
131-
*,
132-
${coalesceRowsToArray('columns', 'SELECT * FROM columns WHERE columns.table_id = tables.id')},
133-
${coalesceRowsToArray('grants', 'SELECT * FROM grants WHERE grants.table_id = tables.id')},
134-
${coalesceRowsToArray('policies', 'SELECT * FROM policies WHERE policies.table_id = tables.id')},
135-
${coalesceRowsToArray(
136-
'primary_keys',
137-
'SELECT * FROM primary_keys WHERE primary_keys.table_id = tables.id'
138-
)},
139-
${coalesceRowsToArray(
140-
'relationships',
141-
`SELECT
142-
*
143-
FROM
144-
relationships
145-
WHERE
146-
(relationships.source_schema = tables.schema AND relationships.source_table_name = tables.name)
147-
OR (relationships.target_table_schema = tables.schema AND relationships.target_table_name = tables.name)`
148-
)}
149-
FROM
150-
tables;`.trim()
109+
WITH tables AS ( ${tables} ),
110+
columns AS ( ${columns} ),
111+
grants AS ( ${grants} ),
112+
policies AS ( ${policies} ),
113+
primary_keys AS ( ${primary_keys} ),
114+
relationships AS ( ${relationships} )
115+
SELECT
116+
*,
117+
${coalesceRowsToArray('columns', 'SELECT * FROM columns WHERE columns.table_id = tables.id')},
118+
${coalesceRowsToArray('grants', 'SELECT * FROM grants WHERE grants.table_id = tables.id')},
119+
${coalesceRowsToArray(
120+
'policies',
121+
'SELECT * FROM policies WHERE policies.table_id = tables.id'
122+
)},
123+
${coalesceRowsToArray(
124+
'primary_keys',
125+
'SELECT * FROM primary_keys WHERE primary_keys.table_id = tables.id'
126+
)},
127+
${coalesceRowsToArray(
128+
'relationships',
129+
`SELECT
130+
*
131+
FROM
132+
relationships
133+
WHERE
134+
(relationships.source_schema = tables.schema AND relationships.source_table_name = tables.name)
135+
OR (relationships.target_table_schema = tables.schema AND relationships.target_table_name = tables.name)`
136+
)}
137+
FROM tables;`.trim()
151138
}
152-
const selectSingleSql = (id: number) => {
139+
const selectSingleSql = (sqlTemplates, id: number) => {
140+
const { tables } = sqlTemplates
153141
return `${tables} and c.oid = ${id};`.trim()
154142
}
155-
const selectSingleByName = (schema: string, name: string) => {
143+
const selectSingleByName = (sqlTemplates, schema: string, name: string) => {
144+
const { tables } = sqlTemplates
156145
return `${tables} and table_schema = '${schema}' and table_name = '${name}';`.trim()
157146
}
158147
const createTable = (name: string, schema: string = 'postgres') => {

0 commit comments

Comments
 (0)