From a2377b2cf53d8a882414bfc40ea4c99ceee4b102 Mon Sep 17 00:00:00 2001
From: Agustin Ruiz Diaz <agustin.ruiz.diaz@fing.edu.uy>
Date: Sat, 9 Oct 2021 17:03:27 -0300
Subject: [PATCH] parameterSubsystem release update and get services

---
 src/Config/DBConfig.ts                 |   2 +-
 src/Controllers/ParameterController.ts |  81 ++++++++++++----
 src/DTOs/DefaultWeightDTO.ts           |   2 +
 src/DTOs/ParameterWrapperDTO.ts        |  11 +++
 src/Enum/ParameterType.ts              |   3 +-
 src/Loaders/CSVParser.ts               |   1 +
 src/Loaders/DefaultWeightLoader.csv    | 128 ++++++++++++-------------
 src/Mappers/ParameterMapper.ts         |   2 +
 src/Services/ParameterService.ts       | 110 +++++++++++++++++++--
 9 files changed, 245 insertions(+), 95 deletions(-)
 create mode 100644 src/DTOs/ParameterWrapperDTO.ts

diff --git a/src/Config/DBConfig.ts b/src/Config/DBConfig.ts
index ff2e0b5..ddd9d64 100644
--- a/src/Config/DBConfig.ts
+++ b/src/Config/DBConfig.ts
@@ -1,7 +1,7 @@
 export const DBConfig = {
   HOST: 'localhost',
   USER: 'root',
-  PASSWORD: 'rootroot', // antes decia 'password'
+  PASSWORD: 'password', // antes decia 'password'
   DB: 'parameter_database',
   dialect: 'mysql',
 };
diff --git a/src/Controllers/ParameterController.ts b/src/Controllers/ParameterController.ts
index 72c9fb4..1cf4946 100644
--- a/src/Controllers/ParameterController.ts
+++ b/src/Controllers/ParameterController.ts
@@ -8,29 +8,72 @@ import ParameterService from '../Services/ParameterService';
 const router = Router();
 
 const getParameters: Handler = async (req: Request, res: Response) => {
-  // try {
-  //   const parameters = await ParameterService.getParameters();
-  //   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 });
-  // }
+  try {
+    const parameters = await ParameterService.getParameters();
+    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 });
+  }
 };
 
-const getParametersOfType: Handler = async (req: Request, res: Response) => {
-  // const { paramType } = 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 });
-  // }
+const getDefaultWeights: Handler = async (req: Request, res: Response) => {
+  try {
+    const weights = await ParameterService.getDefaultWeights();
+    return res.status(200).send(weights);
+  } catch (error) {
+    const e = error as Error;
+    logger.info(e.message);
+    return res.status(400).json({ error: e.message });
+  }
+};
+
+const getDefaultExtraData: Handler = async (req: Request, res: Response) => {
+  try {
+    const weights = await ParameterService.getDefaultExtraData();
+    return res.status(200).send(weights);
+  } catch (error) {
+    const e = error as Error;
+    logger.info(e.message);
+    return res.status(400).json({ error: e.message });
+  }
+};
+
+const updateParameterValue: Handler = async (req: Request, res: Response) => {
+  const { parameter } = req.body;
+  try {
+    switch (parameter.parameterType) {
+      case ParameterType.DefaultWeight:
+        await ParameterService.updateDefaultWeight(
+          parameter.ageRange, parameter.sex, parameter.value,
+        );
+        break;
+      case ParameterType.MinorPAL:
+      case ParameterType.AdultPAL:
+      case ParameterType.Maternity:
+        await ParameterService.updateExtraData(parameter.id, parameter.value);
+        break;
+      case ParameterType.TEE:
+      case ParameterType.BMR:
+        await ParameterService.updateEquationConstant(
+          parameter.ageRange, parameter.sex, parameter.order, parameter.value,
+        );
+        break;
+      default:
+        break;
+    }
+    return res.status(200).send();
+  } catch (error) {
+    const e = error as Error;
+    logger.info(e.message);
+    return res.status(400).json({ error: e.message });
+  }
 };
 
 router.post('/', getParameters);
-router.post('/type/', getParametersOfType);
+router.post('/weights/', getDefaultWeights);
+router.post('/extraData/', getDefaultExtraData);
+router.put('/parameterUpdate/', updateParameterValue);
 
 export default router;
diff --git a/src/DTOs/DefaultWeightDTO.ts b/src/DTOs/DefaultWeightDTO.ts
index 44ddff6..3d31645 100644
--- a/src/DTOs/DefaultWeightDTO.ts
+++ b/src/DTOs/DefaultWeightDTO.ts
@@ -1,10 +1,12 @@
 import AgeBracket from '../Enum/AgeBracket';
+import ParameterType from '../Enum/ParameterType';
 import Sex from '../Enum/Sex';
 
 type DefaultWeightDTO = {
   value: number;
   ageRange: AgeBracket;
   sex: Sex;
+  parameterType: ParameterType;
 };
 
 export default DefaultWeightDTO;
diff --git a/src/DTOs/ParameterWrapperDTO.ts b/src/DTOs/ParameterWrapperDTO.ts
new file mode 100644
index 0000000..b43fc47
--- /dev/null
+++ b/src/DTOs/ParameterWrapperDTO.ts
@@ -0,0 +1,11 @@
+import DefaultExtraDataDTO from './DefaultExtraDataDTO';
+import DefaultWeightDTO from './DefaultWeightDTO';
+import EquationConstantDTO from './EquationConstantDTO';
+
+type ParameterWrapperDTO = {
+  defaultExtraData: DefaultExtraDataDTO[];
+  defaultWeights: DefaultWeightDTO[];
+  equationConstants: EquationConstantDTO[];
+};
+
+export default ParameterWrapperDTO;
diff --git a/src/Enum/ParameterType.ts b/src/Enum/ParameterType.ts
index 5d8d96a..c26deb1 100644
--- a/src/Enum/ParameterType.ts
+++ b/src/Enum/ParameterType.ts
@@ -4,7 +4,8 @@ enum ParameterType {
   Maternity = 'Embarazo y lactancia',
   TEE = 'GET',
   BMR = 'TMB',
-  GrowthEnergy = 'Energia para crecimiento'
+  GrowthEnergy = 'Energia para crecimiento',
+  DefaultWeight = 'Peso por defecto',
 }
 
 export default ParameterType;
diff --git a/src/Loaders/CSVParser.ts b/src/Loaders/CSVParser.ts
index a10e1b0..01ffdd8 100644
--- a/src/Loaders/CSVParser.ts
+++ b/src/Loaders/CSVParser.ts
@@ -14,6 +14,7 @@ function csvToDefaultWeight(csv: string): DefaultWeightDTO[] {
       ageRange: fields[0] as AgeBracket,
       value: parseFloat(fields[1]),
       sex: fields[2] as Sex,
+      parameterType: fields[3] as ParameterType,
     });
   });
   parameters.shift();
diff --git a/src/Loaders/DefaultWeightLoader.csv b/src/Loaders/DefaultWeightLoader.csv
index 5c7412e..5ee79de 100644
--- a/src/Loaders/DefaultWeightLoader.csv
+++ b/src/Loaders/DefaultWeightLoader.csv
@@ -1,65 +1,65 @@
 age,value,sex
-0 meses,3.3,Masculino
-1 mes,4.5,Masculino
-2 meses,5.6,Masculino
-3 meses,6.4,Masculino
-4 meses,7,Masculino
-5 meses,7.5,Masculino
-6 meses,7.9,Masculino
-7 meses,8.3,Masculino
-8 meses,8.6,Masculino
-9 meses,8.9,Masculino
-10 meses,9.2,Masculino
-11 mes,9.4,Masculino
-1 año,10.9,Masculino
-2 años,13.3,Masculino
-3 años,15.3,Masculino
-4 años,17.3,Masculino
-5 años,19.5,Masculino
-6 años,21.8,Masculino
-7 años,24.2,Masculino
-8 años,26.8,Masculino
-9 años,29.6,Masculino
-10 años,32.9,Masculino
-11 año,36.7,Masculino
-12 años,41.6,Masculino
-13 años,47.4,Masculino
-14 años,53.7,Masculino
-15 años,58.8,Masculino
-16 años,63.1,Masculino
-17 años,66.1,Masculino
-18-29 años,67.4,Masculino
-30-59 años,66.6,Masculino
-60+ años,64.3,Masculino
-0 meses,3.2,Femenino
-1 mes,4.2,Femenino
-2 meses,5.1,Femenino
-3 meses,5.8,Femenino
-4 meses,6.4,Femenino
-5 meses,6.9,Femenino
-6 meses,7.3,Femenino
-7 meses,7.6,Femenino
-8 meses,7.9,Femenino
-9 meses,8.2,Femenino
-10 meses,8.5,Femenino
-11 mes,8.7,Femenino
-1 año,10.2,Femenino
-2 años,12.7,Femenino
-3 años,15,Femenino
-4 años,17.2,Femenino
-5 años,19.1,Femenino
-6 años,21.3,Femenino
-7 años,23.7,Femenino
-8 años,26.7,Femenino
-9 años,29.9,Femenino
-10 años,34,Femenino
-11 año,38.7,Femenino
-12 años,43.6,Femenino
-13 años,48.1,Femenino
-14 años,51.5,Femenino
-15 años,53.9,Femenino
-16 años,55.3,Femenino
-17 años,56.3,Femenino
-18-29 años,57.7,Femenino
-30-59 años,56.3,Femenino
-60+ años,54.2,Femenino
+0 meses,3.3,Masculino,Peso por defecto
+1 mes,4.5,Masculino,Peso por defecto
+2 meses,5.6,Masculino,Peso por defecto
+3 meses,6.4,Masculino,Peso por defecto
+4 meses,7,Masculino,Peso por defecto
+5 meses,7.5,Masculino,Peso por defecto
+6 meses,7.9,Masculino,Peso por defecto
+7 meses,8.3,Masculino,Peso por defecto
+8 meses,8.6,Masculino,Peso por defecto
+9 meses,8.9,Masculino,Peso por defecto
+10 meses,9.2,Masculino,Peso por defecto
+11 mes,9.4,Masculino,Peso por defecto
+1 año,10.9,Masculino,Peso por defecto
+2 años,13.3,Masculino,Peso por defecto
+3 años,15.3,Masculino,Peso por defecto
+4 años,17.3,Masculino,Peso por defecto
+5 años,19.5,Masculino,Peso por defecto
+6 años,21.8,Masculino,Peso por defecto
+7 años,24.2,Masculino,Peso por defecto
+8 años,26.8,Masculino,Peso por defecto
+9 años,29.6,Masculino,Peso por defecto
+10 años,32.9,Masculino,Peso por defecto
+11 año,36.7,Masculino,Peso por defecto
+12 años,41.6,Masculino,Peso por defecto
+13 años,47.4,Masculino,Peso por defecto
+14 años,53.7,Masculino,Peso por defecto
+15 años,58.8,Masculino,Peso por defecto
+16 años,63.1,Masculino,Peso por defecto
+17 años,66.1,Masculino,Peso por defecto
+18-29 años,67.4,Masculino,Peso por defecto
+30-59 años,66.6,Masculino,Peso por defecto
+60+ años,64.3,Masculino,Peso por defecto
+0 meses,3.2,Femenino,Peso por defecto
+1 mes,4.2,Femenino,Peso por defecto
+2 meses,5.1,Femenino,Peso por defecto
+3 meses,5.8,Femenino,Peso por defecto
+4 meses,6.4,Femenino,Peso por defecto
+5 meses,6.9,Femenino,Peso por defecto
+6 meses,7.3,Femenino,Peso por defecto
+7 meses,7.6,Femenino,Peso por defecto
+8 meses,7.9,Femenino,Peso por defecto
+9 meses,8.2,Femenino,Peso por defecto
+10 meses,8.5,Femenino,Peso por defecto
+11 mes,8.7,Femenino,Peso por defecto
+1 año,10.2,Femenino,Peso por defecto
+2 años,12.7,Femenino,Peso por defecto
+3 años,15,Femenino,Peso por defecto
+4 años,17.2,Femenino,Peso por defecto
+5 años,19.1,Femenino,Peso por defecto
+6 años,21.3,Femenino,Peso por defecto
+7 años,23.7,Femenino,Peso por defecto
+8 años,26.7,Femenino,Peso por defecto
+9 años,29.9,Femenino,Peso por defecto
+10 años,34,Femenino,Peso por defecto
+11 año,38.7,Femenino,Peso por defecto
+12 años,43.6,Femenino,Peso por defecto
+13 años,48.1,Femenino,Peso por defecto
+14 años,51.5,Femenino,Peso por defecto
+15 años,53.9,Femenino,Peso por defecto
+16 años,55.3,Femenino,Peso por defecto
+17 años,56.3,Femenino,Peso por defecto
+18-29 años,57.7,Femenino,Peso por defecto
+30-59 años,56.3,Femenino,Peso por defecto
+60+ años,54.2,Femenino,Peso por defecto
diff --git a/src/Mappers/ParameterMapper.ts b/src/Mappers/ParameterMapper.ts
index 618aba2..bc4be6e 100644
--- a/src/Mappers/ParameterMapper.ts
+++ b/src/Mappers/ParameterMapper.ts
@@ -1,6 +1,7 @@
 import DefaultExtraDataDTO from '../DTOs/DefaultExtraDataDTO';
 import DefaultWeightDTO from '../DTOs/DefaultWeightDTO';
 import EquationConstantDTO from '../DTOs/EquationConstantDTO';
+import ParameterType from '../Enum/ParameterType';
 import DefaultExtraData from '../Models/DefaultExtraData';
 import DefaultWeight from '../Models/DefaultWeight';
 import EquationConstant from '../Models/EquationConstant';
@@ -33,6 +34,7 @@ function defaultWeightToDTO(parameter: DefaultWeight): DefaultWeightDTO {
     value: parameter.value,
     ageRange: parameter.ageRange,
     sex: parameter.sex,
+    parameterType: ParameterType.DefaultWeight,
   };
   return res;
 }
diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts
index 73942ad..ae6d895 100644
--- a/src/Services/ParameterService.ts
+++ b/src/Services/ParameterService.ts
@@ -6,6 +6,9 @@ import Sex from '../Enum/Sex';
 import ParameterMapper from '../Mappers/ParameterMapper';
 import DefaultExtraData from '../Models/DefaultExtraData';
 import EquationConstant from '../Models/EquationConstant';
+import DefaultWeight from '../Models/DefaultWeight';
+import DefaultWeightDTO from '../DTOs/DefaultWeightDTO';
+import ParameterWrapperDTO from '../DTOs/ParameterWrapperDTO';
 
 const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<number[]> => {
   const res: number[] = [];
@@ -159,17 +162,104 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb
   return res;
 };
 
-// const getParameters = async (): Promise<ParameterDTO[]> => {
-// const res: ParameterDTO[] = [];
-// await Parameter.findAll().then((parameters: Parameter[]) => {
-// parameters.forEach((param: Parameter) => {
-// res.push(ParameterMapper.parameterToData(param));
-// });
-//   });
-// return res;
-// };
+const getDefaultWeights = async (): Promise<DefaultWeightDTO[]> => {
+  const res: DefaultWeightDTO[] = [];
+  await DefaultWeight.findAll().then((parameters: DefaultWeight[]) => {
+    parameters.forEach((param: DefaultWeight) => {
+      res.push(ParameterMapper.defaultWeightToDTO(param));
+    });
+  });
+  return res;
+};
 
-export default { getEquationValues /* , getParameters */ };
+const getDefaultExtraData = async (): Promise<DefaultExtraDataDTO[]> => {
+  const res: DefaultExtraDataDTO[] = [];
+  await DefaultExtraData.findAll({
+    where: {
+      order: 0,
+    },
+  }).then((parameters: DefaultExtraData[]) => {
+    parameters.forEach((param: DefaultExtraData) => {
+      res.push(ParameterMapper.defaultExtraDataToDTO(param));
+    });
+  });
+  return res;
+};
+
+const getParameters = async (): Promise<ParameterWrapperDTO> => {
+  const extraData: DefaultExtraDataDTO[] = [];
+  await DefaultExtraData.findAll().then((parameters: DefaultExtraData[]) => {
+    parameters.forEach((param: DefaultExtraData) => {
+      extraData.push(ParameterMapper.defaultExtraDataToDTO(param));
+    });
+  });
+  const equationConstant: EquationConstantDTO[] = [];
+  await EquationConstant.findAll().then((parameters: EquationConstant[]) => {
+    parameters.forEach((param: EquationConstant) => {
+      equationConstant.push(ParameterMapper.equationConstantToDTO(param));
+    });
+  });
+  const defaultWeight: DefaultWeightDTO[] = await getDefaultWeights();
+  const res: ParameterWrapperDTO = {
+    equationConstants: equationConstant,
+    defaultWeights: defaultWeight,
+    defaultExtraData: extraData,
+  };
+  return res;
+};
+
+const updateEquationConstant = async (age: AgeBracket, s: Sex, ord: number, val: number):
+Promise<void> => {
+  EquationConstant.update(
+    { value: val },
+    {
+      where: {
+        ageRange: age,
+        sex: s,
+        order: ord,
+      },
+    },
+  ).catch((err) => {
+    throw err;
+  });
+};
+
+const updateDefaultWeight = async (age: AgeBracket, s: Sex, val: number): Promise<void> => {
+  DefaultWeight.update(
+    { value: val },
+    {
+      where: {
+        ageRange: age,
+        sex: s,
+      },
+    },
+  ).catch((err) => {
+    throw err;
+  });
+};
+
+const updateExtraData = async (identifier: string, val: number): Promise<void> => {
+  DefaultExtraData.update(
+    { value: val },
+    {
+      where: {
+        id: identifier,
+      },
+    },
+  ).catch((err) => {
+    throw err;
+  });
+};
+
+export default {
+  getEquationValues,
+  getDefaultWeights,
+  getDefaultExtraData,
+  getParameters,
+  updateEquationConstant,
+  updateDefaultWeight,
+  updateExtraData,
+};
 
 // const getEquationValues = (ageBracket: AgeBracket, sex: Sex): number[] => {
 //   let res: number[] = [];
-- 
GitLab