moahmedwafy commited on
Commit
c40085b
·
1 Parent(s): a443e50

feat(workouts): create new ai gen workout on workout end

Browse files
src/modules/users/modules/user-registered-workouts/controllers/user-registered-workouts.controller.ts CHANGED
@@ -22,6 +22,7 @@ import { SwaggerDescription } from "@lib/decorators/swagger-description.decorato
22
  import { SwaggerResponse } from "@lib/decorators/swagger-response.decorator";
23
  import { SwaggerRequest } from "@lib/decorators/swagger-request.decorator";import { updateUserRegisteredWorkoutsSchema } from "../validations/update-user-registered-workouts.validation";
24
  import { IUserRequest } from "@common/interfaces/user-request.interface";
 
25
  4
26
 
27
 
@@ -29,6 +30,7 @@ import { IUserRequest } from "@common/interfaces/user-request.interface";
29
  @ControllerMiddleware(UsersGuardMiddleware())
30
  export class userRegisteredWorkoutsController extends BaseController {
31
  private userRegisteredWorkoutsService = new UserRegisteredWorkoutsService();
 
32
 
33
  setRoutes(): void {
34
  this.router.get("/:id", asyncHandler(this.get));
@@ -124,7 +126,7 @@ export class userRegisteredWorkoutsController extends BaseController {
124
  const urwId: string = req.params.id;
125
  const weekNumber: number = Number(req.params.week);
126
  const dayNumber: number = Number(req.params.day);
127
- await this.userRegisteredWorkoutsService.updateForUser({
128
  urwId, weekNumber, dayNumber
129
  }, req.body, req.jwtPayload.id);
130
  return JsonResponse.success(
 
22
  import { SwaggerResponse } from "@lib/decorators/swagger-response.decorator";
23
  import { SwaggerRequest } from "@lib/decorators/swagger-request.decorator";import { updateUserRegisteredWorkoutsSchema } from "../validations/update-user-registered-workouts.validation";
24
  import { IUserRequest } from "@common/interfaces/user-request.interface";
25
+ import { WorkoutsProgressService } from "../services/workouts-progress.service";
26
  4
27
 
28
 
 
30
  @ControllerMiddleware(UsersGuardMiddleware())
31
  export class userRegisteredWorkoutsController extends BaseController {
32
  private userRegisteredWorkoutsService = new UserRegisteredWorkoutsService();
33
+ private workoutsProgressService = new WorkoutsProgressService();
34
 
35
  setRoutes(): void {
36
  this.router.get("/:id", asyncHandler(this.get));
 
126
  const urwId: string = req.params.id;
127
  const weekNumber: number = Number(req.params.week);
128
  const dayNumber: number = Number(req.params.day);
129
+ await this.workoutsProgressService.updateForUser({
130
  urwId, weekNumber, dayNumber
131
  }, req.body, req.jwtPayload.id);
132
  return JsonResponse.success(
src/modules/users/modules/user-registered-workouts/services/user-registered-workouts.service.ts CHANGED
@@ -1,8 +1,6 @@
1
  import { UserRegisteredWorkout } from "@common/models/user-registered-workout.model";
2
  import { CrudService } from "@lib/services/crud.service";
3
  import { ICreateUserRegisteredWorkouts } from "../validations/create-user-registered-workouts.validation";
4
- import { IUpdateUserRegisteredWorkouts } from "../validations/update-user-registered-workouts.validation";
5
- import { HttpError } from "@lib/error-handling/http-error";
6
  import { Workout } from "@common/models/workout.model";
7
 
8
  export class UserRegisteredWorkoutsService extends CrudService(UserRegisteredWorkout, {
@@ -35,32 +33,4 @@ export class UserRegisteredWorkoutsService extends CrudService(UserRegisteredWor
35
  is_active: true,
36
  });
37
  }
38
-
39
- async updateForUser(workoutProps: {urwId: string; weekNumber: number; dayNumber: number}, data: IUpdateUserRegisteredWorkouts, userId: string) {
40
- // find workout
41
- const workout = await this.findOneOrFail({
42
- _id: workoutProps.urwId,
43
- user: userId,
44
- });
45
-
46
- // find week
47
- const week = workout.weeks.find(w => w.week_number === workoutProps.weekNumber);
48
- if(!week) throw new HttpError(404, 'Workout Week Not Found');
49
- const weekIndex = workout.weeks.indexOf(week);
50
-
51
- // find day
52
- const day = week.days.find(d => d.day_number === workoutProps.dayNumber);
53
- if(!day) throw new HttpError(404, 'Workout Day Not Found');
54
- const dayIndex = week.days.indexOf(day)
55
-
56
- // update day and week
57
- day.is_done = true;
58
- week.days[dayIndex] = day;
59
- week.is_done = week.days.every(d => d.is_done);
60
- workout.weeks[weekIndex] = week;
61
-
62
- // save changes
63
- workout.markModified('weeks');
64
- return workout.save()
65
- }
66
  }
 
1
  import { UserRegisteredWorkout } from "@common/models/user-registered-workout.model";
2
  import { CrudService } from "@lib/services/crud.service";
3
  import { ICreateUserRegisteredWorkouts } from "../validations/create-user-registered-workouts.validation";
 
 
4
  import { Workout } from "@common/models/workout.model";
5
 
6
  export class UserRegisteredWorkoutsService extends CrudService(UserRegisteredWorkout, {
 
33
  is_active: true,
34
  });
35
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  }
src/modules/users/modules/user-registered-workouts/services/workouts-progress.service.ts ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { UserRegisteredWorkout } from "@common/models/user-registered-workout.model";
2
+ import { CrudService } from "@lib/services/crud.service";
3
+ import { IUpdateUserRegisteredWorkouts } from "../validations/update-user-registered-workouts.validation";
4
+ import { HttpError } from "@lib/error-handling/http-error";
5
+ import { WorkoutService } from "../../workouts/services/workouts.service";
6
+
7
+ export class WorkoutsProgressService extends CrudService(UserRegisteredWorkout, {
8
+ defaultFilter: {
9
+ is_active: true,
10
+ },
11
+ }) {
12
+ private workoutsService = new WorkoutService();
13
+
14
+ async updateForUser(workoutProps: {urwId: string; weekNumber: number; dayNumber: number}, _data: IUpdateUserRegisteredWorkouts, userId: string) {
15
+ // find workout
16
+ const workout = await this.findOneOrFail({
17
+ _id: workoutProps.urwId,
18
+ user: userId,
19
+ });
20
+
21
+ // find week
22
+ const week = workout.weeks.find(w => w.week_number === workoutProps.weekNumber);
23
+ if(!week) throw new HttpError(404, 'Workout Week Not Found');
24
+ const weekIndex = workout.weeks.indexOf(week);
25
+
26
+ // find day
27
+ const day = week.days.find(d => d.day_number === workoutProps.dayNumber);
28
+ if(!day) throw new HttpError(404, 'Workout Day Not Found');
29
+ const dayIndex = week.days.indexOf(day)
30
+
31
+ // update day and week
32
+ day.is_done = true;
33
+ week.days[dayIndex] = day;
34
+ week.is_done = week.days.every(d => d.is_done);
35
+ workout.weeks[weekIndex] = week;
36
+
37
+ // if last week
38
+ if(weekIndex === workout.weeks.length - 1) {
39
+ await this.workoutsService.createModelWorkout(userId)
40
+ }
41
+
42
+ // save changes
43
+ workout.markModified('weeks');
44
+ return workout.save()
45
+ }
46
+ }
src/modules/users/modules/workouts/services/workouts.service.ts CHANGED
@@ -6,12 +6,19 @@ import { CrudService } from "@lib/services/crud.service";
6
  import { calcAge } from "@lib/utils/age";
7
  import { ExerciseService } from "../../exercises/services/exercises.service";
8
  import { UserRegisteredWorkoutsService } from "../../user-registered-workouts/services/user-registered-workouts.service";
 
 
9
 
10
  export class WorkoutService extends CrudService(Workout) {
11
  private exerciseService = new ExerciseService();
12
  private userRegisteredWorkoutsService = new UserRegisteredWorkoutsService();
 
 
 
 
 
 
13
 
14
- public async createModelWorkout(user: UserDocument) {
15
  const params: IFWParams = {
16
  home_or_gym: user.preferences.workout_place === WorkoutPlace.GYM ? 1 : 0,
17
  level: user.fitness_level,
 
6
  import { calcAge } from "@lib/utils/age";
7
  import { ExerciseService } from "../../exercises/services/exercises.service";
8
  import { UserRegisteredWorkoutsService } from "../../user-registered-workouts/services/user-registered-workouts.service";
9
+ import { UserService } from "../../users/services/users.service";
10
+ import { Types } from "mongoose";
11
 
12
  export class WorkoutService extends CrudService(Workout) {
13
  private exerciseService = new ExerciseService();
14
  private userRegisteredWorkoutsService = new UserRegisteredWorkoutsService();
15
+ private usersService = new UserService()
16
+
17
+ public async createModelWorkout(userOrId: UserDocument | string) {
18
+ const user: UserDocument = typeof userOrId === 'string' ?
19
+ await this.usersService.findOneOrFail({_id: new Types.ObjectId(userOrId)}) :
20
+ userOrId;
21
 
 
22
  const params: IFWParams = {
23
  home_or_gym: user.preferences.workout_place === WorkoutPlace.GYM ? 1 : 0,
24
  level: user.fitness_level,