From d07a81ab116bb005562be8614596155e56c7b443 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] 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