Spaces:
Running
Running
Hozifa Elgharbawy
commited on
Commit
·
bb3dc70
1
Parent(s):
adcab3a
update
Browse files- src/common/enums/meal-type.enum.ts +0 -2
- src/common/serializers/meal-plan.serialization.ts +2 -2
- src/common/serializers/meal-planPopulate.serialization.ts +36 -2
- src/common/serializers/user-registered-meal-planPopulate.serialization.ts +33 -0
- src/modules/users/modules/home/controllers/home-nutriguide.controller.ts +72 -1
- src/modules/users/modules/meal-plans/controller/meal-plans.controller.ts +4 -9
- src/modules/users/modules/user-registered-meal-plans/controller/user-registered-meal-plans.controller.ts +5 -5
- src/modules/users/modules/user-registered-meal-plans/services/user-registered-meal-plans.service.ts +26 -1
- src/resources/meals.json +0 -0
- src/resources/meals1.json +0 -0
- src/resources/meals2.json +0 -0
- src/seeder/seeders/10-mealPlan.seeder.ts +32 -4
src/common/enums/meal-type.enum.ts
CHANGED
|
@@ -3,7 +3,5 @@ export enum MealType {
|
|
| 3 |
DINNER = "dinner",
|
| 4 |
SNACKS = "snacks",
|
| 5 |
DRINKS_BEVERAGES = 'drinks beverages',
|
| 6 |
-
CUSINES = 'cusines',
|
| 7 |
LUNCH = "lunch",
|
| 8 |
-
BREAKFAST_DINNER= "breakfast, dinner"
|
| 9 |
}
|
|
|
|
| 3 |
DINNER = "dinner",
|
| 4 |
SNACKS = "snacks",
|
| 5 |
DRINKS_BEVERAGES = 'drinks beverages',
|
|
|
|
| 6 |
LUNCH = "lunch",
|
|
|
|
| 7 |
}
|
src/common/serializers/meal-plan.serialization.ts
CHANGED
|
@@ -15,8 +15,8 @@ class MealPlanDays {
|
|
| 15 |
|
| 16 |
class MealPlanKeyFeatures {
|
| 17 |
@Expose()
|
| 18 |
-
@SwaggerResponseProperty({ type: "
|
| 19 |
-
|
| 20 |
|
| 21 |
@Expose({ name: "description" })
|
| 22 |
@SwaggerResponseProperty({ type: "string" })
|
|
|
|
| 15 |
|
| 16 |
class MealPlanKeyFeatures {
|
| 17 |
@Expose()
|
| 18 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 19 |
+
title: string;
|
| 20 |
|
| 21 |
@Expose({ name: "description" })
|
| 22 |
@SwaggerResponseProperty({ type: "string" })
|
src/common/serializers/meal-planPopulate.serialization.ts
CHANGED
|
@@ -16,8 +16,8 @@ class MealPlanDaysPopulate {
|
|
| 16 |
|
| 17 |
class MealPlanKeyFeaturesPopulate {
|
| 18 |
@Expose()
|
| 19 |
-
@SwaggerResponseProperty({ type: "
|
| 20 |
-
|
| 21 |
|
| 22 |
@Expose({ name: "description" })
|
| 23 |
@SwaggerResponseProperty({ type: "string" })
|
|
@@ -63,4 +63,38 @@ export class MealPlanPopulateSerialization {
|
|
| 63 |
)
|
| 64 |
days: any;
|
| 65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
}
|
|
|
|
| 16 |
|
| 17 |
class MealPlanKeyFeaturesPopulate {
|
| 18 |
@Expose()
|
| 19 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 20 |
+
title: string;
|
| 21 |
|
| 22 |
@Expose({ name: "description" })
|
| 23 |
@SwaggerResponseProperty({ type: "string" })
|
|
|
|
| 63 |
)
|
| 64 |
days: any;
|
| 65 |
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
export class ListMealPlanSerialization {
|
| 69 |
+
@Expose({ name: "_id" })
|
| 70 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 71 |
+
id: string;
|
| 72 |
+
|
| 73 |
+
@Expose()
|
| 74 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 75 |
+
image: string;
|
| 76 |
+
|
| 77 |
+
@Expose()
|
| 78 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 79 |
+
description: string;
|
| 80 |
+
|
| 81 |
+
@Expose()
|
| 82 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 83 |
+
duration: string;
|
| 84 |
+
|
| 85 |
+
@Expose()
|
| 86 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 87 |
+
level: string;
|
| 88 |
+
|
| 89 |
+
@Expose()
|
| 90 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 91 |
+
your_journey: string;
|
| 92 |
+
|
| 93 |
+
@Expose({ name: "key_features" })
|
| 94 |
+
@SwaggerResponseProperty({ type: [MealPlanKeyFeaturesPopulate] })
|
| 95 |
+
@Transform(
|
| 96 |
+
({ value }) => serialize(value, MealPlanKeyFeaturesPopulate)
|
| 97 |
+
)
|
| 98 |
+
key_features: any;
|
| 99 |
+
|
| 100 |
}
|
src/common/serializers/user-registered-meal-planPopulate.serialization.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
| 1 |
import { Expose, Transform } from "class-transformer";
|
| 2 |
import { serialize } from "@helpers/serialize";
|
| 3 |
import { SwaggerResponseProperty } from "@lib/decorators/swagger-response-property.decorator";
|
|
|
|
| 4 |
import { MealSerialization } from "./meal.serialization";
|
| 5 |
import { MealPlanSerialization } from "./meal-plan.serialization";
|
| 6 |
|
|
@@ -13,6 +14,9 @@ class MealDaysPopulate {
|
|
| 13 |
|
| 14 |
@Expose({ name: "meals" })
|
| 15 |
@SwaggerResponseProperty({ type: [MealSerialization] })
|
|
|
|
|
|
|
|
|
|
| 16 |
meals: any;
|
| 17 |
|
| 18 |
@Expose()
|
|
@@ -32,6 +36,35 @@ export class UserRegisteredMealPlansPopulateSerialization {
|
|
| 32 |
|
| 33 |
@Expose()
|
| 34 |
@SwaggerResponseProperty({ type: MealPlanSerialization })
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
meal_plan: string;
|
| 36 |
|
| 37 |
@Expose()
|
|
|
|
| 1 |
import { Expose, Transform } from "class-transformer";
|
| 2 |
import { serialize } from "@helpers/serialize";
|
| 3 |
import { SwaggerResponseProperty } from "@lib/decorators/swagger-response-property.decorator";
|
| 4 |
+
import { ListMealPlanSerialization } from "./meal-planPopulate.serialization";
|
| 5 |
import { MealSerialization } from "./meal.serialization";
|
| 6 |
import { MealPlanSerialization } from "./meal-plan.serialization";
|
| 7 |
|
|
|
|
| 14 |
|
| 15 |
@Expose({ name: "meals" })
|
| 16 |
@SwaggerResponseProperty({ type: [MealSerialization] })
|
| 17 |
+
@Transform(
|
| 18 |
+
({ value }) => serialize(value, MealSerialization)
|
| 19 |
+
)
|
| 20 |
meals: any;
|
| 21 |
|
| 22 |
@Expose()
|
|
|
|
| 36 |
|
| 37 |
@Expose()
|
| 38 |
@SwaggerResponseProperty({ type: MealPlanSerialization })
|
| 39 |
+
@Transform(
|
| 40 |
+
({ value }) => serialize(value, MealPlanSerialization)
|
| 41 |
+
)
|
| 42 |
+
meal_plan: string;
|
| 43 |
+
|
| 44 |
+
@Expose()
|
| 45 |
+
@SwaggerResponseProperty({ type: "boolean" })
|
| 46 |
+
isActive: boolean;
|
| 47 |
+
|
| 48 |
+
@Expose({ name: "days" })
|
| 49 |
+
@SwaggerResponseProperty({ type: [MealDaysPopulate] })
|
| 50 |
+
@Transform(
|
| 51 |
+
({ value }) => serialize(value, MealDaysPopulate)
|
| 52 |
+
)
|
| 53 |
+
days: any;
|
| 54 |
+
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
export class GetMyMealPlanSerialization {
|
| 58 |
+
@Expose({ name: "_id" })
|
| 59 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 60 |
+
id: string;
|
| 61 |
+
|
| 62 |
+
@Expose()
|
| 63 |
+
@SwaggerResponseProperty({ type: "string" })
|
| 64 |
+
user: string;
|
| 65 |
+
|
| 66 |
+
@Expose()
|
| 67 |
+
@SwaggerResponseProperty({ type: ListMealPlanSerialization })
|
| 68 |
meal_plan: string;
|
| 69 |
|
| 70 |
@Expose()
|
src/modules/users/modules/home/controllers/home-nutriguide.controller.ts
CHANGED
|
@@ -6,26 +6,97 @@ import { Controller } from "@lib/decorators/controller.decorator";
|
|
| 6 |
import { serialize } from "@helpers/serialize";
|
| 7 |
import { ControllerMiddleware } from "@lib/decorators/controller-middleware.decorator";
|
| 8 |
import { UsersGuardMiddleware } from "modules/users/common/guards/users.guard";
|
| 9 |
-
import { SwaggerGet } from "@lib/decorators/swagger-routes.decorator";
|
| 10 |
import { SwaggerSummary } from "@lib/decorators/swagger-summary.decorator";
|
| 11 |
import { SwaggerDescription } from "@lib/decorators/swagger-description.decorator";
|
| 12 |
import { SwaggerResponse } from "@lib/decorators/swagger-response.decorator";
|
|
|
|
| 13 |
import { UserHomeService } from "../services/user-home.service";
|
| 14 |
import { IUserRequest } from "@common/interfaces/user-request.interface";
|
| 15 |
import { UserHomeYourDailyIntakeSerialization } from "../responses/user-home-your-daily-intake.serialization";
|
| 16 |
import { UserNutriHomeDailyGoalsSerialization } from "../responses/user-nutri-home-daily-goals.serialization";
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
|
| 19 |
@Controller("/user/nutri-guide")
|
| 20 |
@ControllerMiddleware(UsersGuardMiddleware())
|
| 21 |
export class homeNutriGuideController extends BaseController {
|
| 22 |
private userHomeService = new UserHomeService();
|
|
|
|
| 23 |
|
| 24 |
setRoutes(): void {
|
| 25 |
this.router.get("/todays-intake", asyncHandler(this.getHomePageYourDailyIntake));
|
| 26 |
this.router.get("/daily-goals", asyncHandler(this.getHomePageDailyGoals));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
}
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
@SwaggerGet('/todays-intake')
|
| 31 |
@SwaggerResponse(UserHomeYourDailyIntakeSerialization)
|
|
|
|
| 6 |
import { serialize } from "@helpers/serialize";
|
| 7 |
import { ControllerMiddleware } from "@lib/decorators/controller-middleware.decorator";
|
| 8 |
import { UsersGuardMiddleware } from "modules/users/common/guards/users.guard";
|
| 9 |
+
import { SwaggerGet, SwaggerPatch } from "@lib/decorators/swagger-routes.decorator";
|
| 10 |
import { SwaggerSummary } from "@lib/decorators/swagger-summary.decorator";
|
| 11 |
import { SwaggerDescription } from "@lib/decorators/swagger-description.decorator";
|
| 12 |
import { SwaggerResponse } from "@lib/decorators/swagger-response.decorator";
|
| 13 |
+
import { SwaggerQuery } from "@lib/decorators/swagger-query.decorator";
|
| 14 |
import { UserHomeService } from "../services/user-home.service";
|
| 15 |
import { IUserRequest } from "@common/interfaces/user-request.interface";
|
| 16 |
import { UserHomeYourDailyIntakeSerialization } from "../responses/user-home-your-daily-intake.serialization";
|
| 17 |
import { UserNutriHomeDailyGoalsSerialization } from "../responses/user-nutri-home-daily-goals.serialization";
|
| 18 |
+
import { UserRegisteredMealPlansPopulateSerialization } from "@common/serializers/user-registered-meal-planPopulate.serialization";
|
| 19 |
+
import { UserRegisteredMealPlansService } from "../../user-registered-meal-plans/services/user-registered-meal-plans.service";
|
| 20 |
+
import { SwaggerRequest } from "@lib/decorators/swagger-request.decorator";
|
| 21 |
|
| 22 |
|
| 23 |
@Controller("/user/nutri-guide")
|
| 24 |
@ControllerMiddleware(UsersGuardMiddleware())
|
| 25 |
export class homeNutriGuideController extends BaseController {
|
| 26 |
private userHomeService = new UserHomeService();
|
| 27 |
+
private userRegisteredMealPlansService = new UserRegisteredMealPlansService();
|
| 28 |
|
| 29 |
setRoutes(): void {
|
| 30 |
this.router.get("/todays-intake", asyncHandler(this.getHomePageYourDailyIntake));
|
| 31 |
this.router.get("/daily-goals", asyncHandler(this.getHomePageDailyGoals));
|
| 32 |
+
this.router.get("/today-meals", asyncHandler(this.getTodayMeals));
|
| 33 |
+
this.router.patch(
|
| 34 |
+
"/:id/progress/:day",
|
| 35 |
+
asyncHandler(this.updateProgress)
|
| 36 |
+
);
|
| 37 |
}
|
| 38 |
|
| 39 |
+
@SwaggerGet("/today-meals")
|
| 40 |
+
@SwaggerResponse(UserRegisteredMealPlansPopulateSerialization)
|
| 41 |
+
@SwaggerSummary("Get today's meals")
|
| 42 |
+
@SwaggerDescription("Get today's meals for the user.")
|
| 43 |
+
getTodayMeals = async (req: IUserRequest, res: Response): Promise<Response> => {
|
| 44 |
+
try {
|
| 45 |
+
const data = await this.userRegisteredMealPlansService.findOneOrFail(
|
| 46 |
+
{
|
| 47 |
+
user: req.jwtPayload.id, isActive: true},
|
| 48 |
+
{
|
| 49 |
+
populateArray: [
|
| 50 |
+
{ path: "meal_plan", select: "-days" },
|
| 51 |
+
{ path: "days.meals" }
|
| 52 |
+
],
|
| 53 |
+
}
|
| 54 |
+
);
|
| 55 |
+
console.log(data);
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
const dayToEat = data.days.find(day => day.is_eaten === false);
|
| 59 |
+
|
| 60 |
+
if (dayToEat) {
|
| 61 |
+
data.days = [dayToEat];
|
| 62 |
+
return JsonResponse.success(
|
| 63 |
+
{
|
| 64 |
+
data: serialize(data, UserRegisteredMealPlansPopulateSerialization),
|
| 65 |
+
},
|
| 66 |
+
res
|
| 67 |
+
);
|
| 68 |
+
} else {
|
| 69 |
+
return JsonResponse.success(
|
| 70 |
+
{
|
| 71 |
+
message: "All planned meals have been eaten.",
|
| 72 |
+
},
|
| 73 |
+
res
|
| 74 |
+
);
|
| 75 |
+
}
|
| 76 |
+
} catch (error) {
|
| 77 |
+
console.error(error);
|
| 78 |
+
return res.status(500).json({ error: "An error occurred." });
|
| 79 |
+
}
|
| 80 |
+
};
|
| 81 |
+
|
| 82 |
+
@SwaggerPatch('/:id/progress/:day')
|
| 83 |
+
@SwaggerResponse({})
|
| 84 |
+
@SwaggerSummary("Update MyMealPlan Progress")
|
| 85 |
+
@SwaggerDescription("Update the progress of a MyMealPlan")
|
| 86 |
+
updateProgress = async (req: IUserRequest, res: Response) => {
|
| 87 |
+
const urwId: string = req.params.id;
|
| 88 |
+
const dayNumber: number = Number(req.params.day);
|
| 89 |
+
await this.userRegisteredMealPlansService.updateForUser({
|
| 90 |
+
urwId, dayNumber
|
| 91 |
+
}, req.body, req.jwtPayload.id);
|
| 92 |
+
return JsonResponse.success(
|
| 93 |
+
{
|
| 94 |
+
message: "mealPlan updated successfully",
|
| 95 |
+
},
|
| 96 |
+
res
|
| 97 |
+
);
|
| 98 |
+
};
|
| 99 |
+
|
| 100 |
|
| 101 |
@SwaggerGet('/todays-intake')
|
| 102 |
@SwaggerResponse(UserHomeYourDailyIntakeSerialization)
|
src/modules/users/modules/meal-plans/controller/meal-plans.controller.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
import { MealPlansService } from "../services/meal-plans.service";
|
| 2 |
-
import {
|
| 3 |
import { Request, Response } from "express";
|
| 4 |
import { JsonResponse } from "@lib/responses/json-response";
|
| 5 |
import { parsePaginationQuery } from "@helpers/pagination";
|
|
@@ -26,7 +26,7 @@ export class UsersMealPlansController extends BaseController {
|
|
| 26 |
}
|
| 27 |
|
| 28 |
@SwaggerGet()
|
| 29 |
-
@SwaggerResponse([
|
| 30 |
@SwaggerSummary("list meal plans")
|
| 31 |
@SwaggerDescription("List all meal plans")
|
| 32 |
@SwaggerQuery({
|
|
@@ -37,17 +37,12 @@ export class UsersMealPlansController extends BaseController {
|
|
| 37 |
const paginationQuery = parsePaginationQuery(req.query);
|
| 38 |
const { docs, paginationData } = await this.mealPlansService.list(
|
| 39 |
{},
|
| 40 |
-
paginationQuery
|
| 41 |
-
{
|
| 42 |
-
populateArray: [
|
| 43 |
-
{ path: "days.meals" }
|
| 44 |
-
],
|
| 45 |
-
}
|
| 46 |
);
|
| 47 |
|
| 48 |
return JsonResponse.success(
|
| 49 |
{
|
| 50 |
-
data: serialize(docs,
|
| 51 |
meta: paginationData,
|
| 52 |
},
|
| 53 |
res
|
|
|
|
| 1 |
import { MealPlansService } from "../services/meal-plans.service";
|
| 2 |
+
import { ListMealPlanSerialization } from "@common/serializers/meal-planPopulate.serialization";
|
| 3 |
import { Request, Response } from "express";
|
| 4 |
import { JsonResponse } from "@lib/responses/json-response";
|
| 5 |
import { parsePaginationQuery } from "@helpers/pagination";
|
|
|
|
| 26 |
}
|
| 27 |
|
| 28 |
@SwaggerGet()
|
| 29 |
+
@SwaggerResponse([ListMealPlanSerialization])
|
| 30 |
@SwaggerSummary("list meal plans")
|
| 31 |
@SwaggerDescription("List all meal plans")
|
| 32 |
@SwaggerQuery({
|
|
|
|
| 37 |
const paginationQuery = parsePaginationQuery(req.query);
|
| 38 |
const { docs, paginationData } = await this.mealPlansService.list(
|
| 39 |
{},
|
| 40 |
+
paginationQuery
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
);
|
| 42 |
|
| 43 |
return JsonResponse.success(
|
| 44 |
{
|
| 45 |
+
data: serialize(docs, ListMealPlanSerialization),
|
| 46 |
meta: paginationData,
|
| 47 |
},
|
| 48 |
res
|
src/modules/users/modules/user-registered-meal-plans/controller/user-registered-meal-plans.controller.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { asyncHandler } from "@helpers/async-handler";
|
|
| 5 |
import { BaseController } from "@lib/controllers/controller.base";
|
| 6 |
import { Controller } from "@lib/decorators/controller.decorator";
|
| 7 |
import { serialize } from "@helpers/serialize";
|
| 8 |
-
import {
|
| 9 |
import { ControllerMiddleware } from "@lib/decorators/controller-middleware.decorator";
|
| 10 |
import { UsersGuardMiddleware } from "modules/users/common/guards/users.guard";
|
| 11 |
import { SwaggerGet } from "@lib/decorators/swagger-routes.decorator";
|
|
@@ -26,22 +26,22 @@ export class UsersRegisteredMealPlansController extends BaseController {
|
|
| 26 |
}
|
| 27 |
|
| 28 |
@SwaggerGet()
|
| 29 |
-
@SwaggerResponse(
|
| 30 |
@SwaggerSummary("get my meal plan")
|
| 31 |
@SwaggerDescription("Get the meal plan that the user is currently using")
|
| 32 |
get = async (req: userRequest, res: Response): Promise<Response> => {
|
| 33 |
const data = await this.userRegisteredMealPlansService.findOneOrFail(
|
| 34 |
-
{ user: req.jwtPayload.
|
| 35 |
{
|
| 36 |
populateArray: [
|
| 37 |
-
{ path: "meal_plan" },
|
| 38 |
{ path: "days.meals"}
|
| 39 |
],
|
| 40 |
});
|
| 41 |
|
| 42 |
return JsonResponse.success(
|
| 43 |
{
|
| 44 |
-
data: serialize(data,
|
| 45 |
},
|
| 46 |
res
|
| 47 |
);
|
|
|
|
| 5 |
import { BaseController } from "@lib/controllers/controller.base";
|
| 6 |
import { Controller } from "@lib/decorators/controller.decorator";
|
| 7 |
import { serialize } from "@helpers/serialize";
|
| 8 |
+
import { GetMyMealPlanSerialization } from "@common/serializers/user-registered-meal-planPopulate.serialization";
|
| 9 |
import { ControllerMiddleware } from "@lib/decorators/controller-middleware.decorator";
|
| 10 |
import { UsersGuardMiddleware } from "modules/users/common/guards/users.guard";
|
| 11 |
import { SwaggerGet } from "@lib/decorators/swagger-routes.decorator";
|
|
|
|
| 26 |
}
|
| 27 |
|
| 28 |
@SwaggerGet()
|
| 29 |
+
@SwaggerResponse(GetMyMealPlanSerialization)
|
| 30 |
@SwaggerSummary("get my meal plan")
|
| 31 |
@SwaggerDescription("Get the meal plan that the user is currently using")
|
| 32 |
get = async (req: userRequest, res: Response): Promise<Response> => {
|
| 33 |
const data = await this.userRegisteredMealPlansService.findOneOrFail(
|
| 34 |
+
{ user: req.jwtPayload.id, isActive: true },
|
| 35 |
{
|
| 36 |
populateArray: [
|
| 37 |
+
{ path: "meal_plan", select: "-days"},
|
| 38 |
{ path: "days.meals"}
|
| 39 |
],
|
| 40 |
});
|
| 41 |
|
| 42 |
return JsonResponse.success(
|
| 43 |
{
|
| 44 |
+
data: serialize(data, GetMyMealPlanSerialization),
|
| 45 |
},
|
| 46 |
res
|
| 47 |
);
|
src/modules/users/modules/user-registered-meal-plans/services/user-registered-meal-plans.service.ts
CHANGED
|
@@ -1,4 +1,29 @@
|
|
| 1 |
import { UserRegisteredMealPlan } from "@common/models/user-registered-meal-plan.model";
|
| 2 |
import { CrudService } from "@lib/services/crud.service";
|
|
|
|
|
|
|
| 3 |
|
| 4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import { UserRegisteredMealPlan } from "@common/models/user-registered-meal-plan.model";
|
| 2 |
import { CrudService } from "@lib/services/crud.service";
|
| 3 |
+
import { IUpdateUserRegisteredMealPlan } from "../validations/update-user-registered-meal-plan.validation";
|
| 4 |
+
import { HttpError } from "@lib/error-handling/http-error";
|
| 5 |
|
| 6 |
+
|
| 7 |
+
export class UserRegisteredMealPlansService extends CrudService(UserRegisteredMealPlan) {
|
| 8 |
+
async updateForUser(mealPlanProps: {urwId: string; dayNumber: number}, data: any, userId: string) {
|
| 9 |
+
// find workout
|
| 10 |
+
const mealPlan = await this.findOneOrFail({
|
| 11 |
+
_id: mealPlanProps.urwId,
|
| 12 |
+
user: userId,
|
| 13 |
+
});
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
// find day
|
| 17 |
+
const day = mealPlan.days.find(d => d.day_number === mealPlanProps.dayNumber);
|
| 18 |
+
if(!day) throw new HttpError(404, 'Workout Day Not Found');
|
| 19 |
+
const dayIndex = mealPlan.days.indexOf(day)
|
| 20 |
+
|
| 21 |
+
// update day and week
|
| 22 |
+
day.is_eaten = true;
|
| 23 |
+
mealPlan.days[dayIndex] = day;
|
| 24 |
+
|
| 25 |
+
// save changes
|
| 26 |
+
mealPlan.markModified('days');
|
| 27 |
+
return mealPlan.save()
|
| 28 |
+
}
|
| 29 |
+
}
|
src/resources/meals.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
src/resources/meals1.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
src/resources/meals2.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
src/seeder/seeders/10-mealPlan.seeder.ts
CHANGED
|
@@ -6,7 +6,30 @@ import { FitnessLevel } from "@common/enums/fitness-level.enum";
|
|
| 6 |
export default seederWrapper(MealPlan, async () => {
|
| 7 |
// 10 mealPlans
|
| 8 |
await Promise.all(Array.from({ length: 10 }, (_, i) => i).map(async function (i) {
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
|
| 11 |
let o = {
|
| 12 |
image: `https://placehold.co/300x400`,
|
|
@@ -20,10 +43,15 @@ export default seederWrapper(MealPlan, async () => {
|
|
| 20 |
],
|
| 21 |
days: Array.from({ length: 7 }, (_, i) => ({
|
| 22 |
day_number: i + 1,
|
| 23 |
-
meals:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
})),
|
| 25 |
}
|
| 26 |
|
| 27 |
await MealPlan.create(o);
|
| 28 |
-
}))
|
| 29 |
-
})
|
|
|
|
| 6 |
export default seederWrapper(MealPlan, async () => {
|
| 7 |
// 10 mealPlans
|
| 8 |
await Promise.all(Array.from({ length: 10 }, (_, i) => i).map(async function (i) {
|
| 9 |
+
// Fetch all meals
|
| 10 |
+
const meals = await Meal.find().lean();
|
| 11 |
+
|
| 12 |
+
// Categorize meals by type
|
| 13 |
+
const categorizedMeals = {
|
| 14 |
+
'breakfast': [],
|
| 15 |
+
'dinner': [],
|
| 16 |
+
'snacks': [],
|
| 17 |
+
'lunch': [],
|
| 18 |
+
};
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
meals.forEach(meal => {
|
| 22 |
+
if (meal.type in categorizedMeals) {
|
| 23 |
+
categorizedMeals[meal.type].push(meal);
|
| 24 |
+
}
|
| 25 |
+
});
|
| 26 |
+
|
| 27 |
+
// Check if we have enough meals of each type
|
| 28 |
+
for (const type in categorizedMeals) {
|
| 29 |
+
if (categorizedMeals[type].length < 7) {
|
| 30 |
+
throw new Error(`Not enough meals of type ${type}`);
|
| 31 |
+
}
|
| 32 |
+
}
|
| 33 |
|
| 34 |
let o = {
|
| 35 |
image: `https://placehold.co/300x400`,
|
|
|
|
| 43 |
],
|
| 44 |
days: Array.from({ length: 7 }, (_, i) => ({
|
| 45 |
day_number: i + 1,
|
| 46 |
+
meals: [
|
| 47 |
+
categorizedMeals['breakfast'][i],
|
| 48 |
+
categorizedMeals['lunch'][i],
|
| 49 |
+
categorizedMeals['dinner'][i],
|
| 50 |
+
categorizedMeals['snacks'][i],
|
| 51 |
+
],
|
| 52 |
})),
|
| 53 |
}
|
| 54 |
|
| 55 |
await MealPlan.create(o);
|
| 56 |
+
}));
|
| 57 |
+
});
|