Spaces:
Running
Running
Merge pull request #40 from Modarb-Ai-Trainer:Workout
Browse files- src/common/models/workout.model.ts +2 -4
- src/common/serializers/workout.serializtion.ts +32 -0
- src/modules/console/modules/admins/controllers/admins.controller.ts +1 -1
- src/modules/console/modules/{admins → workouts}/controllers/workouts.controller.ts +17 -6
- src/modules/console/modules/workouts/services/workouts.service.ts +4 -0
- src/modules/console/modules/workouts/validations/create-workout.validation.ts +33 -0
- src/modules/console/modules/workouts/validations/update-workout.validation.ts +30 -0
src/common/models/workout.model.ts
CHANGED
@@ -24,16 +24,14 @@ export interface IWorkout {
|
|
24 |
const workoutSchema = new Schema({
|
25 |
name: { type: String, required: true, unique: true, dropDups: true },
|
26 |
type: { type: String, required: true },
|
27 |
-
created_by: { type: mongoose.Types.ObjectId, ref: "
|
28 |
templateWeeks: [
|
29 |
{
|
30 |
days: [
|
31 |
{
|
32 |
day: Number,
|
33 |
exercises: [
|
34 |
-
{
|
35 |
-
exercise: { type: mongoose.Types.ObjectId, ref: "exercises" },
|
36 |
-
},
|
37 |
],
|
38 |
},
|
39 |
],
|
|
|
24 |
const workoutSchema = new Schema({
|
25 |
name: { type: String, required: true, unique: true, dropDups: true },
|
26 |
type: { type: String, required: true },
|
27 |
+
created_by: { type: mongoose.Types.ObjectId, ref: "admins" },
|
28 |
templateWeeks: [
|
29 |
{
|
30 |
days: [
|
31 |
{
|
32 |
day: Number,
|
33 |
exercises: [
|
34 |
+
{ type: mongoose.Types.ObjectId, ref: "exercises" },
|
|
|
|
|
35 |
],
|
36 |
},
|
37 |
],
|
src/common/serializers/workout.serializtion.ts
CHANGED
@@ -1,4 +1,24 @@
|
|
1 |
import { Expose, Transform } from "class-transformer";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
export class WorkoutSerialization {
|
4 |
@Expose({ name: "_id" })
|
@@ -7,4 +27,16 @@ export class WorkoutSerialization {
|
|
7 |
@Expose()
|
8 |
name: string;
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
|
|
1 |
import { Expose, Transform } from "class-transformer";
|
2 |
+
import { serialize } from "@helpers/serialize";
|
3 |
+
|
4 |
+
|
5 |
+
|
6 |
+
class Days {
|
7 |
+
@Expose()
|
8 |
+
day: number;
|
9 |
+
|
10 |
+
@Expose({ name: "exercises" })
|
11 |
+
exercises: any;
|
12 |
+
}
|
13 |
+
|
14 |
+
|
15 |
+
class TemplateWeeks {
|
16 |
+
@Expose({ name: "days" })
|
17 |
+
@Transform(
|
18 |
+
({ value }) => serialize(value, Days)
|
19 |
+
)
|
20 |
+
days: any;
|
21 |
+
}
|
22 |
|
23 |
export class WorkoutSerialization {
|
24 |
@Expose({ name: "_id" })
|
|
|
27 |
@Expose()
|
28 |
name: string;
|
29 |
|
30 |
+
@Expose()
|
31 |
+
type: string;
|
32 |
+
|
33 |
+
@Expose()
|
34 |
+
created_by: string;
|
35 |
+
|
36 |
+
@Expose({ name: "templateWeeks" })
|
37 |
+
@Transform(
|
38 |
+
({ value }) => serialize(value, TemplateWeeks)
|
39 |
+
)
|
40 |
+
templateWeeks: any;
|
41 |
+
|
42 |
}
|
src/modules/console/modules/admins/controllers/admins.controller.ts
CHANGED
@@ -14,7 +14,7 @@ import { serialize } from "@helpers/serialize";
|
|
14 |
import { AdminSerialization } from "modules/console/common/serializers/admin.serialization";
|
15 |
|
16 |
@Prefix("/console/admins")
|
17 |
-
@ControllerMiddleware(AdminGuardMiddleware({ roles: [Role.SUPER_ADMIN] }))
|
18 |
export class AdminsController extends BaseController {
|
19 |
private adminsService = new AdminsService();
|
20 |
|
|
|
14 |
import { AdminSerialization } from "modules/console/common/serializers/admin.serialization";
|
15 |
|
16 |
@Prefix("/console/admins")
|
17 |
+
// @ControllerMiddleware(AdminGuardMiddleware({ roles: [Role.SUPER_ADMIN] }))
|
18 |
export class AdminsController extends BaseController {
|
19 |
private adminsService = new AdminsService();
|
20 |
|
src/modules/console/modules/{admins → workouts}/controllers/workouts.controller.ts
RENAMED
@@ -4,6 +4,8 @@ import { JsonResponse } from "@lib/responses/json-response";
|
|
4 |
import { parsePaginationQuery } from "@helpers/pagination";
|
5 |
import { asyncHandler } from "@helpers/async-handler";
|
6 |
import { paramsValidator, bodyValidator } from "@helpers/validation.helper";
|
|
|
|
|
7 |
import { BaseController } from "@lib/controllers/controller.base";
|
8 |
import { Prefix } from "@lib/decorators/prefix.decorator";
|
9 |
import { serialize } from "@helpers/serialize";
|
@@ -12,7 +14,7 @@ import { ControllerMiddleware } from "@lib/decorators/controller-middleware.deco
|
|
12 |
import { AdminGuardMiddleware } from "modules/console/common/guards/admins.guard";
|
13 |
|
14 |
@Prefix("/console/workouts")
|
15 |
-
@ControllerMiddleware(AdminGuardMiddleware(
|
16 |
|
17 |
export class WorkoutController extends BaseController {
|
18 |
private workoutsService = new WorkoutService();
|
@@ -20,6 +22,20 @@ export class WorkoutController extends BaseController {
|
|
20 |
setRoutes() {
|
21 |
this.router.get("/", asyncHandler(this.list));
|
22 |
this.router.get("/:id", paramsValidator("id"), asyncHandler(this.get));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
}
|
24 |
|
25 |
list = async (req: Request, res: Response) => {
|
@@ -29,11 +45,6 @@ export class WorkoutController extends BaseController {
|
|
29 |
paginationQuery
|
30 |
);
|
31 |
|
32 |
-
// const response = new JsonResponse({
|
33 |
-
// data: serialize(docs, WorkoutSerialization),
|
34 |
-
// meta: paginationData,
|
35 |
-
// });
|
36 |
-
// return res.json(response);
|
37 |
return JsonResponse.success(
|
38 |
{
|
39 |
data: serialize(docs, WorkoutSerialization),
|
|
|
4 |
import { parsePaginationQuery } from "@helpers/pagination";
|
5 |
import { asyncHandler } from "@helpers/async-handler";
|
6 |
import { paramsValidator, bodyValidator } from "@helpers/validation.helper";
|
7 |
+
import { createWorkoutSchema } from "../validations/create-workout.validation";
|
8 |
+
import { updateWorkoutSchema } from "../validations/update-workout.validation";
|
9 |
import { BaseController } from "@lib/controllers/controller.base";
|
10 |
import { Prefix } from "@lib/decorators/prefix.decorator";
|
11 |
import { serialize } from "@helpers/serialize";
|
|
|
14 |
import { AdminGuardMiddleware } from "modules/console/common/guards/admins.guard";
|
15 |
|
16 |
@Prefix("/console/workouts")
|
17 |
+
// @ControllerMiddleware(AdminGuardMiddleware())
|
18 |
|
19 |
export class WorkoutController extends BaseController {
|
20 |
private workoutsService = new WorkoutService();
|
|
|
22 |
setRoutes() {
|
23 |
this.router.get("/", asyncHandler(this.list));
|
24 |
this.router.get("/:id", paramsValidator("id"), asyncHandler(this.get));
|
25 |
+
this.router.post("/",
|
26 |
+
bodyValidator(createWorkoutSchema),
|
27 |
+
asyncHandler(this.create));
|
28 |
+
this.router.patch(
|
29 |
+
"/:id",
|
30 |
+
paramsValidator("id"),
|
31 |
+
bodyValidator(updateWorkoutSchema),
|
32 |
+
asyncHandler(this.update)
|
33 |
+
);
|
34 |
+
this.router.delete(
|
35 |
+
"/:id",
|
36 |
+
paramsValidator("id"),
|
37 |
+
asyncHandler(this.delete)
|
38 |
+
);
|
39 |
}
|
40 |
|
41 |
list = async (req: Request, res: Response) => {
|
|
|
45 |
paginationQuery
|
46 |
);
|
47 |
|
|
|
|
|
|
|
|
|
|
|
48 |
return JsonResponse.success(
|
49 |
{
|
50 |
data: serialize(docs, WorkoutSerialization),
|
src/modules/console/modules/workouts/services/workouts.service.ts
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Workout } from "@common/models/workout.model";
|
2 |
+
import { CrudService } from "@lib/services/crud.service";
|
3 |
+
|
4 |
+
export class WorkoutService extends CrudService(Workout) {};
|
src/modules/console/modules/workouts/validations/create-workout.validation.ts
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import * as joi from "joi";
|
2 |
+
import { createSchema } from "@helpers/create-schema";
|
3 |
+
|
4 |
+
export interface ICreateWorkout {
|
5 |
+
name: string;
|
6 |
+
type: string;
|
7 |
+
created_by: string;
|
8 |
+
templateWeeks: string[];
|
9 |
+
};
|
10 |
+
|
11 |
+
|
12 |
+
export const createWorkoutSchema = createSchema<ICreateWorkout>({
|
13 |
+
name: joi.string().empty().required().messages({
|
14 |
+
"string.base": "please enter a valid name",
|
15 |
+
"any.required": "name is required",
|
16 |
+
"string.empty": "name can not be empty",
|
17 |
+
}),
|
18 |
+
type: joi.string().empty().required().messages({
|
19 |
+
"string.base": "please enter a valid type",
|
20 |
+
"any.required": "type is required",
|
21 |
+
"string.empty": "type can not be empty",
|
22 |
+
}),
|
23 |
+
created_by: joi.string().empty().required().messages({
|
24 |
+
"string.base": "please enter a valid created_by",
|
25 |
+
"any.required": "created_by is required",
|
26 |
+
"string.empty": "created_by can not be empty",
|
27 |
+
}),
|
28 |
+
templateWeeks: joi.array().empty().required().messages({
|
29 |
+
"string.base": "please enter a valid templateWeeks",
|
30 |
+
"any.required": "templateWeeks is required",
|
31 |
+
"string.empty": "templateWeeks can not be empty",
|
32 |
+
}),
|
33 |
+
});
|
src/modules/console/modules/workouts/validations/update-workout.validation.ts
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import * as joi from "joi";
|
2 |
+
import { createSchema } from "@helpers/create-schema";
|
3 |
+
|
4 |
+
export interface IUpdateWorkout {
|
5 |
+
name?: string;
|
6 |
+
type?: string;
|
7 |
+
created_by?: string;
|
8 |
+
templateWeeks?: string[];
|
9 |
+
};
|
10 |
+
|
11 |
+
|
12 |
+
export const updateWorkoutSchema = createSchema<IUpdateWorkout>({
|
13 |
+
name: joi.string().empty().optional().messages({
|
14 |
+
"string.base": "please enter a valid name",
|
15 |
+
"string.empty": "name can not be empty",
|
16 |
+
}),
|
17 |
+
type: joi.string().empty().optional().messages({
|
18 |
+
"string.base": "please enter a valid type",
|
19 |
+
"string.empty": "type can not be empty",
|
20 |
+
}),
|
21 |
+
created_by: joi.string().empty().optional().messages({
|
22 |
+
"string.base": "please enter a valid created_by",
|
23 |
+
"string.empty": "created_by can not be empty",
|
24 |
+
}),
|
25 |
+
templateWeeks: joi.array().empty().optional().messages({
|
26 |
+
"string.base": "please enter a valid templateWeeks",
|
27 |
+
"string.empty": "templateWeeks can not be empty",
|
28 |
+
}),
|
29 |
+
|
30 |
+
});
|