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