diff --git a/__test__/ParameterService.test.ts b/__test__/ParameterService.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..86704090172e06f3846fc3acce62928939cfaf2c --- /dev/null +++ b/__test__/ParameterService.test.ts @@ -0,0 +1,21 @@ +import '@testing-library/jest-dom/extend-expect'; +import AgeBracket from '../src/Enum/AgeBracket'; +import Sex from '../src/Enum/Sex'; +import ParameterService from '../src/Services/ParameterService'; + +describe('Verificar si devuelve los parametros correctamente', () => { + it('Pesos por defecto', async () => { + expect((await ParameterService.getDefaultWeights()).length).toBe(64); + }); + it('Datos Extra', async () => { + expect((await ParameterService.getDefaultExtraData()).length).toBe(13); + }); + it('Constantes de ecuacion', async () => { + expect(new Set(await ParameterService.getEquationValues(AgeBracket.a1, Sex.Male))) + .toEqual(new Set([310.2, 63.3, -0.263, 13])); + }); + it('Constantes de ecuacion', async () => { + expect(new Set(await ParameterService.getEquationValues(AgeBracket.a10, Sex.Female))) + .toEqual(new Set([263.4, 65.3, -0.454, 25, -15, 15])); + }); +}); diff --git a/package-lock.json b/package-lock.json index ef892c3b90ccb1701cfb60076883063675e0503f..c85b0b255988303a8be0b33d08b0581455221367 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1850,7 +1850,6 @@ "version": "1.19.1", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", - "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -1860,7 +1859,6 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -1881,7 +1879,6 @@ "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -1893,7 +1890,6 @@ "version": "4.17.24", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", - "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -1957,8 +1953,7 @@ "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { "version": "16.9.6", @@ -1980,20 +1975,17 @@ "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -4217,6 +4209,17 @@ } } }, + "express-json-validator-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/express-json-validator-middleware/-/express-json-validator-middleware-2.2.1.tgz", + "integrity": "sha512-9Y3A6QMNBRLcPmnN1KhsntyT4BKxb6KIhwiaV+y/YlAA/UJnTZTcZ9n0qGSX1LRdtV85YZL44M2d9jAcTW3fHA==", + "requires": { + "@types/express": "^4.17.3", + "@types/express-serve-static-core": "^4.17.2", + "@types/json-schema": "^7.0.4", + "ajv": "^6.6.2" + } + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", diff --git a/package.json b/package.json index 9c7997d2e6d751a87f4005705597f35a1f2a1bf7..565f98539672dea43c09a0d6c76f4b02103abef7 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "cors": "^2.8.5", "dotenv": "^10.0.0", "express": "^4.17.1", + "express-json-validator-middleware": "^2.2.1", "gulp-eslint": "^6.0.0", "helmet": "^4.6.0", "mysql2": "^2.3.0", diff --git a/src/Config/DBConfig.ts b/src/Config/DBConfig.ts index ff2e0b593a861d778215770dc47942b5fbae4221..ddd9d64e490508284986414c5e5181364fb75260 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/CalculatorController.ts b/src/Controllers/CalculatorController.ts index 253c559d838140e897019b6e1e4b14339da663d1..91db8387271d961d2b9691c5d8fe151fd206ce3d 100644 --- a/src/Controllers/CalculatorController.ts +++ b/src/Controllers/CalculatorController.ts @@ -1,12 +1,16 @@ import { Handler, Request, Response, Router, } from 'express'; +import { Validator } from 'express-json-validator-middleware'; import CalculatorService from '../Services/CalculatorService'; import CalculatorResponse from '../DTOs/CalculatorResponseDTO'; import logger from '../Logger/logger'; +import getRepBody from '../Schemas/getRepBody'; const router = Router(); +const { validate } = new Validator({}); + const getREP: Handler = async (req: Request, res: Response) => { const { groups, extraData } = req.body; try { @@ -21,6 +25,6 @@ const getREP: Handler = async (req: Request, res: Response) => { } }; -router.post('/', getREP); +router.post('/', validate({ body: getRepBody }), getREP); export default router; diff --git a/src/Controllers/ParameterController.ts b/src/Controllers/ParameterController.ts index 72c9fb4f96454c8296b7141ad799c5cd0247ec1b..2fc04f00f65704449e2f085cc22ebb5726d6648d 100644 --- a/src/Controllers/ParameterController.ts +++ b/src/Controllers/ParameterController.ts @@ -1,36 +1,84 @@ import { Handler, Request, Response, Router, } from 'express'; +import { Validator } from 'express-json-validator-middleware'; import ParameterType from '../Enum/ParameterType'; import logger from '../Logger/logger'; +import updateParameterValueBody from '../Schemas/updateParameterValueBody'; import ParameterService from '../Services/ParameterService'; const router = Router(); +const { validate } = new Validator({}); + 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 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 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 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: + case ParameterType.GrowthEnergy: + 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.get('/', getParameters); +router.post('/weights/', getDefaultWeights); +router.post('/extraData/', getDefaultExtraData); +router.put('/parameterUpdate/', validate({ body: updateParameterValueBody }), updateParameterValue); export default router; diff --git a/src/DTOs/DefaultWeightDTO.ts b/src/DTOs/DefaultWeightDTO.ts index 44ddff68cacf9b4e4a8ec670235a316216c80283..3d316450d19acb5dfc66de798b6ee2cc3432b9c4 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 0000000000000000000000000000000000000000..b43fc4746d6c9f66720c66ab8fdb3066b11816f1 --- /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 5d8d96ae9f72dfddde392a5ff4e99d63fc4674e3..c26deb19002650e14957e360d72f2f814b380468 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 a10e1b04ea5d9b64438c3ede7078f277d0a34604..01ffdd85f077ebd872157001cc08739ec02362bf 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/DefaultExtraDataLoader.csv b/src/Loaders/DefaultExtraDataLoader.csv index b1f473da44a3573594cfd01cdc40a6981b9f8912..6d3d247d219216c5ab1a9a00aae4e33825b8f806 100644 --- a/src/Loaders/DefaultExtraDataLoader.csv +++ b/src/Loaders/DefaultExtraDataLoader.csv @@ -10,10 +10,10 @@ urbanLowPALPercentage,90,NAF Adultos,0,a ruralPopulation,5.3,NAF Adultos,0,a ruralActivePALPercentage,50,NAF Adultos,0,a ruralLowPALPercentage,50,NAF Adultos,0,a -urbanActivePALValue,1.85,NAF Adultos,1,a -urbanLowPALValue,1.55,NAF Adultos,2,a -ruralActivePALValue,1.95,NAF Adultos,3,a -ruralLowPALValue,1.65,NAF Adultos,4,a +ruralActivePALValue,1.95,NAF Adultos,1,a +ruralLowPALValue,1.65,NAF Adultos,2,a +urbanActivePALValue,1.85,NAF Adultos,3,a +urbanLowPALValue,1.55,NAF Adultos,4,a countryPopulation,3453691,Embarazo y lactancia,0,a 18to29FemaleCountryPopulation,315790,Embarazo y lactancia,0,a 30to59FemaleCountryPopulation,660601,Embarazo y lactancia,0,a diff --git a/src/Loaders/DefaultWeightLoader.csv b/src/Loaders/DefaultWeightLoader.csv index 5c7412ec4b3bc4abca68d76a1c8a5a3a5a767b87..32417a4a434e91331302b8a436ca3905f18dc30d 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 meses,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 meses,9.4,Masculino,Peso por defecto +1 años,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ños,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 meses,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 meses,8.7,Femenino,Peso por defecto +1 años,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ños,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/Loaders/EquationConstantLoader.csv b/src/Loaders/EquationConstantLoader.csv index 616d7b09162f6bf8d6dedc4fff5209140854be83..ded881c07edfb492f00ad6fec26e3704841a8ef7 100644 --- a/src/Loaders/EquationConstantLoader.csv +++ b/src/Loaders/EquationConstantLoader.csv @@ -12,7 +12,7 @@ age,value,parameterType,sex,order,description 60+ años,9.082,TMB,Femenino,0,a 60+ años,658.5,TMB,Femenino,1,a 0 meses,211,Energia para crecimiento,Masculino,2,a -1 mes,183,Energia para crecimiento,Masculino,2,a +1 meses,183,Energia para crecimiento,Masculino,2,a 2 meses,139,Energia para crecimiento,Masculino,2,a 3 meses,53,Energia para crecimiento,Masculino,2,a 4 meses,46,Energia para crecimiento,Masculino,2,a @@ -23,7 +23,7 @@ age,value,parameterType,sex,order,description 9 meses,21,Energia para crecimiento,Masculino,2,a 10 meses,21,Energia para crecimiento,Masculino,2,a 11 meses,22,Energia para crecimiento,Masculino,2,a -1 año,13,Energia para crecimiento,Masculino,3,a +1 años,13,Energia para crecimiento,Masculino,3,a 2 años,12,Energia para crecimiento,Masculino,3,a 3 años,12,Energia para crecimiento,Masculino,3,a 4 años,11,Energia para crecimiento,Masculino,3,a @@ -33,7 +33,7 @@ age,value,parameterType,sex,order,description 8 años,16,Energia para crecimiento,Masculino,3,a 9 años,19,Energia para crecimiento,Masculino,3,a 10 años,22,Energia para crecimiento,Masculino,3,a -11 año,25,Energia para crecimiento,Masculino,3,a +11 años,25,Energia para crecimiento,Masculino,3,a 12 años,29,Energia para crecimiento,Masculino,3,a 13 años,33,Energia para crecimiento,Masculino,3,a 14 años,33,Energia para crecimiento,Masculino,3,a @@ -41,7 +41,7 @@ age,value,parameterType,sex,order,description 16 años,24,Energia para crecimiento,Masculino,3,a 17 años,14,Energia para crecimiento,Masculino,3,a 0 meses,178,Energia para crecimiento,Femenino,2,a -1 mes,161,Energia para crecimiento,Femenino,2,a +1 meses,161,Energia para crecimiento,Femenino,2,a 2 meses,134,Energia para crecimiento,Femenino,2,a 3 meses,68,Energia para crecimiento,Femenino,2,a 4 meses,57,Energia para crecimiento,Femenino,2,a @@ -52,7 +52,7 @@ age,value,parameterType,sex,order,description 9 meses,18,Energia para crecimiento,Femenino,2,a 10 meses,15,Energia para crecimiento,Femenino,2,a 11 meses,14,Energia para crecimiento,Femenino,2,a -1 año,13,Energia para crecimiento,Femenino,3,a +1 años,13,Energia para crecimiento,Femenino,3,a 2 años,13,Energia para crecimiento,Femenino,3,a 3 años,11,Energia para crecimiento,Femenino,3,a 4 años,10,Energia para crecimiento,Femenino,3,a @@ -62,7 +62,7 @@ age,value,parameterType,sex,order,description 8 años,20,Energia para crecimiento,Femenino,3,a 9 años,23,Energia para crecimiento,Femenino,3,a 10 años,25,Energia para crecimiento,Femenino,3,a -11 año,25,Energia para crecimiento,Femenino,3,a +11 años,25,Energia para crecimiento,Femenino,3,a 12 años,26,Energia para crecimiento,Femenino,3,a 13 años,24,Energia para crecimiento,Femenino,3,a 14 años,19,Energia para crecimiento,Femenino,3,a @@ -71,8 +71,8 @@ age,value,parameterType,sex,order,description 17 años,0,Energia para crecimiento,Femenino,3,a 0 meses,-152,GET,Masculino,0,a 0 meses,92.8,GET,Masculino,1,a -1 mes,-152,GET,Masculino,0,a -1 mes,92.8,GET,Masculino,1,a +1 meses,-152,GET,Masculino,0,a +1 meses,92.8,GET,Masculino,1,a 2 meses,-152,GET,Masculino,0,a 2 meses,92.8,GET,Masculino,1,a 3 meses,-152,GET,Masculino,0,a @@ -83,8 +83,8 @@ age,value,parameterType,sex,order,description 5 meses,92.8,GET,Masculino,1,a 0 meses,-152,GET,Femenino,0,a 0 meses,92.8,GET,Femenino,1,a -1 mes,-152,GET,Femenino,0,a -1 mes,92.8,GET,Femenino,1,a +1 meses,-152,GET,Femenino,0,a +1 meses,92.8,GET,Femenino,1,a 2 meses,-152,GET,Femenino,0,a 2 meses,92.8,GET,Femenino,1,a 3 meses,-152,GET,Femenino,0,a @@ -117,9 +117,9 @@ age,value,parameterType,sex,order,description 10 meses,88.6,GET,Femenino,1,a 11 meses,-99.4,GET,Femenino,0,a 11 meses,88.6,GET,Femenino,1,a -1 año,310.2,GET,Masculino,0,a -1 año,63.3,GET,Masculino,1,a -1 año,-0.263,GET,Masculino,2,a +1 años,310.2,GET,Masculino,0,a +1 años,63.3,GET,Masculino,1,a +1 años,-0.263,GET,Masculino,2,a 2 años,310.2,GET,Masculino,0,a 2 años,63.3,GET,Masculino,1,a 2 años,-0.263,GET,Masculino,2,a @@ -147,9 +147,9 @@ age,value,parameterType,sex,order,description 10 años,310.2,GET,Masculino,0,a 10 años,63.3,GET,Masculino,1,a 10 años,-0.263,GET,Masculino,2,a -11 año,310.2,GET,Masculino,0,a -11 año,63.3,GET,Masculino,1,a -11 año,-0.263,GET,Masculino,2,a +11 años,310.2,GET,Masculino,0,a +11 años,63.3,GET,Masculino,1,a +11 años,-0.263,GET,Masculino,2,a 12 años,310.2,GET,Masculino,0,a 12 años,63.3,GET,Masculino,1,a 12 años,-0.263,GET,Masculino,2,a @@ -168,9 +168,9 @@ age,value,parameterType,sex,order,description 17 años,310.2,GET,Masculino,0,a 17 años,63.3,GET,Masculino,1,a 17 años,-0.263,GET,Masculino,2,a -1 año,263.4,GET,Femenino,0,a -1 año,65.3,GET,Femenino,1,a -1 año,-0.454,GET,Femenino,2,a +1 años,263.4,GET,Femenino,0,a +1 años,65.3,GET,Femenino,1,a +1 años,-0.454,GET,Femenino,2,a 2 años,263.4,GET,Femenino,0,a 2 años,65.3,GET,Femenino,1,a 2 años,-0.454,GET,Femenino,2,a @@ -198,9 +198,9 @@ age,value,parameterType,sex,order,description 10 años,263.4,GET,Femenino,0,a 10 años,65.3,GET,Femenino,1,a 10 años,-0.454,GET,Femenino,2,a -11 año,263.4,GET,Femenino,0,a -11 año,65.3,GET,Femenino,1,a -11 año,-0.454,GET,Femenino,2,a +11 años,263.4,GET,Femenino,0,a +11 años,65.3,GET,Femenino,1,a +11 años,-0.454,GET,Femenino,2,a 12 años,263.4,GET,Femenino,0,a 12 años,65.3,GET,Femenino,1,a 12 años,-0.454,GET,Femenino,2,a diff --git a/src/Mappers/ParameterMapper.ts b/src/Mappers/ParameterMapper.ts index 618aba27684426acdaa76ea6edeb0f8132bc7925..bc4be6e102e8b2e7f1b714d4c79e1b547bee98c8 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/Schemas/getRepBody.ts b/src/Schemas/getRepBody.ts new file mode 100644 index 0000000000000000000000000000000000000000..3eeb9e715be29a113683b565b7a70d89b23d6dbe --- /dev/null +++ b/src/Schemas/getRepBody.ts @@ -0,0 +1,98 @@ +const getRepBody = { + type: 'object' as const, + required: ['groups', 'extraData'], + properties: { + groups: { + type: 'array' as const, + items: { + type: 'object' as const, + required: ['age', 'sex', 'medianWeight', 'population'], + properties: { + age: { + type: 'string' as const, + }, + sex: { + type: 'string' as const, + }, + medianWeight: { + type: 'number' as const, + }, + population: { + type: 'number' as const, + }, + }, + }, + }, + extraData: { + type: 'object' as const, + properties: { + minorPAL: { + type: 'object' as const, + required: ['lowPALPrevalence', 'moderatePALPrevalence', 'intensePALPrevalence'], + properties: { + lowPALPrevalence: { + type: 'number' as const, + }, + moderatePALPrevalence: { + type: 'number' as const, + }, + intensePALPrevalence: { + type: 'number' as const, + }, + }, + }, + adultPAL: { + type: 'object' as const, + required: ['urbanPercentage', 'activeUrbanPAL', 'lowUrbanPAL', 'ruralPercentage', 'activeRuralPAL', 'lowRuralPAL'], + properties: { + urbanPercentage: { type: 'number' as const }, + activeUrbanPAL: { type: 'number' as const }, + lowUrbanPAL: { type: 'number' as const }, + ruralPercentage: { type: 'number' as const }, + activeRuralPAL: { type: 'number' as const }, + lowRuralPAL: { type: 'number' as const }, + }, + }, + maternity18To29: { + type: 'object' as const, + properties: { + pregnantWomen: { type: 'number' as const }, + lactatingWomen: { type: 'number' as const }, + countryBirthRate: { type: 'number' as const }, + countryWomenInAgeGroup: { type: 'number' as const }, + countryPopulation: { type: 'number' as const }, + }, + oneOf: [ + { + required: ['pregnantWomen', 'lactatingWomen'], + }, + { + required: ['countryBirthRate', 'countryWomenInAgeGroup', 'countryPopulation'], + }, + ], + }, + maternity30To59: { + type: 'object' as const, + properties: { + pregnantWomen: { type: 'number' as const }, + lactatingWomen: { type: 'number' as const }, + countryBirthRate: { type: 'number' as const }, + countryWomenInAgeGroup: { type: 'number' as const }, + countryPopulation: { type: 'number' as const }, + }, + oneOf: [ + { + required: ['pregnantWomen', 'lactatingWomen'], + }, + { + required: ['countryBirthRate', 'countryWomenInAgeGroup', 'countryPopulation'], + }, + ], + }, + }, + }, + + }, +}; + +export default getRepBody; diff --git a/src/Schemas/updateParameterValueBody.ts b/src/Schemas/updateParameterValueBody.ts new file mode 100644 index 0000000000000000000000000000000000000000..d46e0e29c5c0c28b60a10bdf0166bc1b24acfb1f --- /dev/null +++ b/src/Schemas/updateParameterValueBody.ts @@ -0,0 +1,45 @@ +const updateParameterValueBody = { + type: 'object' as const, + required: ['parameter'], + properties: { + parameter: { + type: 'object' as const, + properties: { + ageRange: { + type: 'string' as const, + }, + sex: { + type: 'string' as const, + }, + id: { + type: 'string' as const, + }, + value: { + type: 'number' as const, + }, + parameterType: { + type: 'string' as const, + }, + order: { + type: 'number' as const, + }, + description: { + type: 'string' as const, + }, + }, + oneOf: [ + { + required: ['parameterType', 'ageRange', 'sex', 'value'], + }, + { + required: ['parameterType', 'id', 'value'], + }, + { + required: ['parameterType', 'ageRange', 'sex', 'order', 'value'], + }, + ], + }, + }, +}; + +export default updateParameterValueBody; diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts index 56dbaeddbcb2be6df22cd3378171c2cae4b49a3e..194cd53ed392969741a397e23e00f4d20bf06ce8 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[] = []; @@ -72,6 +75,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb res.push(constant.value); }); }); + console.log(res); } else { await DefaultExtraData.findAll({ where: { @@ -113,6 +117,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb res.push(constant.value); }); }); + console.log(res); } else { await DefaultExtraData.findAll({ where: { @@ -157,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> => { + await 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> => { + await DefaultWeight.update( + { value: val }, + { + where: { + ageRange: age, + sex: s, + }, + }, + ).catch((err) => { + throw err; + }); +}; + +const updateExtraData = async (identifier: string, val: number): Promise<void> => { + await 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[] = []; diff --git a/src/index.ts b/src/index.ts index 5e1b1eee04d69cecce52553d37150a793119ac69..64303bbe672c2da8da312ef0a534ecdf10cd65b8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,11 @@ /* eslint-disable no-console */ -import express, { Application } from 'express'; +import { ValidationError } from 'express-json-validator-middleware'; +import express, { + Application, + NextFunction, + Request, + Response, +} from 'express'; import 'dotenv/config'; import cors from 'cors'; import swaggerUi from 'swagger-ui-express'; @@ -34,6 +40,18 @@ app.use(express.raw({ app.use(Routes); +app.use((error: Error, request: Request, response: Response, next: NextFunction) => { + // Check the error is a validation error + if (error instanceof ValidationError) { + // TODO: Handle error message accordingly + response.status(400).send(error.validationErrors.body); + next(); + } else { + // Pass error on if not a validation error + next(error); + } +}); + ParameterDataBaseLoader.initParameterDataBase(); app.listen(PORT, (): void => { diff --git a/swagger.yaml b/swagger.yaml index 1adc477fc20beebe342c36d78a08df80e30b3a9f..228a7e12bcb69a3636ab85d3ec34ffcc3bf0629f 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -9,6 +9,7 @@ tags: - name: Auth - name: Parser - name: Calculation + - name: Parameters paths: /login: @@ -63,6 +64,60 @@ paths: description: Bad request. security: - BearerAuth: [] + /parameters: + get: + tags: + - Parameters + summary: Get all parameters + responses: + '200': + description: Ok. + '400': + description: Bad request. + security: + - BearerAuth: [] + /parameters/weights: + post: + tags: + - Parameters + summary: Get all default weights + responses: + '200': + description: Ok. + '400': + description: Bad request. + security: + - BearerAuth: [] + /parameters/extraData: + post: + tags: + - Parameters + summary: Get all extra data + responses: + '200': + description: Ok. + '400': + description: Bad request. + security: + - BearerAuth: [] + /parameters/parameterUpdate: + put: + tags: + - Parameters + summary: Update a certain parameter + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Parameter' + required: true + responses: + '200': + description: Ok. + '400': + description: Bad request. + security: + - BearerAuth: [] components: securitySchemes: BearerAuth: @@ -114,9 +169,9 @@ components: sex: type: string medianWeight: - type: string + type: number population: - type: string + type: number required: - age - sex @@ -197,4 +252,64 @@ components: $ref: '#/components/schemas/ExtraData' required: - groups - - extraData \ No newline at end of file + - extraData + Parameter: + properties: + parameter: + oneOf: + - $ref: '#/components/schemas/WeightParameter' + - $ref: '#/components/schemas/ExtraDataParameter' + - $ref: '#/components/schemas/EquationConstantParameter' + WeightParameter: + properties: + parameterType: + type: string + ageRange: + type: string + sex: + type: string + value: + type: number + required: + - parameterType + - ageRange + - sex + - value + ExtraDataParameter: + properties: + parameterType: + type: string + id: + type: string + value: + type: number + description: + type: string + required: + - parameterType + - id + - value + EquationConstantParameter: + properties: + parameterType: + type: string + ageRange: + type: string + sex: + type: string + order: + type: number + value: + type: number + description: + type: string + required: + - parameterType + - ageRange + - sex + - order + - value + + + + \ No newline at end of file