From f8a4b02957f0e4f02852dfb5e1452c504ac6bc17 Mon Sep 17 00:00:00 2001
From: Agustin Ruiz Diaz <agustin.ruiz.diaz@fing.edu.uy>
Date: Tue, 28 Sep 2021 15:07:24 -0300
Subject: [PATCH] Loader half done, and getParametersOfType

---
 src/Config/DBConfig.ts                 |  2 +-
 src/Controllers/ParameterController.ts | 12 ++++++++-
 src/DTOs/ParameterDTO.ts               |  9 +++++++
 src/Loaders/CSVParser.ts               | 18 +++++++++++++
 src/Loaders/DBLoader.sql               |  2 +-
 src/Loaders/DataBase.ts                | 23 ----------------
 src/Loaders/ParameterDataBase.ts       | 17 ++++++++++++
 src/Loaders/ParameterDataBaseLoader.ts | 12 +++++++++
 src/Mappers/ParameterMapper.ts         | 13 ++++++++++
 src/Models/Parameter.ts                | 36 ++++++++++++++++++--------
 src/Models/ParameterModel.ts           | 25 ------------------
 src/Services/ParameterService.ts       | 21 ++++++++++++++-
 src/index.ts                           |  4 +--
 13 files changed, 129 insertions(+), 65 deletions(-)
 create mode 100644 src/DTOs/ParameterDTO.ts
 create mode 100644 src/Loaders/CSVParser.ts
 delete mode 100644 src/Loaders/DataBase.ts
 create mode 100644 src/Loaders/ParameterDataBase.ts
 create mode 100644 src/Loaders/ParameterDataBaseLoader.ts
 create mode 100644 src/Mappers/ParameterMapper.ts
 delete mode 100644 src/Models/ParameterModel.ts

diff --git a/src/Config/DBConfig.ts b/src/Config/DBConfig.ts
index 19ad4b2..81dd25b 100644
--- a/src/Config/DBConfig.ts
+++ b/src/Config/DBConfig.ts
@@ -2,6 +2,6 @@ export const DBConfig = {
   HOST: 'localhost',
   USER: 'root',
   PASSWORD: 'password',
-  DB: 'testdb',
+  DB: 'parameter_database',
   dialect: 'mysql',
 };
diff --git a/src/Controllers/ParameterController.ts b/src/Controllers/ParameterController.ts
index 31e16c9..09298d8 100644
--- a/src/Controllers/ParameterController.ts
+++ b/src/Controllers/ParameterController.ts
@@ -2,11 +2,21 @@ import {
   Handler, Request, Response, Router,
 } from 'express';
 import ParameterType from '../Enum/ParameterType';
+import logger from '../Logger/logger';
+import ParameterService from '../Services/ParameterService';
 
 const router = Router();
 
 const getParametersOfType: Handler = async (req: Request, res: Response) => {
-  res.send();
+  const paramType: string = req.body;
+  try {
+    const parameters = await ParameterService.getParametersOfType(paramType as ParameterType);
+    return res.status(200).send(parameters);
+  } catch (error) {
+    const e = error as Error;
+    logger.info(e.message);
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 router.post('/', getParametersOfType);
diff --git a/src/DTOs/ParameterDTO.ts b/src/DTOs/ParameterDTO.ts
new file mode 100644
index 0000000..35103fa
--- /dev/null
+++ b/src/DTOs/ParameterDTO.ts
@@ -0,0 +1,9 @@
+import ParameterType from '../Enum/ParameterType';
+
+type ParameterDTO = {
+  id: string;
+  value: number;
+  parameterType: ParameterType;
+};
+
+export default ParameterDTO;
diff --git a/src/Loaders/CSVParser.ts b/src/Loaders/CSVParser.ts
new file mode 100644
index 0000000..36b1d18
--- /dev/null
+++ b/src/Loaders/CSVParser.ts
@@ -0,0 +1,18 @@
+import ParameterDTO from '../DTOs/ParameterDTO';
+import ParameterType from '../Enum/ParameterType';
+
+function csvToParameters(csv: string): ParameterDTO[] {
+  const parameters: ParameterDTO[] = [];
+  const lines: string[] = csv.split('\n');
+  lines.forEach((parameter: string) => {
+    const fields = parameter.split(',');
+    parameters.push({
+      id: fields[0],
+      value: parseFloat(fields[1]),
+      parameterType: fields[2] as ParameterType,
+    });
+  });
+  return parameters;
+}
+
+export default { csvToParameters };
diff --git a/src/Loaders/DBLoader.sql b/src/Loaders/DBLoader.sql
index d9e6f5f..b67b4c5 100644
--- a/src/Loaders/DBLoader.sql
+++ b/src/Loaders/DBLoader.sql
@@ -1,5 +1,5 @@
 CREATE TABLE Parameters (
-  id STRING NOT NULL,
+  id VARCHAR(100) NOT NULL,
   value INT NOT NULL,
   parameterType INT NOT NULL,
   PRIMARY KEY (id)
diff --git a/src/Loaders/DataBase.ts b/src/Loaders/DataBase.ts
deleted file mode 100644
index 5677422..0000000
--- a/src/Loaders/DataBase.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import fs from 'fs';
-import { Sequelize } from 'sequelize';
-import { DBConfig } from '../Config/DBConfig';
-
-function initDataBase(): Sequelize {
-  const sequelize = new Sequelize(
-    DBConfig.DB,
-    DBConfig.USER,
-    DBConfig.PASSWORD,
-    {
-      host: DBConfig.HOST,
-      dialect: 'mysql',
-      dialectOptions: {
-        multipleStatements: true,
-      },
-    },
-  );
-  const loadQuery: string = fs.readFileSync('/DBLoader.sql').toString();
-  sequelize.query(loadQuery);
-  return sequelize;
-}
-
-export default { initDataBase };
diff --git a/src/Loaders/ParameterDataBase.ts b/src/Loaders/ParameterDataBase.ts
new file mode 100644
index 0000000..d6d458f
--- /dev/null
+++ b/src/Loaders/ParameterDataBase.ts
@@ -0,0 +1,17 @@
+import { Sequelize } from 'sequelize';
+import { DBConfig } from '../Config/DBConfig';
+
+const sequelize = new Sequelize(
+  DBConfig.DB,
+  DBConfig.USER,
+  DBConfig.PASSWORD,
+  {
+    host: DBConfig.HOST,
+    dialect: 'mysql',
+    dialectOptions: {
+      multipleStatements: true,
+    },
+  },
+);
+
+export default sequelize;
diff --git a/src/Loaders/ParameterDataBaseLoader.ts b/src/Loaders/ParameterDataBaseLoader.ts
new file mode 100644
index 0000000..e0067f3
--- /dev/null
+++ b/src/Loaders/ParameterDataBaseLoader.ts
@@ -0,0 +1,12 @@
+import fs from 'fs';
+import ParameterDTO from '../DTOs/ParameterDTO';
+import Parameter from '../Models/Parameter';
+import CSVParser from './CSVParser';
+
+function initParameterDataBase(): void {
+  const csv: string = fs.readFileSync('/loader.csv').toString();
+  const parameters: ParameterDTO[] = CSVParser.csvToParameters(csv);
+  Parameter.bulkCreate(parameters);
+}
+
+export default { initParameterDataBase };
diff --git a/src/Mappers/ParameterMapper.ts b/src/Mappers/ParameterMapper.ts
new file mode 100644
index 0000000..528f378
--- /dev/null
+++ b/src/Mappers/ParameterMapper.ts
@@ -0,0 +1,13 @@
+import ParameterDTO from '../DTOs/ParameterDTO';
+import Parameter from '../Models/Parameter';
+
+function parameterToData(parameter: Parameter): ParameterDTO {
+  const res: ParameterDTO = {
+    id: parameter.id,
+    value: parameter.value,
+    parameterType: parameter.parameterType,
+  };
+  return res;
+}
+
+export default { parameterToData };
diff --git a/src/Models/Parameter.ts b/src/Models/Parameter.ts
index c0a5496..fc47e9f 100644
--- a/src/Models/Parameter.ts
+++ b/src/Models/Parameter.ts
@@ -1,17 +1,31 @@
+import { Model, DataTypes } from 'sequelize';
 import ParameterType from '../Enum/ParameterType';
+import ParameterAttributes from '../Interfaces/ParameterAttributes';
+import ParameterCreationAttributes from '../Interfaces/ParameterCreationAttributes';
+import sequelize from '../Loaders/ParameterDataBase';
 
-class ParameterModel {
-  name: string;
+class Parameter extends Model<ParameterAttributes, ParameterCreationAttributes>
+  implements ParameterAttributes {
+  id!: string;
 
-  value: number;
+  value!: number;
 
-  parameterType: ParameterType;
-
-  constructor(name: string, value: number, parameterType: ParameterType) {
-    this.name = name;
-    this.value = value;
-    this.parameterType = parameterType;
-  }
+  parameterType!: ParameterType;
 }
 
-export default ParameterModel;
+Parameter.init(
+  {
+    id: {
+      type: DataTypes.STRING,
+      primaryKey: true,
+    },
+    value: DataTypes.NUMBER,
+    parameterType: {
+      type: DataTypes.INTEGER,
+      primaryKey: true,
+    },
+  },
+  { sequelize, modelName: 'Parameter' },
+);
+
+export default Parameter;
diff --git a/src/Models/ParameterModel.ts b/src/Models/ParameterModel.ts
deleted file mode 100644
index 2c379c0..0000000
--- a/src/Models/ParameterModel.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Model, DataTypes } from 'sequelize';
-import ParameterType from '../Enum/ParameterType';
-import ParameterAttributes from '../Interfaces/ParameterAttributes';
-import ParameterCreationAttributes from '../Interfaces/ParameterCreationAttributes';
-import sequelize from '../Loaders/DataBase';
-
-class Parameter extends Model<ParameterAttributes, ParameterCreationAttributes>
-  implements ParameterAttributes {
-  id!: string;
-
-  value!: number;
-
-  parameterType!: ParameterType;
-}
-
-Parameter.init(
-  {
-    id: DataTypes.STRING,
-    value: DataTypes.NUMBER,
-    parameterType: DataTypes.INTEGER,
-  },
-  { sequelize, modelName: 'Parameter' },
-);
-
-export default Parameter;
diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts
index bd847ce..c0d455a 100644
--- a/src/Services/ParameterService.ts
+++ b/src/Services/ParameterService.ts
@@ -1,6 +1,9 @@
+import ParameterDTO from '../DTOs/ParameterDTO';
 import AgeBracket from '../Enum/AgeBracket';
 import ParameterType from '../Enum/ParameterType';
 import Sex from '../Enum/Sex';
+import ParameterMapper from '../Mappers/ParameterMapper';
+import Parameter from '../Models/Parameter';
 // import Parameter from '../Models/Parameter';
 
 const getEquationValues = (ageBracket: AgeBracket, sex: Sex): number[] => {
@@ -334,4 +337,20 @@ const getEquationValues = (ageBracket: AgeBracket, sex: Sex): number[] => {
   return res;
 };
 
-export default { getEquationValues };
+const getParametersOfType = (paramType: ParameterType): ParameterDTO[] => {
+  const res: ParameterDTO[] = [];
+  const params: Promise<Parameter[]> = Parameter.findAll({
+    where: {
+      parameterType: paramType,
+    },
+  });
+  params.then((parameters) => parameters.forEach((param: Parameter) => {
+    res.push(ParameterMapper.parameterToData(param));
+  }))
+    .catch((err) => {
+      throw new Error(err);
+    });
+  return res;
+};
+
+export default { getEquationValues, getParametersOfType };
diff --git a/src/index.ts b/src/index.ts
index a193c65..4ee44b2 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -7,7 +7,7 @@ import helmet from 'helmet';
 import YAML from 'yamljs';
 import Routes from './routes';
 import logger from './Logger/logger';
-import DataBase from './Loaders/DataBase';
+import ParameterDataBaseLoader from './Loaders/ParameterDataBaseLoader';
 
 const app: Application = express();
 const PORT = process.env.PORT || 8000;
@@ -34,7 +34,7 @@ app.use(express.raw({
 
 app.use(Routes);
 
-const sequelize = DataBase.initDataBase();
+ParameterDataBaseLoader.initParameterDataBase();
 
 app.listen(PORT, (): void => {
   console.log(`REPP Backend running here 👉 https://localhost:${PORT}`);
-- 
GitLab