From 1c461abfd19737dd2a66ee88d94d343533211263 Mon Sep 17 00:00:00 2001
From: Richard Fernando Heise Ferreira <rfhf19@inf.ufpr.br>
Date: Thu, 9 Apr 2020 09:12:16 -0300
Subject: [PATCH] Issue #72: Add method to get form answers number

Signed-off-by: Richard Heise <rfhf19@inf.ufpr.br>
---
 CHANGELOG.md                           |  6 +++++
 package.json                           |  2 +-
 src/api/controllers/form.ts            | 32 ++++++++++++++++++++++++++
 src/api/controllers/formAnswer.spec.ts | 14 +++++++++++
 src/api/controllers/formAnswer.ts      |  2 +-
 src/main.ts                            |  1 +
 6 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0449a75..523a244 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 
+## 1.2.2 - 07-04-2020
+## Added 
+- Route to return the number of answers in a form #72 (Richard Heise)
+
+
 ## 1.2.1 - 05-03-2020
 ## Added
 - Cors to integrate front-end with back-end #68 (Richard Heise)
@@ -12,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Minor route order changes on main.ts to make it more intuitive
 - Port on config.env from 3000 to 3333 for integration purpose
 
+
 ## 1.2.0 - 19-02-2020
 ### Changed
 - Created a stable version with user
diff --git a/package.json b/package.json
index a8160ee..9812c02 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "form-creator-api",
-  "version": "1.2.1",
+  "version": "1.2.2",
   "description": "RESTful API used to manage and answer forms.",
   "main": "index.js",
   "scripts": {
diff --git a/src/api/controllers/form.ts b/src/api/controllers/form.ts
index 5990cc2..55a163d 100644
--- a/src/api/controllers/form.ts
+++ b/src/api/controllers/form.ts
@@ -26,6 +26,7 @@ import { Form, FormOptions} from "../../core/form";
 import { FormUpdate, FormUpdateOptions } from "../../core/formUpdate";
 import { Response, NextFunction } from "express";
 import { Request } from "../apiTypes";
+import { FormAnswer, FormAnswerOptions } from "../../core/formAnswer";
 
 export class FormCtrl {
 
@@ -166,4 +167,35 @@ export class FormCtrl {
             return;
         });
     }
+
+    public static answerNumber(req: Request, res: Response, next: NextFunction) {
+
+        waterfall([
+            (callback: (err: Error, answer?: FormAnswer[]) => void) => {
+                req.db.answer.readAll(req.params.id, (err: Error, resultAnswer?: FormAnswer[]) => {
+                    if (err) {
+                        callback(err);
+                        return;
+                    }
+
+                    let sum: number = 0;
+                    for (const forms of resultAnswer) {
+                        sum += Object.keys(forms.inputAnswers).length
+                    }
+
+                    res.status(200).json({
+                        answerNumber: sum
+                    });
+                });
+            }
+        ], (error: Error) => {
+            if (error) {
+                res.status(500).json({
+                    message: "Some error has ocurred. Check error property for details.",
+                    error: error.message
+                });
+                return;
+            }
+        });
+    }
 }
diff --git a/src/api/controllers/formAnswer.spec.ts b/src/api/controllers/formAnswer.spec.ts
index b92c7cf..cf065c0 100644
--- a/src/api/controllers/formAnswer.spec.ts
+++ b/src/api/controllers/formAnswer.spec.ts
@@ -107,4 +107,18 @@ describe("API data controller", () => {
             })
         .end(done);
     });
+
+    it ("Should respond 200 when reading the number of answers from a form", (done) => {
+
+        request(server)
+        .get("/answerNumber/1")
+        .expect(200)
+            
+            .expect((res: any) => {
+                expect(res.body).to.be.an("object");
+                expect(res.body.answerNumber).to.be.an("number");
+                expect(res.body.answerNumber).to.be.equal(9);
+            })
+        .end(done);
+    })
 });
diff --git a/src/api/controllers/formAnswer.ts b/src/api/controllers/formAnswer.ts
index 8234153..8fa21ee 100644
--- a/src/api/controllers/formAnswer.ts
+++ b/src/api/controllers/formAnswer.ts
@@ -115,7 +115,7 @@ export class AnswerCtrl {
                         return;
                     }
 
-                    res.status(200).json( resultAnswer )
+                    res.status(200).json(resultAnswer);
                 });
             }
         ], (error: Error) => {
diff --git a/src/main.ts b/src/main.ts
index 8a913b0..bb6e5e6 100755
--- a/src/main.ts
+++ b/src/main.ts
@@ -56,6 +56,7 @@ app.use(express.json());
 app.get("/form/:id", FormCtrl.read);
 app.put("/form/:id", tokenValidation(), FormCtrl.update);
 app.post("/form", tokenValidation(), FormCtrl.write);
+app.get("/answerNumber/:id", FormCtrl.answerNumber);
 app.post("/answer/:id", AnswerCtrl.write);
 app.get("/answer/:id", tokenValidation(), AnswerCtrl.read);
 app.post("/user/signUp", UserCtrl.signUp);
-- 
GitLab