diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js new file mode 100644 index 0000000000000000000000000000000000000000..9d2eaa272b2fafe709304be3afb170da36b5789f --- /dev/null +++ b/src/libs/middlewares/id2str.js @@ -0,0 +1,105 @@ +function gender(id) { + switch(id) { + case 1: + return 'Masculino'; + case 2: + return 'Feminino'; + } +} + +function period(id) { + switch(id) { + case 1: + return 'Diurno'; + case 2: + return 'Noturno'; + case 3: + return 'Integral'; + default: + return 'Indefinido'; + } +} + +function schoolYear(id) { + switch(id) { + case 11: + return 'Creche - Menor de 1 ano'; + case 12: + return 'Creche - 1 ano'; + case 13: + return 'Creche - 2 anos'; + case 14: + return 'Creche - 3 anos'; + case 21: + return 'Pré-escola - 4 anos'; + case 22: + return 'Pré-escola - 5 anos'; + case 31: + return 'Ens. Fundamental - 1º Ano'; + case 32: + return 'Ens. Fundamental - 1ª série/2º ano'; + case 33: + return 'Ens. Fundamental - 2ª série/3º ano'; + case 34: + return 'Ens. Fundamental - 3ª série/4º ano'; + case 35: + return 'Ens. Fundamental - 4ª série/5º Ano'; + case 41: + return 'Ens. Fundamental - 5ª série/6º ano'; + case 42: + return 'Ens. Fundamental - 6ª série/7º ano'; + case 43: + return 'Ens. Fundamental - 7ª série/8º ano'; + case 44: + return 'Ens. Fundamental - 8ª serie/9º ano'; + case 51: + return 'Ens. Médio - 1ª série'; // equivalent to 'EM 1 Série' + case 52: + return 'Ens. Médio - 2ª série'; // equivalent to 'EM 2 Série' + case 53: + return 'Ens. Médio - 3ª série'; // equivalent to 'EM 3 Série' + case 54: + return 'Ens. Médio - 4ª série'; // equivalent to 'EM 4 Série' + case 61: + return 'EJA - anos iniciais do Ens. Fundamental'; + case 62: + return 'EJA - anos finais do Ens. Fundamental'; + case 63: + return 'EJA - Ensino Médio'; + case 64: + return 'EJA semi-presencial'; + case 71: + return 'Educação Profissional'; + default: + return 'Não classificado'; + } +} + +const ids = { + gender_id: gender, + period_id: period, + school_year_id: schoolYear +}; + +function transform(removeId=false) { + return (req, res, next) => { + // Para cada objeto do resultado + req.result.forEach((obj) => { + Object.keys(obj).forEach((key) => { + // Se não há uma função especificada, retorna + if(typeof ids[key] === 'undefined') return; + let id = obj[key]; + obj[key.replace('_id', '_name')] = ids[key](id); + if(removeId) delete obj[key]; + }); + }); + next(); + }; +} + +module.exports = { + transform, + gender, + period, + schoolYear +}; diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js index 317c6b6f7e590ea80a4b078e3a9a1a2d39c1edb6..e27a03aacd3c18205d6ecb628d681691bfaea2f3 100644 --- a/src/libs/routes/enrollment.js +++ b/src/libs/routes/enrollment.js @@ -14,6 +14,8 @@ const response = require(`${libs}/middlewares/response`); const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`); +const id2str = require(`${libs}/middlewares/id2str`); + let rqf = new ReqQueryFields(); // Complete range of the enrollments dataset. @@ -281,121 +283,7 @@ enrollmentApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { .order('matricula.ano_censo') .where('matricula.tipo=0 OR matricula.tipo=1 OR matricula.tipo=2 OR matricula.tipo=3'); next(); -}, query, (req, res, next) => { - // ids to strings - req.result.forEach((result) => { - if(typeof result.gender_id !== 'undefined') { - switch (result.gender_id) { - case 1: - result.gender_name = 'Masculino'; - break; - case 2: - result.gender_name = 'Feminino'; - break; - } - delete result.gender_id; - } - if(typeof result.period_id !== 'undefined') { - switch (result.period_id) { - case 1: - result.period_name = 'Diurno'; - break; - case 2: - result.period_name = 'Noturno'; - break; - case 3: - result.period_name = 'Integral'; - break; - default: - result.period_name = 'Indefinido'; - break; - } - delete result.period_id; - } - }); - next(); -}, response('enrollment')); - -function schoolYearIdToStr(schoolYearId) { - let schoolYearStr; - switch(schoolYearId) { - case 11: - schoolYearStr = 'Creche - Menor de 1 ano'; - break; - case 12: - schoolYearStr = 'Creche - 1 ano'; - break; - case 13: - schoolYearStr = 'Creche - 2 anos'; - break; - case 14: - schoolYearStr = 'Creche - 3 anos'; - break; - case 21: - schoolYearStr = 'Pré-escola - 4 anos'; - break; - case 22: - schoolYearStr = 'Pré-escola - 5 anos'; - break; - case 31: - schoolYearStr = 'Ens. Fundamental - 1º Ano'; - break; - case 32: - schoolYearStr = 'Ens. Fundamental - 1ª série/2º ano'; - break; - case 33: - schoolYearStr = 'Ens. Fundamental - 2ª série/3º ano'; - break; - case 34: - schoolYearStr = 'Ens. Fundamental - 3ª série/4º ano'; - break; - case 35: - schoolYearStr = 'Ens. Fundamental - 4ª série/5º Ano'; - break; - case 41: - schoolYearStr = 'Ens. Fundamental - 5ª série/6º ano'; - break; - case 42: - schoolYearStr = 'Ens. Fundamental - 6ª série/7º ano'; - break; - case 43: - schoolYearStr = 'Ens. Fundamental - 7ª série/8º ano'; - break; - case 44: - schoolYearStr = 'Ens. Fundamental - 8ª serie/9º ano'; - break; - case 51: - schoolYearStr = 'Ens. Médio - 1ª série'; // equivalent to 'EM 1 Série' - break; - case 52: - schoolYearStr = 'Ens. Médio - 2ª série'; // equivalent to 'EM 2 Série' - break; - case 53: - schoolYearStr = 'Ens. Médio - 3ª série'; // equivalent to 'EM 3 Série' - break; - case 54: - schoolYearStr = 'Ens. Médio - 4ª série'; // equivalent to 'EM 4 Série' - break; - case 61: - schoolYearStr = 'EJA - anos iniciais do Ens. Fundamental'; - break; - case 62: - schoolYearStr = 'EJA - anos finais do Ens. Fundamental'; - break; - case 63: - schoolYearStr = 'EJA - Ensino Médio'; - break; - case 64: - schoolYearStr = 'EJA semi-presencial'; - break; - case 71: - schoolYearStr = 'Educação Profissional'; - break; - default: - schoolYearStr = 'Não classificado'; - } - return schoolYearStr; -} +}, query, id2str.transform(true), response('enrollment')); let simRqf = new ReqQueryFields(); @@ -433,7 +321,7 @@ enrollmentApp.get('/offer_projection', simRqf.parse(), simRqf.build(), (req, res .field('turma.turno', 'period_id') .field('etapa_ensino.desc_etapa', 'education_level_name') .field('etapa_ensino.id', 'education_level_id') - .field('matricula.serie_ano_id') + .field('matricula.serie_ano_id', 'school_year_id') .field('COUNT(matricula.id)', 'currentOffer') .from('matricula') .join('etapa_ensino', null, 'matricula.etapa_ensino_id=etapa_ensino.id') @@ -448,7 +336,7 @@ enrollmentApp.get('/offer_projection', simRqf.parse(), simRqf.build(), (req, res .group('matricula.serie_ano_id'); next(); -}, query, (req, res, next) => { +}, query, id2str.transform(false), (req, res, next) => { let years = parseInt(req.filter.simulation_time, 10); if(isNaN(years)) years = 0; let offerYear = req.result[0].offerYear; @@ -471,8 +359,8 @@ enrollmentApp.get('/offer_projection', simRqf.parse(), simRqf.build(), (req, res } temp[period][i.education_level_name].currentOffer += i.currentOffer; temp[period][i.education_level_name].grades.push({ - id: i.serie_ano_id, - name: schoolYearIdToStr(i.serie_ano_id), + id: i.school_year_id, + name: i.school_year_name, currentOffer: i.currentOffer }); }); diff --git a/src/libs/routes/spatial.js b/src/libs/routes/spatial.js index 84587c536d4a10beb23305ab6003872882a7a35e..e56a1ab456f339107409e5a1e365b01f2a3e5f3c 100644 --- a/src/libs/routes/spatial.js +++ b/src/libs/routes/spatial.js @@ -14,6 +14,8 @@ const response = require(`${libs}/middlewares/response`); const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`); +const id2str = require(`${libs}/middlewares/id2str`); + const spatialApp = express(); let rqf = new ReqQueryFields(); @@ -431,7 +433,7 @@ spatialApp.get('/educational/school_level', rqf.parse(), rqf.build(), (req, res, let school_levels = {}; for(let i = 0; i < result.length; ++i) { - const school_year = schoolYearIdToStr(result[i].school_year); + const school_year = id2str.schoolYear(result[i].school_year); const school_level = result[i].school_level; const census_year = result[i].census_year; if (typeof school_levels[school_level] === 'undefined') { diff --git a/src/test/id2str.js b/src/test/id2str.js new file mode 100644 index 0000000000000000000000000000000000000000..abb4bc56fe5210feb97198d091ed4f62081730a2 --- /dev/null +++ b/src/test/id2str.js @@ -0,0 +1,76 @@ +process.env.NODE_ENV = 'test'; + +const chai = require('chai'); + +const dirtyChai = require('dirty-chai'); + +chai.use(dirtyChai); + +const chaiXml = require('chai-xml'); + +chai.use(chaiXml); + +const chaiHttp = require('chai-http'); + +const assert = chai.assert; + +const expect = chai.expect; + +const should = chai.should(); // actually call the function + +const libs = `${process.cwd()}/libs`; + +const server = require(`${libs}/app`); + +const id2str = require(`${libs}/middlewares/id2str`); + +chai.use(chaiHttp); + +describe('id2str middleware', () => { + let req, res; + it('should return a function', (done) => { + expect(id2str.transform).to.be.a.Function; + done(); + }); + + it('should transform a gender id', (done) => { + expect(id2str.gender(1)).to.deep.equal('Masculino'); + done(); + }); + + it('should transform a period id', (done) => { + expect(id2str.period(1)).to.deep.equal('Diurno'); + done(); + }); + + it('should transform a school year id', (done) => { + expect(id2str.schoolYear(11)).to.deep.equal('Creche - Menor de 1 ano'); + done(); + }); + + it('should transform a result', (done) => { + let req = { + result: [{gender_id: 2, period_id: 3, school_year_id: 11}] + }; + id2str.transform(false)(req, {}, (error)=>{ + if (error) { throw new Error('Expected not to receive an error'); } + req.should.have.property('result'); + req.result.should.not.be.undefined; + req.result.should.be.deep.equal([{gender_id: 2, period_id: 3, school_year_id: 11, gender_name: 'Feminino', period_name: 'Integral', school_year_name: 'Creche - Menor de 1 ano'}]); + done(); + }); + }); + + it('should transform a result and delete the ids', (done) => { + let req = { + result: [{gender_id: 2, period_id: 3, school_year_id: 11}] + }; + id2str.transform(true)(req, {}, (error)=>{ + if (error) { throw new Error('Expected not to receive an error'); } + req.should.have.property('result'); + req.result.should.not.be.undefined; + req.result.should.be.deep.equal([{gender_name: 'Feminino', period_name: 'Integral', school_year_name: 'Creche - Menor de 1 ano'}]); + done(); + }); + }); +});