From 22a79ace72d9d3499797769fb1b2a870326ddbed Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Mon, 12 Sep 2016 10:53:24 -0300
Subject: [PATCH] Update enrollments routes. Using squel now.

All routes now use squel and the sql, query, response chain
---
 src/libs/routes/enrollment.js | 238 +++++++++++-----------------------
 1 file changed, 75 insertions(+), 163 deletions(-)

diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js
index a9feb711..facc6c9a 100644
--- a/src/libs/routes/enrollment.js
+++ b/src/libs/routes/enrollment.js
@@ -12,7 +12,24 @@ const query = require(`${libs}/middlewares/query`);
 
 const response = require(`${libs}/middlewares/response`);
 
-const dbQuery = require('../db/query_exec');
+// **Temporary** solution to add where clauses that are common to all requests
+function filter(req, q) {
+    if (typeof req.census_year !== 'undefined') {
+        q.where('ano_censo=?', req.census_year);
+    }
+
+    if (typeof req.adm_dependency_id !== 'undefined') {
+        q.where('fk_dependencia_adm_id=?', req.adm_dependency_id);
+    }
+
+    if (typeof req.location_id !== 'undefined') {
+        q.where('id_localizacao=?', req.location_id);
+    }
+
+    if (typeof req.education_level_id !== 'undefined') {
+        q.where('fk_etapa_ensino_id=?', req.education_level_id);
+    }
+}
 
 /**
  * Complete range of the enrollments dataset
@@ -20,12 +37,26 @@ const dbQuery = require('../db/query_exec');
  * Returns a tuple of start and ending years of the complete enrollments dataset.
  */
 enrollmentApp.get('/year_range', (req, res, next) => {
-    req.sql = squel.select().from('turmas').field('MIN(turmas.ano_censo)', 'start_year').field('MAX(turmas.ano_censo)', 'end_year').toParam();
+    req.sql = squel.select()
+        .from('turmas')
+        .field('MIN(turmas.ano_censo)', 'start_year')
+        .field('MAX(turmas.ano_censo)', 'end_year')
+        .toParam();
+
     next();
 }, query, response('range'));
 
+/**
+ * Returns all educational levels avaible
+ *
+ */
 enrollmentApp.get('/education_level', (req, res, next) => {
-    req.sql = squel.select().from('etapa_ensino').field('pk_etapa_ensino_id', 'id').field('desc_etapa', 'name').toParam();
+    req.sql = squel.select()
+        .from('etapa_ensino')
+        .field('pk_etapa_ensino_id', 'id')
+        .field('desc_etapa', 'name')
+        .toParam();
+
     next();
 }, query, response('education_level'));
 
@@ -70,45 +101,14 @@ enrollmentApp.use('/', (req, res, next) => {
     const params = req.query;
     if (typeof params.aggregate !== 'undefined' && params.aggregate === 'region') {
         log.debug('Using enrollments query for regions');
-        req.sqlQuery = 'SELECT r.nome AS name, COALESCE(SUM(t.num_matriculas), 0) AS total '
-            + 'FROM regioes AS r '
-            + 'INNER JOIN estados AS e ON r.pk_regiao_id = e.fk_regiao_id '
-            + 'INNER JOIN municipios AS m ON e.pk_estado_id = m.fk_estado_id '
-            + 'LEFT OUTER JOIN turmas AS t ON ( '
-            + 'm.pk_municipio_id = t.fk_municipio_id ';
-        req.sqlQueryParams = [];
-
-        if (typeof req.census_year !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.ano_censo = ?';
-            req.sqlQueryParams.push(req.census_year);
-        }
-
-        if (typeof req.adm_dependency_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.fk_dependencia_adm_id = ?';
-            req.sqlQueryParams.push(req.adm_dependency_id);
-        }
+        const q = squel.select().from('mat_regioes').field('name').field('SUM(total)', 'total');
 
-        if (typeof req.location_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.id_localizacao = ?';
-            req.sqlQueryParams.push(req.location_id);
-        }
-
-        if (typeof req.education_level_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.fk_etapa_ensino_id = ?';
-            req.sqlQueryParams.push(req.education_level_id);
-        }
+        filter(q);
 
-        req.sqlQuery += ')';
         if (typeof req.id !== 'undefined') {
-            req.sqlQuery += ' WHERE ';
-            req.sqlQuery += 'r.pk_regiao_id = ?';
-            req.sqlQueryParams.push(req.id);
+            q.where('pk_regiao_id=?', req.id);
         }
-        req.sqlQuery += ' GROUP BY r.nome';
+        req.sql = q.group('name').toParam();
     }
     next();
 });
@@ -117,46 +117,14 @@ enrollmentApp.use('/', (req, res, next) => {
     const params = req.query;
     if (typeof params.aggregate !== 'undefined' && params.aggregate === 'state') {
         log.debug('Using enrollments query for states');
-        req.sqlQuery = 'SELECT e.nome AS name, COALESCE(SUM(t.num_matriculas), 0) as total '
-            + 'FROM estados AS e '
-            + 'INNER JOIN municipios AS m ON m.fk_estado_id = e.pk_estado_id '
-            + 'LEFT OUTER JOIN turmas AS t ON ('
-            + 'm.pk_municipio_id = t.fk_municipio_id ';
-        req.sqlQueryParams = [];
-
-        if (typeof req.census_year !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.ano_censo = ?';
-            req.sqlQueryParams.push(req.census_year);
-        }
+        const q = squel.select().from('mat_estados').field('name').field('SUM(total)', 'total');
 
-        if (typeof req.adm_dependency_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.fk_dependencia_adm_id = ?';
-            req.sqlQueryParams.push(req.adm_dependency_id);
-        }
-
-        if (typeof req.location_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.id_localizacao = ?';
-            req.sqlQueryParams.push(req.location_id);
-        }
-
-        if (typeof req.education_level_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.fk_etapa_ensino_id = ?';
-            req.sqlQueryParams.push(req.education_level_id);
-        }
-
-        req.sqlQuery += ')';
+        filter(req, q);
 
         if (typeof req.id !== 'undefined') {
-            req.sqlQuery += ' WHERE ';
-            req.sqlQuery += 'e.pk_estado_id = ?';
-            req.sqlQueryParams.push(req.id);
+            q.where('pk_estado_id=?', req.id);
         }
-
-        req.sqlQuery += ' GROUP BY e.nome';
+        req.sql = q.group('name').toParam();
     }
     next();
 });
@@ -165,45 +133,14 @@ enrollmentApp.use('/', (req, res, next) => {
     const params = req.query;
     if (typeof params.aggregate !== 'undefined' && params.aggregate === 'city') {
         log.debug('Using enrollments query for cities');
-        req.sqlQuery = 'SELECT m.nome AS name, COALESCE(SUM(t.num_matriculas), 0) as total '
-            + 'FROM municipios AS m '
-            + 'LEFT OUTER JOIN turmas AS t ON ( '
-            + 'm.pk_municipio_id = t.fk_municipio_id';
-        req.sqlQueryParams = [];
-
-        if (typeof req.census_year !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.ano_censo = ?';
-            req.sqlQueryParams.push(req.census_year);
-        }
+        const q = squel.select().from('mat_estados').field('name').field('SUM(total)', 'total');
 
-        if (typeof req.adm_dependency_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.fk_dependencia_adm_id = ?';
-            req.sqlQueryParams.push(req.adm_dependency_id);
-        }
-
-        if (typeof req.location_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.id_localizacao = ?';
-            req.sqlQueryParams.push(req.location_id);
-        }
-
-        if (typeof req.education_level_id !== 'undefined') {
-            req.sqlQuery += ' AND ';
-            req.sqlQuery += 't.fk_etapa_ensino_id = ?';
-            req.sqlQueryParams.push(req.education_level_id);
-        }
-
-        req.sqlQuery += ')';
+        filter(req, q);
 
         if (typeof req.id !== 'undefined') {
-            req.sqlQuery += ' WHERE ';
-            req.sqlQuery += 'm.pk_municipio_id = ?';
-            req.sqlQueryParams.push(req.id);
+            q.where('pk_municipio_id=?', req.id);
         }
-
-        req.sqlQuery += 'GROUP BY m.nome';
+        req.sql = q.group('name').toParam();
     }
     next();
 });
@@ -212,67 +149,42 @@ enrollmentApp.use('/', (req, res, next) => {
     const params = req.query;
     if (typeof params.aggregate === 'undefined') {
         log.debug('Using enrollments query for the whole country');
-        req.sqlQuery = 'SELECT \'Brasil\' AS name, COALESCE(SUM(t.num_matriculas),0) AS total '
-            + 'FROM turmas AS t';
-        req.sqlQueryParams = [];
+        const q = squel.select().from('turmas').field("'Brasil'", 'name')
+            .field('COALESCE(SUM(num_matriculas),0)', 'total');
 
-        if (req.paramCnt > 0) {
-            req.sqlQuery += ' WHERE ';
-        }
-
-        if (typeof req.census_year !== 'undefined') {
-            req.sqlQuery += 't.ano_censo = ?';
-            req.sqlQueryParams.push(req.census_year);
-        }
+        filter(req, q);
 
-        if (typeof req.adm_dependency_id !== 'undefined') {
-            if (req.sqlQueryParams.length > 0) {
-                req.sqlQuery += ' AND ';
-            }
-            req.sqlQuery += 't.fk_dependencia_adm_id = ?';
-            req.sqlQueryParams.push(req.adm_dependency_id);
-        }
-
-        if (typeof req.location_id !== 'undefined') {
-            if (req.sqlQueryParams.length > 0) {
-                req.sqlQuery += ' AND ';
-            }
-            req.sqlQuery += 't.id_localizacao = ?';
-            req.sqlQueryParams.push(req.location_id);
-        }
-
-        if (typeof req.education_level_id !== 'undefined') {
-            if (req.sqlQueryParams.length > 0) {
-                req.sqlQuery += ' AND ';
-            }
-            req.sqlQuery += 't.fk_etapa_ensino_id = ?';
-            req.sqlQueryParams.push(req.education_level_id);
-        }
+        req.sql = q.toParam();
     }
     next();
 });
 
 enrollmentApp.get('/', (req, res, next) => {
     log.debug(`Request parameters: ${req}`);
-    if (typeof req.sqlQuery === 'undefined') {
-        // Should only happen if there is a bug in the chaining of the
-        // '/enrollments' route, since when no +aggregate+ parameter is given,
-        // it defaults to use the query for the whole country.
-        log.error('BUG -- No SQL query was found to be executed!');
-        next('Internal error, request could not be satisfied at this moment. Please, '
-            + 'try again later');
-    } else {
-        log.debug('SQL query: ${ req.sqlQuery }?');
-        log.debug(req.sqlQuery);
-        dbQuery(req.sqlQuery).then((result) => {
-            req.result = result;
-            return response(req, res);
-        }, (error) => {
-            log.error(`[${req.originalUrl}] SQL query error: ${error}`);
-            next('Internal error, request could not be satisfied at this moment. Please, '
-                + 'try again later');
-        });
-    }
-});
+    next();
+}, query, response('enrollments'));
+
+// enrollmentApp.get('/', (req, res, next) => {
+//     log.debug(`Request parameters: ${req}`);
+//     if (typeof req.sqlQuery === 'undefined') {
+//         // Should only happen if there is a bug in the chaining of the
+//         // '/enrollments' route, since when no +aggregate+ parameter is given,
+//         // it defaults to use the query for the whole country.
+//         log.error('BUG -- No SQL query was found to be executed!');
+//         next('Internal error, request could not be satisfied at this moment. Please, '
+//             + 'try again later');
+//     } else {
+//         log.debug('SQL query: ${ req.sqlQuery }?');
+//         log.debug(req.sqlQuery);
+//         dbQuery(req.sqlQuery).then((result) => {
+//             req.result = result;
+//             return response(req, res);
+//         }, (error) => {
+//             log.error(`[${req.originalUrl}] SQL query error: ${error}`);
+//             next('Internal error, request could not be satisfied at this moment. Please, '
+//                 + 'try again later');
+//         });
+//     }
+// });
 
 module.exports = enrollmentApp;
-- 
GitLab