1
1
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
5
2
import { coalesceRowsToArray , toTransaction } from '../lib/helpers'
6
3
import { RunQuery } from '../lib/connectionPool'
7
4
import { DEFAULT_SYSTEM_SCHEMAS } from '../lib/constants'
8
5
import { Tables } from '../lib/interfaces'
6
+ import sqlTemplates = require( '../lib/sql' )
9
7
10
8
/**
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
12
10
*/
13
11
interface QueryParams {
14
12
includeSystemSchemas ?: string
@@ -18,7 +16,7 @@ const router = Router()
18
16
19
17
router . get ( '/' , async ( req , res ) => {
20
18
try {
21
- const sql = getTablesSql ( { tables , columns , grants , policies , primary_keys , relationships } )
19
+ const sql = getTablesSql ( sqlTemplates )
22
20
const { data } = await RunQuery ( req . headers . pg , sql )
23
21
const query : QueryParams = req . query
24
22
const includeSystemSchemas = query ?. includeSystemSchemas === 'true'
@@ -33,20 +31,19 @@ router.get('/', async (req, res) => {
33
31
34
32
router . post ( '/' , async ( req , res ) => {
35
33
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
+
41
38
// Create the table
42
39
const createTableSql = createTable ( name , schema )
43
40
const alterSql = alterTableSql ( req . body )
44
41
const transaction = toTransaction ( [ createTableSql , alterSql ] )
45
- await RunQuery ( req . headers . pg , transaction )
42
+ await RunQuery ( pcConnection , transaction )
46
43
47
44
// 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 )
50
47
let newTable : Tables . Table = newTableResults [ 0 ]
51
48
return res . status ( 200 ) . json ( newTable )
52
49
} catch ( error ) {
@@ -58,26 +55,27 @@ router.post('/', async (req, res) => {
58
55
59
56
router . patch ( '/:id' , async ( req , res ) => {
60
57
try {
58
+ const pcConnection : string = req . headers . pg . toString ( )
61
59
const id : number = parseInt ( req . params . id )
62
60
if ( ! ( id > 0 ) ) throw new Error ( 'id is required' )
63
61
64
62
const name : string = req . body . name
65
63
const payload : any = { ...req . body }
66
64
67
65
// 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 )
70
68
let previousTable : Tables . Table = getTableResults [ 0 ]
71
69
72
70
// Update fields and name
73
71
const nameSql = ! name ? '' : alterTableName ( previousTable . name , name , previousTable . schema )
74
72
if ( ! name ) payload . name = previousTable . name
75
73
const alterSql = alterTableSql ( payload )
76
74
const transaction = toTransaction ( [ nameSql , alterSql ] )
77
- await RunQuery ( req . headers . pg , transaction )
75
+ await RunQuery ( pcConnection , transaction )
78
76
79
77
// Return fresh details
80
- const { data : freshTableData } = await RunQuery ( req . headers . pg , getTableSql )
78
+ const { data : freshTableData } = await RunQuery ( pcConnection , getTableSql )
81
79
let updated : Tables . Table = freshTableData [ 0 ]
82
80
return res . status ( 200 ) . json ( updated )
83
81
} catch ( error ) {
@@ -90,7 +88,7 @@ router.patch('/:id', async (req, res) => {
90
88
router . delete ( '/:id' , async ( req , res ) => {
91
89
try {
92
90
const id = parseInt ( req . params . id )
93
- const getTableQuery = selectSingleSql ( id )
91
+ const getTableQuery = selectSingleSql ( sqlTemplates , id )
94
92
const table = ( await RunQuery ( req . headers . pg , getTableQuery ) ) . data [ 0 ]
95
93
const { name, schema } = table
96
94
@@ -105,54 +103,45 @@ router.delete('/:id', async (req, res) => {
105
103
}
106
104
} )
107
105
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
123
108
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 ( )
151
138
}
152
- const selectSingleSql = ( id : number ) => {
139
+ const selectSingleSql = ( sqlTemplates , id : number ) => {
140
+ const { tables } = sqlTemplates
153
141
return `${ tables } and c.oid = ${ id } ;` . trim ( )
154
142
}
155
- const selectSingleByName = ( schema : string , name : string ) => {
143
+ const selectSingleByName = ( sqlTemplates , schema : string , name : string ) => {
144
+ const { tables } = sqlTemplates
156
145
return `${ tables } and table_schema = '${ schema } ' and table_name = '${ name } ';` . trim ( )
157
146
}
158
147
const createTable = ( name : string , schema : string = 'postgres' ) => {
0 commit comments