From 9393333f097fd741b0fe7e1c3ad8c6d03884ff07 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Mon, 3 Jul 2017 11:16:49 -0300 Subject: [PATCH] Modify RQF to use placeholders --- src/libs/app.js | 8 ++++++++ src/libs/middlewares/reqQueryFields.js | 20 +++++++++++++++----- src/libs/routes/region.js | 13 +++++++------ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/libs/app.js b/src/libs/app.js index 97c2683a..662b3e9d 100644 --- a/src/libs/app.js +++ b/src/libs/app.js @@ -32,6 +32,13 @@ app.use(methodOverride()); // Middleware tha adds the squel object to req app.use((req, res, next) => { req.sql = squel.select(); + // HACK to know wich table we are using + req.sql.oldFrom = req.sql.from; + req.sql.from = (name, alias = null) => { + req.sql.oldFrom(name, alias || null); + req.sql.tableFrom = name; + return req.sql; + }; next(); }); app.use((req, res, next) => { @@ -52,6 +59,7 @@ app.use((req, res, next) => { app.use((err, req, res, next) => { res.status(err.status || 500); log.error('%s %d %s', req.method, res.statusCode, err.message); + log.error(err); res.json({ error: err.message }).end(); }); diff --git a/src/libs/middlewares/reqQueryFields.js b/src/libs/middlewares/reqQueryFields.js index 8dcf018b..e8d6aefa 100644 --- a/src/libs/middlewares/reqQueryFields.js +++ b/src/libs/middlewares/reqQueryFields.js @@ -200,6 +200,11 @@ class ReqQueryFields { return (req, res, next) => { // Foreach no campos let hasJoined = {}; + let thisTable = req.sql.tableFrom; + console.log('PEPOPEPO'); + console.log(req.sql); + console.log(req.sql.tableFrom); + console.log(thisTable); Object.keys(this.fields).forEach((key) => { // Campo let field = this.fields[key]; @@ -217,6 +222,7 @@ class ReqQueryFields { if(!hasJoined[value.table] && typeof value.join !== 'undefined') { let foreignTable = ''; if(value.join.foreignTable) foreignTable = value.join.foreignTable+'.'; + if(value.join.foreignTable === '@') foreignTable = thisTable+'.'; // Fazemos o join let onClause = ''; if(Array.isArray(value.join.primary)) { @@ -237,15 +243,18 @@ class ReqQueryFields { // Se o valor é um campo a ser incluÃdo no SELECT if(typeof field.field !== 'undefined' && field.field) { log.debug('SELECT'); + let table = value.table; + if(table === '@') table = thisTable; if (Array.isArray(value.resultField)) { value.tableField.forEach((f, i) => { - req.sql.field(value.table+'.'+f, value.resultField[i] || f) - .group(value.table+'.'+f); + req.sql.field(table+'.'+f, value.resultField[i] || f) + .group(table+'.'+f) + .order(table+'.'+f); }) }else{ - req.sql.field(value.table+'.'+value.tableField, value.resultField || value.tableField) - .order(value.table+'.'+value.tableField) - .group(value.table+'.'+value.tableField); + req.sql.field(table+'.'+value.tableField, value.resultField || value.tableField) + .order(table+'.'+value.tableField) + .group(table+'.'+value.tableField); } } // Se o valor é um campo para ser usado no WHERE @@ -259,6 +268,7 @@ class ReqQueryFields { log.debug(`Where value é array? ${Array.isArray(whereValue)}`); let tbl = value.where.table || value.table; + if (tbl === '@') tbl = thisTable; // multiple where, only tested for boolean filds if (Array.isArray(value.tableField)) { let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? '; diff --git a/src/libs/routes/region.js b/src/libs/routes/region.js index a752fa1b..6e765416 100644 --- a/src/libs/routes/region.js +++ b/src/libs/routes/region.js @@ -20,13 +20,13 @@ rqf.addField({ where: true }).addValue({ name: 'id', - table: 'regiao', + table: '@', tableField: 'id', where: { relation: '=', type: 'integer', field: 'id', - table: 'regiao' + table: '@' } }).addField({ name: 'search', @@ -34,21 +34,22 @@ rqf.addField({ where: true }).addValueToField({ name: 'name', - table: 'regiao', + table: '@', tableField: 'nome', where: { relation: 'LIKE', type: 'string', field: 'nome', - table: 'regiao' + table: '@' } }, 'search'); -regionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { +regionApp.get('/', rqf.parse(), (req, res, next) => { req.sql.from('regiao') .field('id') .field('nome', 'name'); + console.log(req.sql.toString()); next(); -}, query, response('region')); +}, rqf.build(), query, response('region')); module.exports = regionApp; -- GitLab