From 78cee39ca9d51f052676f313c57e4783c5ac6e81 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sat, 2 Jan 2021 22:40:47 +0100 Subject: [PATCH] Add BMR formula --- src/config/activities.js | 11 +++++++++++ src/config/genders.js | 8 ++++++++ src/config/goals.js | 7 +++++++ src/controllers/meal.controller.js | 4 ++-- src/controllers/product.controller.js | 2 +- src/routes/v1/profile.route.js | 2 +- src/services/meal.service.js | 2 +- src/services/profile.service.js | 7 ++++++- src/utils/birthdayToAge.js | 4 ++++ src/utils/dailyCaloricRequirement.js | 23 +++++++++++++++++++++++ src/utils/weeksToGetGoalWeight.js | 8 ++++++++ src/validations/profile.validation.js | 15 +++++++++------ 12 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 src/config/activities.js create mode 100644 src/config/genders.js create mode 100644 src/config/goals.js create mode 100644 src/utils/birthdayToAge.js create mode 100644 src/utils/dailyCaloricRequirement.js create mode 100644 src/utils/weeksToGetGoalWeight.js diff --git a/src/config/activities.js b/src/config/activities.js new file mode 100644 index 0000000..500674d --- /dev/null +++ b/src/config/activities.js @@ -0,0 +1,11 @@ +const activityTypes = { + veryLow: 1.2, + low: 1.375, + medium: 1.55, + high: 1.725, + veryHigh: 1.9, +}; + +module.exports = { + activityTypes, +}; diff --git a/src/config/genders.js b/src/config/genders.js new file mode 100644 index 0000000..63cde35 --- /dev/null +++ b/src/config/genders.js @@ -0,0 +1,8 @@ +const genderTypes = { + male: 'male', + female: 'female', +} + +module.exports = { + genderTypes +} diff --git a/src/config/goals.js b/src/config/goals.js new file mode 100644 index 0000000..7778c93 --- /dev/null +++ b/src/config/goals.js @@ -0,0 +1,7 @@ +const goalTypes = { + loseWeight: 'lose_weight', + maintainWeight: 'maintain_weight', + putOnWeight: 'put_on_weight', +}; + +module.exports = { goalTypes }; diff --git a/src/controllers/meal.controller.js b/src/controllers/meal.controller.js index 37525f1..362e8b6 100644 --- a/src/controllers/meal.controller.js +++ b/src/controllers/meal.controller.js @@ -11,8 +11,8 @@ const createMeal = catchAsync(async (req, res) => { }); const getMeals = catchAsync(async (req, res) => { - const result = await mealService.getMealsByDate(req.user._id, req.query.date); - res.send(result); + const meals = await mealService.getMealsByDate(req.user._id, req.query.date); + res.send(meals); }); const getAllMeals = catchAsync(async (req, res) => { diff --git a/src/controllers/product.controller.js b/src/controllers/product.controller.js index 7236a64..5ad5ac1 100644 --- a/src/controllers/product.controller.js +++ b/src/controllers/product.controller.js @@ -17,7 +17,7 @@ const getProducts = catchAsync(async (req, res) => { }); const getProduct = catchAsync(async (req, res) => { - const product = await productService.getProduct(req.params.productId); + const product = await productService.getProductById(req.params.productId); if (!product) { throw new ApiError(httpStatus.NOT_FOUND, 'Product not found'); } diff --git a/src/routes/v1/profile.route.js b/src/routes/v1/profile.route.js index 26b492f..f6baa13 100644 --- a/src/routes/v1/profile.route.js +++ b/src/routes/v1/profile.route.js @@ -9,7 +9,7 @@ const router = express.Router(); router .route('/') .post(auth(), validate(profileValidation.createProfile), profileController.createProfile) -.get(auth(), validate(profileValidation.getProfile), profileController.getProfile) + .get(auth(), validate(profileValidation.getProfile), profileController.getProfile) .patch(auth(), validate(profileValidation.updateProfile), profileController.updateProfile) .delete(auth(), validate(profileValidation.deleteProfile), profileController.deleteProfile); diff --git a/src/services/meal.service.js b/src/services/meal.service.js index e031187..ce6785f 100644 --- a/src/services/meal.service.js +++ b/src/services/meal.service.js @@ -19,7 +19,7 @@ const getMealsByDate = async (userId, date) => { $gte: new Date(new Date(date).setHours(0, 0, 0)), $lt: new Date(new Date(date).setHours(23, 59, 59)), }, - }); + }).populate('products.product'); return meals; }; diff --git a/src/services/profile.service.js b/src/services/profile.service.js index e5cfcb3..1c78bda 100644 --- a/src/services/profile.service.js +++ b/src/services/profile.service.js @@ -1,6 +1,8 @@ const httpStatus = require('http-status'); const { Profile } = require('../models'); const ApiError = require('../utils/ApiError'); +const calculateWeeksToGetGoalWeight = require('../utils/weeksToGetGoalWeight'); +const dailyCaloricRequirement = require('../utils/dailyCaloricRequirement'); const createProfile = async (profileBody) => { if (await Profile.hasUser(profileBody.userId)) { @@ -16,7 +18,10 @@ const queryProfiles = async (filter, options) => { }; const getProfileById = async (id) => { - return Profile.findById(id); + const profile = await Profile.findById(id); + console.log(dailyCaloricRequirement(profile)); + console.log(calculateWeeksToGetGoalWeight(profile)); + return profile }; const getProfileByUserId = async (userId) => { diff --git a/src/utils/birthdayToAge.js b/src/utils/birthdayToAge.js new file mode 100644 index 0000000..bf55eac --- /dev/null +++ b/src/utils/birthdayToAge.js @@ -0,0 +1,4 @@ + +const birthdayToAge = (birthday) => Math.floor((new Date() - new Date(birthday).getTime()) / 3.15576e10); + +module.exports = birthdayToAge; diff --git a/src/utils/dailyCaloricRequirement.js b/src/utils/dailyCaloricRequirement.js new file mode 100644 index 0000000..ed982ce --- /dev/null +++ b/src/utils/dailyCaloricRequirement.js @@ -0,0 +1,23 @@ +const birthdayToAge = require('./birthdayToAge'); +const { genderTypes } = require('../config/genders'); +const { goalTypes } = require('../config/goals'); + +const calculateDailyCaloricRequirementFoWomen = ({ age, currentWeight, height, activity, extraCalories }) => + Math.round((655 + (9.6 * currentWeight) + (1.8 * height) - (4.7 * age)) * activity + extraCalories) + + +const calculateDailyCaloricRequirementFoMen = ({ age, currentWeight, height, activity, extraCalories }) => + Math.round((66 + (13.7 * currentWeight) + (5 * height) - (6.8 * age)) * activity + extraCalories) + +const calculateDailyCaloricRequirement = ({ gender, goal, birthday, height, currentWeight, rateOfChange, activity }) => { + const age = birthdayToAge(birthday); + + const extraCalories = (goal === goalTypes.putOnWeight ? rateOfChange : -rateOfChange) * 100; + + const dailyCaloricRequirement = + gender === genderTypes.male ? calculateDailyCaloricRequirementFoMen : calculateDailyCaloricRequirementFoWomen; + + return dailyCaloricRequirement({ age, currentWeight, height, activity, extraCalories }); +}; + +module.exports = calculateDailyCaloricRequirement; diff --git a/src/utils/weeksToGetGoalWeight.js b/src/utils/weeksToGetGoalWeight.js new file mode 100644 index 0000000..064d342 --- /dev/null +++ b/src/utils/weeksToGetGoalWeight.js @@ -0,0 +1,8 @@ + +const calculateWeeksToGetGoalWeight = ({ currentWeight, goalWeight, rateOfChange }) => { + const weightsDifference = Math.abs(goalWeight - currentWeight); + const weeksToGetGoalWeight = Math.round(weightsDifference / rateOfChange); + return weeksToGetGoalWeight; +}; + +module.exports = calculateWeeksToGetGoalWeight; diff --git a/src/validations/profile.validation.js b/src/validations/profile.validation.js index ceff19f..c7d6fc1 100644 --- a/src/validations/profile.validation.js +++ b/src/validations/profile.validation.js @@ -1,16 +1,19 @@ const Joi = require('joi'); const { objectId } = require('./custom.validation'); +const { genderTypes } = require('../config/genders'); +const { goalTypes } = require('../config/goals'); +const { activityTypes } = require('../config/activities'); const createProfile = { body: Joi.object().keys({ - gender: Joi.string().required().valid('male', 'female'), - goal: Joi.string().required().valid('lose_weight', 'maintain_weight', 'put_on_weight'), + gender: Joi.string().required().valid(Object.values(genderTypes)), + goal: Joi.string().required().valid(Object.values(goalTypes)), birthday: Joi.date().required(), height: Joi.number().required(), currentWeight: Joi.number().required(), goalWeight: Joi.number().required(), rateOfChange: Joi.number().required(), - activity: Joi.number().required().valid(1.2, 1.375, 1.55, 1.725, 1.9), + activity: Joi.number().required().valid(Object.values(activityTypes)), }), }; @@ -33,14 +36,14 @@ const updateProfile = { profileId: Joi.required().custom(objectId), }), body: Joi.object().keys({ - gender: Joi.string().required().valid('male', 'female'), - goal: Joi.string().required().valid('lose_weight', 'maintain_weight', 'put_on_weight'), + gender: Joi.string().required().valid(Object.values(genderTypes)), + goal: Joi.string().required().valid(Object.values(goalTypes)), birthday: Joi.date().required(), height: Joi.number().required(), currentWeight: Joi.number().required(), goalWeight: Joi.number().required(), rateOfChange: Joi.number(), - activity: Joi.number().required().valid(1.2, 1.375, 1.55, 1.725, 1.9), + activity: Joi.number().required().valid(Object.values(activityTypes)), }).min(1), };