Skip to content
Snippets Groups Projects
Commit f9525c2b authored by Agustin's avatar Agustin
Browse files

Many important changes, read description

getDefaultWeights/ExtraData are now GET instead of POST.
updateParameterValue has changed the way it receives parameters, see swagger documentation, which has been updated.
 (fefo you have been warned)

default extra data model has been changed to allow bigger values.
updateEquationConstants was split into 3 functions, to accomodate each possible parameter type.
an error is now returned if no rows are affected by an update.
parent bf9f507f
No related branches found
No related tags found
No related merge requests found
......@@ -35,8 +35,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);
......@@ -57,9 +57,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;
......@@ -73,8 +77,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;
......@@ -20,7 +20,7 @@ DefaultExtraData.init(
primaryKey: true,
},
parameterType: DataTypes.STRING,
value: DataTypes.FLOAT,
value: DataTypes.FLOAT(25),
order: DataTypes.INTEGER,
description: DataTypes.STRING,
},
......
......@@ -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;
});
};
......@@ -310,10 +665,10 @@ const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void>
if (ids.length === 3) {
await updatePercentage(parameters, total);
} else {
throw new Error('Too many parameters sent');
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);
......@@ -333,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.');
}
};
......@@ -348,7 +709,9 @@ export default {
getDefaultWeights,
getDefaultExtraData,
getParameters,
updateEquationConstant,
updateDefaultWeight,
updateExtraData,
updateTEE,
updateBMR,
updateGrowthEnergy,
};
......@@ -104,7 +104,7 @@ paths:
put:
tags:
- Parameters
summary: Update a certain parameter. The array should contain exactly one item, unless the parameters to be updated are a trio, in which case all three parameters should be included.
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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment