11import { 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
52import { coalesceRowsToArray , toTransaction } from '../lib/helpers'
63import { RunQuery } from '../lib/connectionPool'
74import { DEFAULT_SYSTEM_SCHEMAS } from '../lib/constants'
85import { 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 */
1311interface QueryParams {
1412 includeSystemSchemas ?: string
@@ -18,7 +16,7 @@ const router = Router()
1816
1917router . 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
3432router . 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
5956router . 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) => {
9088router . 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}
158147const createTable = ( name : string , schema : string = 'postgres' ) => {
0 commit comments