diff --git a/src/libs/middlewares/reqQueryFields.js b/src/libs/middlewares/reqQueryFields.js index 27b0365b22feb27929dbca488c67e8895f33ae4b..741ae09a75511ff01a5aaae0c59b676ed467be07 100644 --- a/src/libs/middlewares/reqQueryFields.js +++ b/src/libs/middlewares/reqQueryFields.js @@ -27,6 +27,7 @@ class ReqQueryFields { // fieldValues: {} // } if(typeof this.fields[field.name] === 'undefined') { + log.debug("added field "+field.name); this.fields[field.name] = field; } return this; @@ -55,6 +56,21 @@ class ReqQueryFields { if(typeof this.fieldValues[fieldValue.name] === 'undefined') { this.fieldValues[fieldValue.name] = fieldValue; + log.debug("added value "+fieldValue.name); + } + return this; + } + + addValueToField(fieldValue, field) { + if(typeof this.fields[field] === 'undefined') { + throw 'No field with name ' +field+ ' defined'; + } + if(typeof this.fields[field].values === 'undefined') { + this.fields[field].values = {}; + } + if(typeof this.fields[field].values[fieldValue.name] === 'undefined') { + this.fields[field].values[fieldValue.name] = fieldValue; + log.debug("added value "+fieldValue.name+ ' to field ' + field); } return this; } @@ -66,8 +82,10 @@ class ReqQueryFields { let f = this.fields[key]; log.debug('f'); log.debug(f); - Object.keys(this.fieldValues).map((k, i) => { - let value = this.fieldValues[k]; + // Unimos os valores aceitos globalmente com os aceitos apenas pelo parâmetro + let values = _.merge(this.fieldValues, f.values); + Object.keys(values).map((k, i) => { + let value = values[k]; log.debug('value'); log.debug(value); params.push(value.name); @@ -119,9 +137,13 @@ class ReqQueryFields { let field = this.fields[key]; log.debug(field); let param = req[field.name]; + log.debug('param'); log.debug(param); Object.keys(param).map((k, i) => { - let values = this.fieldValues; + let values = _.merge(this.fieldValues, field.values); + log.debug('ValueS'); + log.debug(values); + log.debug('k'); log.debug(k); if(typeof values[k] !== 'undefined') { // Clonamos para não alterar @@ -151,8 +173,11 @@ class ReqQueryFields { // Valor sempre vem como string, necessário fazer parse para o banco if(value.where.type === 'integer') whereValue = parseInt(whereValue, 10); if(value.where.type === 'double') whereValue = parseFloat(whereValue); + if(value.where.type === 'string') whereValue = '%'+whereValue+'%'; let tbl = value.where.table || value.table; - req.sql.where(tbl+'.'+value.where.field+' '+value.where.relation+' ?', whereValue); + let whereField = (value.where.type === 'string')? 'LOWER('+tbl+'.'+value.where.field+')' : tbl+'.'+value.where.field; + let lower = (value.where.type === 'string') ? ' LOWER(?) ' : ' ? '; + req.sql.where(whereField + ' ' + value.where.relation + lower, whereValue); } } }); diff --git a/src/libs/routes/city.js b/src/libs/routes/city.js index 41b22a660096e95b58611c7b4edcfe5e758db79d..3214f7f9d6caaafad8deb6b2d8d94b3525a10a6a 100644 --- a/src/libs/routes/city.js +++ b/src/libs/routes/city.js @@ -43,7 +43,20 @@ rqf.addField({ foreign: 'fk_estado_id', foreignTable: 'municipio' } -}); +}).addField({ + name: 'search', + field: false, + where: true +}).addValueToField({ + name: 'name', + table: 'municipio', + tableField: 'nome', + where: { + relation: 'LIKE', + type: 'string', + field: 'nome' + } +}, 'search');; // Return all cities cityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { @@ -51,4 +64,4 @@ cityApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { next(); }, query, response('city')); -module.exports = cityApp; \ No newline at end of file +module.exports = cityApp; diff --git a/src/libs/routes/region.js b/src/libs/routes/region.js index be2eb9b044752c09e7e9d55e0deba41442a1a40e..c7f5ec05ec02d810f1c50187c6c33dd4489af278 100644 --- a/src/libs/routes/region.js +++ b/src/libs/routes/region.js @@ -28,7 +28,21 @@ rqf.addField({ field: 'pk_regiao_id', table: 'regiao' } -}); +}).addField({ + name: 'search', + field: false, + where: true +}).addValueToField({ + name: 'name', + table: 'regiao', + tableField: 'nome', + where: { + relation: 'LIKE', + type: 'string', + field: 'nome', + table: 'regiao' + } +}, 'search'); regionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { req.sql.from('regiao'); diff --git a/src/libs/routes/state.js b/src/libs/routes/state.js index 399be41416f9c458523ec0d24bde0254ef909a0c..0a706a38e7d3db2f233d72a53fa32fe4e9396646 100644 --- a/src/libs/routes/state.js +++ b/src/libs/routes/state.js @@ -43,7 +43,20 @@ rqf.addField({ foreign: 'fk_regiao_id', foreignTable: 'estado' } -}); +}).addField({ + name: 'search', + field: false, + where: true +}).addValueToField({ + name: 'name', + table: 'estado', + tableField: 'nome', + where: { + relation: 'LIKE', + type: 'string', + field: 'nome' + } +}, 'search'); stateApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { req.sql.from('estado') diff --git a/src/test/city.js b/src/test/city.js index 761bcb0eeb21e55cd73d4aaac4dbd2db87c6cb90..ff8612fd9f27412d92a4e4626b7c777fb416efa1 100644 --- a/src/test/city.js +++ b/src/test/city.js @@ -70,4 +70,18 @@ describe('request cities', () => { done(); }) }) + + it('should search for Curitiba', (done) => { + chai.request(server) + .get('/api/v1/city?search=name:curitiba') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_cod_ibge'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); }); diff --git a/src/test/region.js b/src/test/region.js index 12cf3d09fa82ce3b2f030d26d4997cf820aa2932..13e8316d99fb4c7d7f59cb83ba0e0c4f232089ba 100644 --- a/src/test/region.js +++ b/src/test/region.js @@ -53,4 +53,19 @@ describe('request regions', () => { done(); }); }); + + it('shoul search for south region', (done) => { + chai.request(server) + .get('/api/v1/region?search=name:sul') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result.should.have.length(1); + res.body.result[0].should.have.property('pk_regiao_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); }); diff --git a/src/test/state.js b/src/test/state.js index d3794f98df89b6a2f410c93107daa7033b019792..c1b08f92c240163cd0cb84910256f9f1e8bee4a2 100644 --- a/src/test/state.js +++ b/src/test/state.js @@ -71,4 +71,20 @@ describe('request states', () => { done(); }); }); + + it('should search for Paraná', (done) => { + chai.request(server) + .get('/api/v1/state?search=name:paran') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result.should.have.length(1); + res.body.result[0].should.have.property('pk_estado_id'); + res.body.result[0].should.have.property('fk_regiao_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); });