diff --git a/src/Config/DBConfig.ts b/src/Config/DBConfig.ts index 19ad4b222fe1246e755deefd2bc13c2442486645..81dd25b4f29177e506b277112b3849e99c5a4cff 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 31e16c9df9d2d7b328348f3338881294cb69c742..09298d8d0fac1df5f081b825db4056be1caa3b80 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 0000000000000000000000000000000000000000..35103fa7ca8132623159c66ac5c50eb5a6ff3c67 --- /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 0000000000000000000000000000000000000000..36b1d18e5f30d5dc455e0eab9f2f4858d9e1cef3 --- /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 d9e6f5ff6c91a5776f35f812323759b9a13bd98a..b67b4c53da9396fa926281af74f59bc7f8e0d0a8 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 567742233fb28b99354e0c01ce4831e89e5db848..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..d6d458f7d0103e35e9a36340a2491e48d1f59d27 --- /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 0000000000000000000000000000000000000000..e0067f3e557b22ff9a2387b3ec55fe19096d7faf --- /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 0000000000000000000000000000000000000000..528f378caa6ab066f3d4b08dc7b09b4c63399f5a --- /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 c0a5496ce35898a9a5aec616dc2fcfb2f6ad8677..fc47e9f0f18ec3b0f6c5938d1c29affdd5d016b8 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 2c379c0da6ab5735e7e3f745dad09879c4a48303..0000000000000000000000000000000000000000 --- 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 bd847cec4da5ff828c24962dc95fe798e2784760..c0d455a3f1ce2acd70e490e1f19e94773216a804 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 a193c653597796bb4e293651400af810fe39200d..4ee44b29f4b90fccc7b7374d9b5b4adf7b3a94c2 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}`);