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