From 413cff49c9c3d4fc44db2f262f330255f45dc9a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20A=2E=20Okida=20Gon=C3=A7alves?= <laog19@inf.ufpr.br> Date: Tue, 28 Feb 2023 11:19:31 -0300 Subject: [PATCH 1/3] Add testroute, path to testroute, Add new middleware's body parsing --- src/libs/middlewares/reqBody.js | 24 ++++ src/libs/routes/api.js | 4 + src/libs/routes/testroute.js | 188 ++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+) create mode 100644 src/libs/middlewares/reqBody.js create mode 100644 src/libs/routes/testroute.js diff --git a/src/libs/middlewares/reqBody.js b/src/libs/middlewares/reqBody.js new file mode 100644 index 00000000..e1f80cb1 --- /dev/null +++ b/src/libs/middlewares/reqBody.js @@ -0,0 +1,24 @@ +class ReqBody { + constructor() { + + } + parse() { + return(req, res, next) => { + // Gets body of the HTTP requisition + let body = req.body; + + // Chooses operation based on the mode field of the body + switch(body["mode"]) { + case "add_metrics": + console.log(body); + break; + default: + break; + } + + next(); + } + } +} + +module.exports = ReqBody; \ No newline at end of file diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js index f6715eaa..1a68a1d4 100644 --- a/src/libs/routes/api.js +++ b/src/libs/routes/api.js @@ -134,6 +134,8 @@ const message = require(`${libs}/routes/message`); const courseStudents = require(`${libs}/routes/courseStudents`); +const testRoute = require(`${libs}/routes/testroute`); + api.get('/', (req, res) => { res.json({ msg: 'SimCAQ API is running' }); }); @@ -193,4 +195,6 @@ api.use('/universityLocalOffer', universityLocalOffer); api.use('/message', message); api.use('/course_students', courseStudents); +api.use('/test', testRoute); + module.exports = api; diff --git a/src/libs/routes/testroute.js b/src/libs/routes/testroute.js new file mode 100644 index 00000000..2f108eb7 --- /dev/null +++ b/src/libs/routes/testroute.js @@ -0,0 +1,188 @@ +/* +Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR + +This file is part of simcaq-node. + +simcaq-node is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +simcaq-node is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with simcaq-node. If not, see <https://www.gnu.org/licenses/>. +*/ + +const express = require('express'); + +const testApp = express.Router(); + +const libs = `${process.cwd()}/libs`; + +const squel = require('squel'); + +const query = require(`${libs}/middlewares/query`).query; + +const response = require(`${libs}/middlewares/response`); + +const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`); + +const ReqBody = require(`${libs}/middlewares/reqBody`); + +const config = require(`${libs}/config`); + +const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware; + +let rqf = new ReqQueryFields(); +let reqBody = new ReqBody(); + +testApp.use(cache('15 day')); + +rqf.addField({ + name: 'filter', + field: false, + where: true +}).addValue({ + name: 'min_year', + table: 'escola', + tableField: 'ano_censo', + where: { + relation: '>=', + type: 'integer', + field: 'ano_censo' + } +}).addValue({ + name: 'max_year', + table: 'escola', + tableField: 'ano_censo', + where: { + relation: '<=', + type: 'integer', + field:'ano_censo' + } +}).addValue({ + name: 'region', + table: 'escola', + tableField: 'regiao_id', + where: { + relation: '=', + type: 'integer', + field: 'regiao_id' + } +}).addValue({ + name: 'region_not', + table: 'escola', + tableField: 'regiao_id', + where: { + relation: '<>', + type: 'integer', + field: 'regiao_id' + } +}).addValue({ + name: 'city', + table: 'escola', + tableField: 'municipio_id', + where: { + relation: '=', + type: 'integer', + field: 'municipio_id' + } +}).addValue({ + name: 'city_not', + table: 'escola', + tableField: 'municipio_id', + where: { + relation: '<>', + type: 'integer', + field: 'municipio_id' + } +}).addValue({ + name: 'state', + table: 'escola', + tableField: 'estado_id', + where: { + relation: '=', + type: 'integer', + field: 'estado_id' + } +}).addValue({ + name: 'state_not', + table: 'escola', + tableField: 'estado_id', + where: { + relation: '<>', + type: 'integer', + field: 'estado_id' + } +}).addValue({ + name: 'dep_admin', + table: 'escola', + tableField: 'dependencia_adm_id', + where: { + relation: '=', + type: 'integer', + field: 'dependencia_adm_id' + } +}).addValue({ + name: 'dep_pub_ins', + table: 'escola', + tableField: 'dependencia_convenio_publico', + where: { + relation: '=', + type: 'integer', + field: 'dependencia_convenio_publico' + } +}).addValue({ + name: 'arrangement', + table: 'escola', + tableField: 'arranjo', + where: { + relation: '=', + type: 'integer', + field: 'arranjo' + } +}).addValue({ + name: 'location', + table: 'escola', + tableField: 'localizacao_id', + where: { + relation: '=', + type: 'integer', + field: 'localizacao_id' + } +}).addValue({ + name: 'diff_location', + table: 'escola', + tableField: 'localizacao_diferenciada_id', + where: { + relation: '=', + type: 'integer', + field: 'localizacao_diferenciada_id' + } +}).addValue({ + name: 'full_time', + table: 'escola', + tableField: 'tempo_integral', + where: { + relation: '=', + type: 'integer', + field: 'tempo_integral' + } +}); + +testApp.get('/', rqf.parse(), rqf.build(), reqBody.parse(), (req, res, next) => { + req.sql.from('escola') + .field('ano_censo') + .field('count(*)', 'total') + .group('ano_censo').order('ano_censo') + .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)') + console.log(req.sql.toString()); + next(); +}, query, response('school')); + +module.exports = testApp; \ No newline at end of file -- GitLab From 60745534b613faa560b345737b612f08aa5bc83d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20A=2E=20Okida=20Gon=C3=A7alves?= <laog19@inf.ufpr.br> Date: Wed, 1 Mar 2023 11:29:52 -0300 Subject: [PATCH 2/3] Add functional version of middleware, add flag to check whether it runs default query or modified query --- src/libs/middlewares/reqBody.js | 37 ++++++++++++++++++++++++++++++++- src/libs/routes/testroute.js | 21 +++++++++++++------ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/libs/middlewares/reqBody.js b/src/libs/middlewares/reqBody.js index e1f80cb1..9df7ebca 100644 --- a/src/libs/middlewares/reqBody.js +++ b/src/libs/middlewares/reqBody.js @@ -2,6 +2,32 @@ class ReqBody { constructor() { } + + add_metrics(req, column, metricsArray) { + for (let i in metricsArray) { + switch(metricsArray[i]["function"]) { + case "max": + req.sql.field("max(" + column + ")", metricsArray[i]["return_name"]); + req.hasMetrics = true; + break; + case "min": + req.sql.field("min(" + column + ")", metricsArray[i]["return_name"]); + req.hasMetrics = true; + break; + case "count": + req.sql.field("count(" + column + ")", metricsArray[i]["return_name"]); + req.hasMetrics = true; + break; + case "sum": + req.sql.field("sum(" + column + ")", metricsArray[i]["return_name"]); + req.hasMetrics = true; + break; + default: + break; + } + } + } + parse() { return(req, res, next) => { // Gets body of the HTTP requisition @@ -10,8 +36,17 @@ class ReqBody { // Chooses operation based on the mode field of the body switch(body["mode"]) { case "add_metrics": - console.log(body); + // adds flag to check whether it runs the default query or not + req.hasMetrics = false; + // Gets all column names + let columns = Object.keys(body["add_metrics"]); + // Calls function to add metrics that were specified to req.sql + for (let i in columns) { + this.add_metrics(req, columns[i], body["add_metrics"][columns[i]]); + } + break; + default: break; } diff --git a/src/libs/routes/testroute.js b/src/libs/routes/testroute.js index 2f108eb7..97e28b90 100644 --- a/src/libs/routes/testroute.js +++ b/src/libs/routes/testroute.js @@ -176,12 +176,21 @@ rqf.addField({ }); testApp.get('/', rqf.parse(), rqf.build(), reqBody.parse(), (req, res, next) => { - req.sql.from('escola') - .field('ano_censo') - .field('count(*)', 'total') - .group('ano_censo').order('ano_censo') - .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)') - console.log(req.sql.toString()); + // Runs default query + if (!req.hasMetrics) { + req.sql.from('escola') + .field('ano_censo') + .field('count(*)', 'total') + .group('ano_censo').order('ano_censo') + .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)') + } + // Runs modified query + else { + req.sql.from('escola') + .field('ano_censo') + .group('ano_censo').order('ano_censo') + .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)') + } next(); }, query, response('school')); -- GitLab From 5f0a221ea87dcaed7256fd1f89719a46442e3b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20A=2E=20Okida=20Gon=C3=A7alves?= <laog19@inf.ufpr.br> Date: Fri, 3 Mar 2023 09:29:20 -0300 Subject: [PATCH 3/3] Remove test route --- src/libs/routes/api.js | 4 - src/libs/routes/testroute.js | 197 ----------------------------------- 2 files changed, 201 deletions(-) delete mode 100644 src/libs/routes/testroute.js diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js index 1a68a1d4..f6715eaa 100644 --- a/src/libs/routes/api.js +++ b/src/libs/routes/api.js @@ -134,8 +134,6 @@ const message = require(`${libs}/routes/message`); const courseStudents = require(`${libs}/routes/courseStudents`); -const testRoute = require(`${libs}/routes/testroute`); - api.get('/', (req, res) => { res.json({ msg: 'SimCAQ API is running' }); }); @@ -195,6 +193,4 @@ api.use('/universityLocalOffer', universityLocalOffer); api.use('/message', message); api.use('/course_students', courseStudents); -api.use('/test', testRoute); - module.exports = api; diff --git a/src/libs/routes/testroute.js b/src/libs/routes/testroute.js deleted file mode 100644 index 97e28b90..00000000 --- a/src/libs/routes/testroute.js +++ /dev/null @@ -1,197 +0,0 @@ -/* -Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR - -This file is part of simcaq-node. - -simcaq-node is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -simcaq-node is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with simcaq-node. If not, see <https://www.gnu.org/licenses/>. -*/ - -const express = require('express'); - -const testApp = express.Router(); - -const libs = `${process.cwd()}/libs`; - -const squel = require('squel'); - -const query = require(`${libs}/middlewares/query`).query; - -const response = require(`${libs}/middlewares/response`); - -const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`); - -const ReqBody = require(`${libs}/middlewares/reqBody`); - -const config = require(`${libs}/config`); - -const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware; - -let rqf = new ReqQueryFields(); -let reqBody = new ReqBody(); - -testApp.use(cache('15 day')); - -rqf.addField({ - name: 'filter', - field: false, - where: true -}).addValue({ - name: 'min_year', - table: 'escola', - tableField: 'ano_censo', - where: { - relation: '>=', - type: 'integer', - field: 'ano_censo' - } -}).addValue({ - name: 'max_year', - table: 'escola', - tableField: 'ano_censo', - where: { - relation: '<=', - type: 'integer', - field:'ano_censo' - } -}).addValue({ - name: 'region', - table: 'escola', - tableField: 'regiao_id', - where: { - relation: '=', - type: 'integer', - field: 'regiao_id' - } -}).addValue({ - name: 'region_not', - table: 'escola', - tableField: 'regiao_id', - where: { - relation: '<>', - type: 'integer', - field: 'regiao_id' - } -}).addValue({ - name: 'city', - table: 'escola', - tableField: 'municipio_id', - where: { - relation: '=', - type: 'integer', - field: 'municipio_id' - } -}).addValue({ - name: 'city_not', - table: 'escola', - tableField: 'municipio_id', - where: { - relation: '<>', - type: 'integer', - field: 'municipio_id' - } -}).addValue({ - name: 'state', - table: 'escola', - tableField: 'estado_id', - where: { - relation: '=', - type: 'integer', - field: 'estado_id' - } -}).addValue({ - name: 'state_not', - table: 'escola', - tableField: 'estado_id', - where: { - relation: '<>', - type: 'integer', - field: 'estado_id' - } -}).addValue({ - name: 'dep_admin', - table: 'escola', - tableField: 'dependencia_adm_id', - where: { - relation: '=', - type: 'integer', - field: 'dependencia_adm_id' - } -}).addValue({ - name: 'dep_pub_ins', - table: 'escola', - tableField: 'dependencia_convenio_publico', - where: { - relation: '=', - type: 'integer', - field: 'dependencia_convenio_publico' - } -}).addValue({ - name: 'arrangement', - table: 'escola', - tableField: 'arranjo', - where: { - relation: '=', - type: 'integer', - field: 'arranjo' - } -}).addValue({ - name: 'location', - table: 'escola', - tableField: 'localizacao_id', - where: { - relation: '=', - type: 'integer', - field: 'localizacao_id' - } -}).addValue({ - name: 'diff_location', - table: 'escola', - tableField: 'localizacao_diferenciada_id', - where: { - relation: '=', - type: 'integer', - field: 'localizacao_diferenciada_id' - } -}).addValue({ - name: 'full_time', - table: 'escola', - tableField: 'tempo_integral', - where: { - relation: '=', - type: 'integer', - field: 'tempo_integral' - } -}); - -testApp.get('/', rqf.parse(), rqf.build(), reqBody.parse(), (req, res, next) => { - // Runs default query - if (!req.hasMetrics) { - req.sql.from('escola') - .field('ano_censo') - .field('count(*)', 'total') - .group('ano_censo').order('ano_censo') - .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)') - } - // Runs modified query - else { - req.sql.from('escola') - .field('ano_censo') - .group('ano_censo').order('ano_censo') - .where('escola.situacao_funcionamento_pareada = 1 AND (escola.ensino_regular = 1 OR escola.ensino_eja=1 or escola.educacao_profissional=1)') - } - next(); -}, query, response('school')); - -module.exports = testApp; \ No newline at end of file -- GitLab