From 7e4819e92e4e824025b8ee6a33da3a22e75285fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Tozatti=20Risso?= <jvtr12@c3sl.ufpr.br>
Date: Tue, 2 Aug 2016 10:06:54 -0300
Subject: [PATCH] Refactor enrollments route to use function chaining

---
 libs/routes/api.js | 117 +++++++++++++++++++++++++++++++++++----------
 1 file changed, 92 insertions(+), 25 deletions(-)

diff --git a/libs/routes/api.js b/libs/routes/api.js
index aa13166f..9bea796c 100644
--- a/libs/routes/api.js
+++ b/libs/routes/api.js
@@ -1,3 +1,5 @@
+'use strict';
+
 var express = require('express')
 var xml = require('js2xmlparser')
 var router = express.Router()
@@ -56,39 +58,34 @@ router.get('/data', function(req, res) {
     })
 })
 
-router.get('/enrollments', function(req, res) {
-    var params = req.query;
-    var id = 0;
-    var location_id = 0;
-    var adm_dependency_id = 0;
-    var census_year = 0;
-    var enrollmentSql = "";
+router.get('/enrollments', function(req, res, next) {
+    const params = req.query;
 
-    if (params.id)
-    {
-        id = parseInt(params.id, 10);
+    if (params.id) {
+        req.id = parseInt(params.id, 10);
     }
 
-    if (params.location_id)
-    {
-        location_id = parseInt(params.location_id, 10);
+    if (params.location_id) {
+        req.location_id = parseInt(params.location_id, 10);
     }
 
-    if (params.adm_dependency_id)
-    {
-        adm_dependency_id = parseInt(params.adm_dependency_id, 10);
+    if (params.adm_dependency_id) {
+        req.adm_dependency_id = parseInt(params.adm_dependency_id, 10);
     }
 
-    if (params.census_year)
-    {
-        census_year = parseInt(params.census_year, 10);
+    if (params.census_year) {
+        req.census_year = parseInt(params.census_year, 10);
     }
 
-    /**
-     * FIXME: parameter substitution in the queries is not safe (vulnerable to
-     * SQL injection). Substitution from MonetDB module is not working for some
-     * reason.
-     */
+    if (params.aggregate) {
+        log.debug('aggregate parameter detected');
+        next('route');
+    } else {
+        log.debug('No aggregate parameter detected');
+        next();
+    }
+
+    /*
     switch(params.aggregate)
     {
     case "city":
@@ -132,7 +129,77 @@ router.get('/enrollments', function(req, res) {
           });
         }
         log.debug("All resources were released");
+    }, function(error) {
+
     });
-})
+   */
+}, function(req, res, next) {
+    /** When no +aggregate+ parameter value is specified on the request, then
+     * assign the query to compute the result for the whole country.
+     */
+    log.debug('Using SQL query for the whole country');
+    req.sql_query = 'SELECT * FROM turmas LIMIT 1';
+    next('route');
+});
+
+router.get('/enrollments', function(req, res, next) {
+    const params = req.query;
+    if (!params.aggregate) {
+        next('route');
+    } else if (params.aggregate == 'region') {
+        log.debug('Using enrollments query for regions');
+        req.sql_query = 'SELECT * FROM turmas LIMIT 1';
+    }
+    next('route');
+});
+
+router.get('/enrollments', function(req, res, next) {
+    const params = req.query;
+    if (!params.aggregate) {
+        next('route');
+    } else if (params.aggregate == 'state') {
+        log.debug('Using enrollments query for states');
+        req.sql_query = 'SELECT * FROM turmas LIMIT 1';
+    }
+    next('route');
+});
+
+router.get('/enrollments', function(req, res, next) {
+    const params = req.query;
+    if (!params.aggregate) {
+        next('route');
+    } else if (params.aggregate == 'city') {
+        log.debug('Using enrollments query for cities');
+        req.sql_query = 'SELECT * FROM turmas LIMIT 1';
+    }
+    next('route');
+});
+
+router.get('/enrollments', function(req, res, next) {
+    log.debug('Request parameters: ${req}?');
+    if (!req.sql_query) {
+        /* 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!');
+        res.status(501).end();
+    } else {
+        log.debug('SQL query: ${req.sql_query}?');
+        conn.query(req.sql_query, true).then(function(result) {
+            log.debug(result);
+            if (req.query.format === 'csv') {
+                res.csv(result.data);
+            } else if (req.query.format === 'xml') {
+                res.send(xml('result', JSON.stringify({enrollments: result.data})));
+            } else {
+                res.json({ result: result.data });
+            }
+        }, function(error) {
+            log.error('SQL query error: ${error}?');
+            res.status(501).end();
+        });
+    }
+});
 
 module.exports = router
-- 
GitLab