diff --git a/src/libs/app.js b/src/libs/app.js index 97c2683afc278eaa23034809338dae644a12a115..662b3e9d21e8c328bf6efef8e700ee00c16f8765 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 8dcf018b0cd7285312dca6e2f257aa8b03375f5b..664d166eaa83b48c1d8f6ff8ba1e2f86b8e60afd 100644 --- a/src/libs/middlewares/reqQueryFields.js +++ b/src/libs/middlewares/reqQueryFields.js @@ -200,6 +200,7 @@ class ReqQueryFields { return (req, res, next) => { // Foreach no campos let hasJoined = {}; + let thisTable = req.sql.tableFrom; Object.keys(this.fields).forEach((key) => { // Campo let field = this.fields[key]; @@ -217,6 +218,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 +239,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 +264,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/class.js b/src/libs/routes/class.js index eabd957844c7be03439ec498c4312d8bee8f1e47..faef41ba559e2aaea438339a5bbac445e6c43e6b 100644 --- a/src/libs/routes/class.js +++ b/src/libs/routes/class.js @@ -110,7 +110,23 @@ rqfCount.addField({ name: 'dims', field: true, where: false -}).addValue({ +}).addValueToField({ + name: 'city', + table: 'municipio', + tableField: ['nome', 'id'], + resultField: ['city_name', 'city_id'], + where: { + relation: '=', + type: 'integer', + field: 'municipio_id', + table: 'turma' + }, + join: { + primary: 'id', + foreign: 'municipio_id', + foreignTable: 'turma' + } +}, 'dims').addValueToField({ name: 'city', table: 'municipio', tableField: 'nome', @@ -126,7 +142,7 @@ rqfCount.addField({ foreign: 'municipio_id', foreignTable: 'turma' } -}).addValue({ +}, 'filter').addValue({ name: 'state', table: 'estado', tableField: 'nome', @@ -285,6 +301,6 @@ classApp.get('/', rqfCount.parse(), rqfCount.build(), (req, res, next) => { .order('turma.ano_censo') .where('turma.tipo_turma_id = 0 OR turma.tipo_turma_id = 1 OR turma.tipo_turma_id = 2 OR turma.tipo_turma_id = 3'); next(); -}, query, id2str.transform(true), response('class')); +}, query, id2str.transform(), response('class')); module.exports = classApp; diff --git a/src/libs/routes/classroom.js b/src/libs/routes/classroom.js index 7140bba1b34a03138bbac1fccdf73f07c721ebe6..58599f19a8e94761d76a2de3e1f21d56456a17de 100644 --- a/src/libs/routes/classroom.js +++ b/src/libs/routes/classroom.js @@ -67,7 +67,23 @@ rqf.addField({ type: 'integer', field: 'id' } -}).addValue({ +}).addValueToField({ + name: 'city', + table: 'municipio', + tableField: ['nome', 'id'], + resultField: ['city_name', 'city_id'], + where: { + relation: '=', + type: 'integer', + field: 'municipio_id', + table: 'escola' + }, + join: { + primary: 'id', + foreign: 'municipio_id', + foreignTable: 'escola' + } +}, 'dims').addValueToField({ name: 'city', table: 'municipio', tableField: 'nome', @@ -83,7 +99,7 @@ rqf.addField({ foreign: 'municipio_id', foreignTable: 'escola' } -}).addValue({ +}, 'filter').addValue({ name: 'state', table: 'estado', tableField: 'nome', @@ -176,6 +192,6 @@ classroomApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .order('escola.ano_censo') .where('escola.situacao_de_funcionamento = 1 AND escola.local_func_predio_escolar = 1'); next(); -}, query, id2str.transform(true), response('classroom')); +}, query, id2str.transform(), response('classroom')); module.exports = classroomApp; diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js index b6117dc4ca851bcc0e10cdfd19f96e94f2dc9857..f08db0fb8efea1881370bfa903c9e4977243c3f9 100644 --- a/src/libs/routes/enrollment.js +++ b/src/libs/routes/enrollment.js @@ -233,7 +233,22 @@ rqf.addField({ foreign: 'estado_id', foreignTable: 'matricula' } -}).addValue({ +}).addValueToField({ + name: 'city', + table: 'municipio', + tableField: ['nome', 'id'], + resultField: ['city_name', 'city_id'], + where: { + relation: '=', + type: 'integer', + field: 'id' + }, + join: { + primary: 'id', + foreign: 'municipio_id', + foreignTable: 'matricula' + } +}, 'dims').addValueToField({ name: 'city', table: 'municipio', tableField: 'nome', @@ -248,7 +263,22 @@ rqf.addField({ foreign: 'municipio_id', foreignTable: 'matricula' } -}).addValue({ +}, 'filter').addValueToField({ + name: 'school', + table: 'escola', + tableField: ['nome_escola', 'id'], + resultField: ['school_name', 'school_id'], + where: { + relation: '=', + type: 'integer', + field: 'id' + }, + join: { + primary: ['id', 'ano_censo'], + foreign: ['escola_id', 'ano_censo'], + foreignTable: 'matricula' + } +}, 'dims').addValueToField({ name: 'school', table: 'escola', tableField: 'nome_escola', @@ -263,7 +293,7 @@ rqf.addField({ foreign: ['escola_id', 'ano_censo'], foreignTable: 'matricula' } -}).addValue({ +}, 'filter').addValue({ name: 'location', table: 'matricula', tableField: 'localizacao_id', @@ -355,7 +385,7 @@ enrollmentApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .order('matricula.ano_censo') .where('matricula.tipo<=3'); next(); -}, query, id2str.transform(true), response('enrollment')); +}, query, id2str.transform(false), response('enrollment')); let simRqf = new ReqQueryFields(); diff --git a/src/libs/routes/region.js b/src/libs/routes/region.js index a752fa1b6169522d1f2f0983f3c4b7d94748f551..6e7654166f6910ddc1bc9039d2e6a620e96e4d13 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; diff --git a/src/libs/routes/school.js b/src/libs/routes/school.js index e88f6bd9d69dd7770233e86e759557a32b4bd126..5320c29fbb3810d6c0b8b71492bbfe64e25c208a 100644 --- a/src/libs/routes/school.js +++ b/src/libs/routes/school.js @@ -397,7 +397,23 @@ rqfCount.addField({ type: 'integer', field: 'id' } -}).addValue({ +}).addValueToField({ + name: 'city', + table: 'municipio', + tableField: ['nome', 'id'], + resultField: ['city_name', 'city_id'], + where: { + relation: '=', + type: 'integer', + field: 'municipio_id', + table: 'escola' + }, + join: { + primary: 'id', + foreign: 'municipio_id', + foreignTable: 'escola' + } +}, 'dims').addValueToField({ name: 'city', table: 'municipio', tableField: 'nome', @@ -413,7 +429,7 @@ rqfCount.addField({ foreign: 'municipio_id', foreignTable: 'escola' } -}).addValue({ +}, 'filter').addValue({ name: 'state', table: 'estado', tableField: 'nome', @@ -859,6 +875,6 @@ schoolApp.get('/count', rqfCount.parse(), rqfCount.build(), (req, res, next) => .order('escola.ano_censo') .where('escola.situacao_de_funcionamento = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)'); next(); -}, query, id2str.transform(true), response('school')); +}, query, id2str.transform(), response('school')); module.exports = schoolApp; diff --git a/src/libs/routes/teacher.js b/src/libs/routes/teacher.js index c99441600bf1677f8adce9d1fe2167b1d9de9fdc..19cae7848b5220171f687ba8d8c576725b7c807f 100644 --- a/src/libs/routes/teacher.js +++ b/src/libs/routes/teacher.js @@ -197,7 +197,22 @@ rqf.addField({ foreign: 'escola_estado_id', foreignTable: 'docente' } -}).addValue({ +}).addValueToField({ + name: 'city', + table: 'municipio', + tableField: ['nome', 'id'], + resultField: ['city_name', 'city_id'], + where: { + relation: '=', + type: 'integer', + field: 'id' + }, + join: { + primary: 'id', + foreign: 'escola_municipio_id', + foreignTable: 'docente' + } +}, 'dims').addValueToField({ name: 'city', table: 'municipio', tableField: 'nome', @@ -212,7 +227,7 @@ rqf.addField({ foreign: 'escola_municipio_id', foreignTable: 'docente' } -}).addValue({ +}, 'filter').addValue({ name: 'school', table: 'escola', tableField: 'nome_escola', @@ -299,6 +314,6 @@ teacherApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .order('docente.ano_censo') .where('(docente.tipo_docente = 1 OR docente.tipo_docente = 5) AND (turma.tipo_turma_id <= 3)'); next(); -}, query, id2str.transform(true), response('teacher')); +}, query, id2str.transform(), response('teacher')); module.exports = teacherApp; diff --git a/src/test/class.js b/src/test/class.js index c7619d604e9b053e882c7e5a917082c303383e3b..c6fd205a5c0c48fd72c6d49d1846fc1682269159 100644 --- a/src/test/class.js +++ b/src/test/class.js @@ -208,7 +208,6 @@ describe('request class', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('rural_location_name'); - res.body.result[0].should.not.have.property('rural_location_id'); done(); }); }); @@ -222,7 +221,6 @@ describe('request class', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('education_level_short_name'); - res.body.result[0].should.not.have.property('education_level_short_id'); done(); }); }); diff --git a/src/test/enrollment.js b/src/test/enrollment.js index f48334d74325091bad08b602d5c1088db11297e2..55a47628f5b7a5655f9bbd5eeec8feba43a31425 100644 --- a/src/test/enrollment.js +++ b/src/test/enrollment.js @@ -303,7 +303,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('location_name'); - res.body.result[0].should.not.have.property('location_id'); done(); }); }); @@ -317,7 +316,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('rural_location_name'); - res.body.result[0].should.not.have.property('rural_location_id'); done(); }); }); @@ -331,7 +329,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('school_year_name'); - res.body.result[0].should.not.have.property('school_year_id'); done(); }); }); @@ -345,7 +342,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('education_level_name'); - res.body.result[0].should.not.have.property('education_level_id'); done(); }); }); @@ -359,7 +355,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('education_level_mod_name'); - res.body.result[0].should.not.have.property('education_level_mod_id'); done(); }); }); @@ -373,7 +368,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('education_level_short_name'); - res.body.result[0].should.not.have.property('education_level_short_id'); done(); }); }); @@ -387,7 +381,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('adm_dependency_name'); - res.body.result[0].should.not.have.property('adm_dependency_id'); done(); }); }); @@ -401,7 +394,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('adm_dependency_detailed_name'); - res.body.result[0].should.not.have.property('adm_dependency_detailed_id'); done(); }); }); @@ -415,7 +407,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('gender_name'); - res.body.result[0].should.not.have.property('gender_id'); done(); }); }); @@ -429,7 +420,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('ethnic_group_name'); - res.body.result[0].should.not.have.property('ethnic_group_id'); done(); }); }); @@ -443,7 +433,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('period_name'); - res.body.result[0].should.not.have.property('period_id'); done(); }); }); @@ -457,7 +446,6 @@ describe('request enrollments', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('integral_time_name'); - res.body.result[0].should.not.have.property('integral_time_id'); done(); }); }); diff --git a/src/test/schoolCount.js b/src/test/schoolCount.js index 35d84e3b7b3346fd890062066c992df43bd4c7b6..59c100000b03263bab56c12fc895339a08d764f6 100644 --- a/src/test/schoolCount.js +++ b/src/test/schoolCount.js @@ -661,7 +661,6 @@ describe('request schools count', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('rural_location_name'); - res.body.result[0].should.not.have.property('rural_location_id'); done(); }); }); diff --git a/src/test/teacher.js b/src/test/teacher.js index a9624eca227c052cba818a5dad246989137f2f76..d32c93e9ad505484de1e3f943fd13d86d8514ba6 100644 --- a/src/test/teacher.js +++ b/src/test/teacher.js @@ -264,7 +264,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('location_name'); - res.body.result[0].should.not.have.property('location_id'); done(); }); }); @@ -278,7 +277,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('rural_location_name'); - res.body.result[0].should.not.have.property('rural_location_id'); done(); }); }); @@ -292,7 +290,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('education_level_mod_name'); - res.body.result[0].should.not.have.property('education_level_mod_id'); done(); }); }); @@ -306,7 +303,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('education_level_short_name'); - res.body.result[0].should.not.have.property('education_level_short_id'); done(); }); }); @@ -320,7 +316,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('education_type_name'); - res.body.result[0].should.not.have.property('education_type_id'); done(); }); }); @@ -334,7 +329,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('adm_dependency_name'); - res.body.result[0].should.not.have.property('adm_dependency_id'); done(); }); }); @@ -348,7 +342,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('adm_dependency_detailed_name'); - res.body.result[0].should.not.have.property('adm_dependency_detailed_id'); done(); }); }); @@ -362,7 +355,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('gender_name'); - res.body.result[0].should.not.have.property('gender_id'); done(); }); }); @@ -376,7 +368,6 @@ describe('request teachers', () => { res.body.should.have.property('result'); res.body.result.should.be.a('array'); res.body.result[0].should.have.property('ethnic_group_name'); - res.body.result[0].should.not.have.property('ethnic_group_id'); done(); }); });