diff --git a/.env b/.env index 784b4784427a9bc7625979c2e21182b4aeffbd80..095e0d47bc9135bffdc9f69d5b424a9bc666219a 100644 --- a/.env +++ b/.env @@ -4,4 +4,4 @@ HOST=localhost USER=developer PASSWORD=password DB=core_database_test -AUTH_BASE_URL=localhost:7998/users \ No newline at end of file +AUTH_BASE_URL=http://localhost:4000/users \ No newline at end of file diff --git a/src/Controllers/ParameterController.ts b/src/Controllers/ParameterController.ts index 1889a34d6a1697dc7700ab56caf1a4b6092a4528..c15ca265dbd493d41d627263f10a00282ee3422d 100644 --- a/src/Controllers/ParameterController.ts +++ b/src/Controllers/ParameterController.ts @@ -36,8 +36,8 @@ const getDefaultWeights: Handler = async (req: Request, res: Response) => { const getDefaultExtraData: Handler = async (req: Request, res: Response) => { try { - const weights = await ParameterService.getDefaultExtraData(); - return res.status(200).send(weights); + const extraData = await ParameterService.getDefaultExtraData(); + return res.status(200).send(extraData); } catch (error) { const e = error as Error; logger.info(e.message); @@ -58,9 +58,13 @@ const updateParameterValue: Handler = async (req: Request, res: Response) => { await ParameterService.updateExtraData(parameters); break; case ParameterType.TEE: + await ParameterService.updateTEE(parameters); + break; case ParameterType.BMR: + await ParameterService.updateBMR(parameters); + break; case ParameterType.GrowthEnergy: - await ParameterService.updateEquationConstant(parameters[0]); + await ParameterService.updateGrowthEnergy(parameters[0]); break; default: break; @@ -75,8 +79,8 @@ const updateParameterValue: Handler = async (req: Request, res: Response) => { }; router.get('/', getParameters); -router.post('/weights/', getDefaultWeights); -router.post('/extraData/', getDefaultExtraData); +router.get('/weights/', getDefaultWeights); +router.get('/extraData/', getDefaultExtraData); router.put('/parameterUpdate/', validate({ body: updateParameterValueBody }), updateParameterValue); export default router; diff --git a/src/Models/DefaultExtraData.ts b/src/Models/DefaultExtraData.ts index 2114155acff341cccff7e02478f7ab3fa1edb23f..171398d4cc63abbec5855b71c281c6f3c3b4a5d2 100644 --- a/src/Models/DefaultExtraData.ts +++ b/src/Models/DefaultExtraData.ts @@ -20,7 +20,7 @@ DefaultExtraData.init( primaryKey: true, }, parameterType: DataTypes.STRING, - value: DataTypes.FLOAT, + value: DataTypes.FLOAT(25), order: DataTypes.INTEGER, description: DataTypes.STRING, }, diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts index 85e69c0f27fab6e8012e737f4658af6e9c5af7dd..06290043fca28b3d5374e82091b7a7d916296e72 100644 --- a/src/Services/ParameterService.ts +++ b/src/Services/ParameterService.ts @@ -196,7 +196,7 @@ const getParameters = async (): Promise<ParameterWrapperDTO> => { return res; }; -const updateEquationConstant = async (parameter: EquationConstantDTO): Promise<void> => { +const updateGrowthEnergy = async (parameter: EquationConstantDTO): Promise<void> => { await EquationConstant.update( { value: parameter.value }, { @@ -204,13 +204,335 @@ const updateEquationConstant = async (parameter: EquationConstantDTO): Promise<v ageRange: parameter.ageRange, sex: parameter.sex, order: parameter.order, + parameterType: parameter.parameterType, }, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); }; +const updateBMR = async (parameters: EquationConstantDTO[]): Promise<void> => { + const sexo: string = parameters[0].sex; + const edad: string = parameters[0].ageRange; + const orders: number[] = []; + parameters.forEach((parameter) => { + if (parameter.sex !== sexo || parameter.ageRange !== edad) { + throw new Error('Parameters sex and age must be the same for all array items.'); + } + if (orders.includes(parameter.order)) { + throw new Error('Order must be different for all array items.'); + } + orders.push(parameter.order); + }); + switch (parameters[0].ageRange) { + case AgeBracket.a18_29: { + await EquationConstant.update( + { value: parameters[0].value }, + { + where: { + ageRange: parameters[0].ageRange, + sex: parameters[0].sex, + order: parameters[0].order, + parameterType: parameters[0].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[1].value }, + { + where: { + ageRange: parameters[1].ageRange, + sex: parameters[1].sex, + order: parameters[1].order, + parameterType: parameters[1].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + break; + } + case AgeBracket.a30_59: { + await EquationConstant.update( + { value: parameters[0].value }, + { + where: { + ageRange: parameters[0].ageRange, + sex: parameters[0].sex, + order: parameters[0].order, + parameterType: parameters[0].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[1].value }, + { + where: { + ageRange: parameters[1].ageRange, + sex: parameters[1].sex, + order: parameters[1].order, + parameterType: parameters[1].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + break; + } + case AgeBracket.a60: { + await EquationConstant.update( + { value: parameters[0].value }, + { + where: { + ageRange: parameters[0].ageRange, + sex: parameters[0].sex, + order: parameters[0].order, + parameterType: parameters[0].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[1].value }, + { + where: { + ageRange: parameters[1].ageRange, + sex: parameters[1].sex, + order: parameters[1].order, + parameterType: parameters[1].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + break; + } + default: { + throw new Error(`Age range ${parameters[0].ageRange} does not have BMR constants.`); + } + } +}; + +const updateTEE = async (parameters: EquationConstantDTO[]): Promise<void> => { + const sexo: string = parameters[0].sex; + const edad: string = parameters[0].ageRange; + const orders: number[] = []; + parameters.forEach((parameter) => { + if (parameter.sex !== sexo || parameter.ageRange !== edad) { + throw new Error('Parameters sex and age must be the same for all array items.'); + } + if (orders.includes(parameter.order)) { + throw new Error('Order must be different for all array items.'); + } + orders.push(parameter.order); + }); + switch (parameters[0].ageRange) { + case AgeBracket.m0: + case AgeBracket.m1: + case AgeBracket.m2: + case AgeBracket.m3: + case AgeBracket.m4: + case AgeBracket.m5: { + for (let i = 0; i <= 5; i += 1) { + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[0].value }, + { + where: { + ageRange: `${i} meses`, + order: parameters[0].order, + parameterType: parameters[0].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[1].value }, + { + where: { + ageRange: `${i} meses`, + order: parameters[1].order, + parameterType: parameters[1].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + } + break; + } + case AgeBracket.m6: + case AgeBracket.m7: + case AgeBracket.m8: + case AgeBracket.m9: + case AgeBracket.m10: + case AgeBracket.m11: { + for (let i = 6; i <= 11; i += 1) { + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[0].value }, + { + where: { + ageRange: `${i} meses`, + order: parameters[0].order, + parameterType: parameters[0].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[1].value }, + { + where: { + ageRange: `${i} meses`, + order: parameters[1].order, + parameterType: parameters[1].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + } + break; + } + case AgeBracket.a1: + case AgeBracket.a2: + case AgeBracket.a3: + case AgeBracket.a4: + case AgeBracket.a5: + case AgeBracket.a6: + case AgeBracket.a7: + case AgeBracket.a8: + case AgeBracket.a9: + case AgeBracket.a10: + case AgeBracket.a11: + case AgeBracket.a12: + case AgeBracket.a13: + case AgeBracket.a14: + case AgeBracket.a15: + case AgeBracket.a16: + case AgeBracket.a17: { + for (let i = 1; i <= 17; i += 1) { + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[0].value }, + { + where: { + ageRange: `${i} años`, + sex: parameters[0].sex, + order: parameters[0].order, + parameterType: parameters[0].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[1].value }, + { + where: { + ageRange: `${i} años`, + sex: parameters[1].sex, + order: parameters[1].order, + parameterType: parameters[1].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + // eslint-disable-next-line no-await-in-loop + await EquationConstant.update( + { value: parameters[2].value }, + { + where: { + ageRange: `${i} años`, + sex: parameters[2].sex, + order: parameters[2].order, + parameterType: parameters[2].parameterType, + }, + }, + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { + throw err; + }); + } + break; + } + default: { + throw new Error(`Age range ${parameters[0].ageRange} does not have TEE constants.`); + } + } +}; + const updateDefaultWeight = async (parameter: DefaultWeightDTO): Promise<void> => { await DefaultWeight.update( { value: parameter.value }, @@ -218,9 +540,14 @@ const updateDefaultWeight = async (parameter: DefaultWeightDTO): Promise<void> = where: { ageRange: parameter.ageRange, sex: parameter.sex, + parameterType: parameter.parameterType, }, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); }; @@ -233,9 +560,15 @@ const updatePercentage = async (params: DefaultExtraDataDTO[], total: number): P { where: { id: params[0].id, + parameterType: params[0].parameterType, }, + returning: true, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); await DefaultExtraData.update( @@ -243,9 +576,15 @@ const updatePercentage = async (params: DefaultExtraDataDTO[], total: number): P { where: { id: params[1].id, + parameterType: params[1].parameterType, }, + returning: true, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); await DefaultExtraData.update( @@ -253,13 +592,19 @@ const updatePercentage = async (params: DefaultExtraDataDTO[], total: number): P { where: { id: params[2].id, + parameterType: params[2].parameterType, }, + returning: true, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); } else { - throw new Error('These percentages must add up to 100'); + throw new Error('These percentages must add up to 100.'); } }; @@ -269,9 +614,14 @@ const updatePair = async (param: DefaultExtraDataDTO, pairID: string): Promise<v { where: { id: param.id, + parameterType: param.parameterType, }, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); await DefaultExtraData.update( @@ -279,9 +629,14 @@ const updatePair = async (param: DefaultExtraDataDTO, pairID: string): Promise<v { where: { id: pairID, + parameterType: param.parameterType, }, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); }; @@ -307,9 +662,13 @@ const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void> if (ids.includes(extraDataIDs.minLowPrev)) { if (ids.includes(extraDataIDs.minModPrev) && ids.includes(extraDataIDs.minIntPrev)) { - await updatePercentage(parameters, total); + if (ids.length === 3) { + await updatePercentage(parameters, total); + } else { + throw new Error('Too many parameters sent.'); + } } else { - throw new Error('Missing parameter for update'); + throw new Error('Missing parameter for update.'); } } else if (ids.includes(extraDataIDs.urbPopPerc)) { await updatePair(parameters[0], extraDataIDs.rurPopPerc); @@ -329,13 +688,19 @@ const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void> { where: { id: parameters[0].id, + parameterType: parameters[0].parameterType, }, + returning: true, }, - ).catch((err) => { + ).then((result) => { + if (result[0] === 0) { + throw new Error('No rows were updated.'); + } + }).catch((err) => { throw err; }); } else { - throw new Error('Invalid parameter ID'); + throw new Error('Invalid parameter ID.'); } }; @@ -344,7 +709,9 @@ export default { getDefaultWeights, getDefaultExtraData, getParameters, - updateEquationConstant, updateDefaultWeight, updateExtraData, + updateTEE, + updateBMR, + updateGrowthEnergy, }; diff --git a/swagger.yaml b/swagger.yaml index ebfacb136c61c2c2e41c54be04be58b14549b510..07161ac1beff8bb7b2b061a521b7cb5527c35b90 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -104,7 +104,7 @@ paths: put: tags: - Parameters - summary: Update a certain parameter + summary: Update a certain parameter. The array contains exactly one item, unless the parameters to be updated are a trio, in which case all three parameters must be included, or have the TEE/BMR parameter type in which case all equation constants must be included. requestBody: content: application/json: