–ƒ–Hozifaelgharbawy commited on
Commit
8b3449a
·
1 Parent(s): 8a78b71
package-lock.json CHANGED
@@ -1143,6 +1143,7 @@
1143
  "version": "3.0.0",
1144
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1145
  "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
 
1146
  "engines": {
1147
  "node": ">=4"
1148
  }
@@ -1777,6 +1778,7 @@
1777
  "version": "1.0.10",
1778
  "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1779
  "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
 
1780
  "dependencies": {
1781
  "abbrev": "1"
1782
  },
@@ -5009,6 +5011,7 @@
5009
  "version": "5.5.0",
5010
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
5011
  "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
 
5012
  "dependencies": {
5013
  "has-flag": "^3.0.0"
5014
  },
 
1143
  "version": "3.0.0",
1144
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1145
  "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
1146
+ "dev": true,
1147
  "engines": {
1148
  "node": ">=4"
1149
  }
 
1778
  "version": "1.0.10",
1779
  "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1780
  "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
1781
+ "dev": true,
1782
  "dependencies": {
1783
  "abbrev": "1"
1784
  },
 
5011
  "version": "5.5.0",
5012
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
5013
  "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
5014
+ "dev": true,
5015
  "dependencies": {
5016
  "has-flag": "^3.0.0"
5017
  },
src/modules/common/users/enums/roles.enum.ts ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export enum Role {
2
+ USER = "user"
3
+ }
4
+ export enum Gender {
5
+ MALE = "male",
6
+ FEMALE = "female"
7
+ }
8
+ export enum FitnessLevel {
9
+ BEGINNER = "beginner",
10
+ INTERMEDIATE = "intermediate",
11
+ ADVANCED = "advanced"
12
+ }
13
+ export enum FitnessGoal {
14
+ LOSE_WEIGHT = "lose weight",
15
+ GAIN_MUSCLE = "gain muscle",
16
+ GET_FITTER = "get fitter"
17
+ }
18
+ export enum WorkoutPlace {
19
+ GYM = "gym",
20
+ HOME = "home",
21
+ BOTH = "both"
22
+ }
23
+ export enum PreferredDay {
24
+ SATURDAY = "saturday",
25
+ SUNDAY = "sunday",
26
+ MONDAY = "monday",
27
+ TUESDAY = "tuesday",
28
+ WEDNESDAY = "wednesday",
29
+ THURSDAY = "thursday",
30
+ FRIDAY = "friday"
31
+ }
32
+ export enum PreferredEquipment {
33
+ BARBELLS = "barbells",
34
+ DUMBBELLS = "dumbbells",
35
+ GYM_MACHINES = "gym machines",
36
+ RESISTANCE_BAND = "resistance band",
37
+ BODYWEIGHT = "bodyweight"
38
+ }
39
+ export enum Injurie {
40
+ NECK = "neck",
41
+ SHOULDERS = "shoulders",
42
+ BACK = "back",
43
+ ARMS = "arms",
44
+ KNEES = "knees"
45
+ }
src/modules/common/users/validation/user-register.validation.ts ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as joi from "joi";
2
+ import { Role, Gender, FitnessLevel, FitnessGoal, WorkoutPlace, PreferredDay, PreferredEquipment, Injurie } from "../enums/roles.enum";
3
+
4
+ export const userRegisterValidation = joi
5
+ .object()
6
+ .required()
7
+ .keys({
8
+ name: joi.string().empty().required().messages({
9
+ "string.base": "please enter a valid name",
10
+ "any.required": "name is required",
11
+ "string.empty": "name can not be empty",
12
+ }),
13
+ email: joi
14
+ .string()
15
+ .required()
16
+ .email({
17
+ minDomainSegments: 2,
18
+ tlds: { allow: ["com", "net", "org", "eg", "io"] },
19
+ })
20
+ .empty()
21
+ .messages({
22
+ "string.email": "please enter a valid email",
23
+ "any.required": "email must be entered",
24
+ "string.empty": "email can not be empty",
25
+ }),
26
+ password: joi.string().empty().min(8).required().messages({
27
+ "string.base": "please enter a valid password",
28
+ "any.required": "password must be entered",
29
+ "string.empty": "password cannot be empty",
30
+ "string.min": "password must be at least 8 characters",
31
+ }),
32
+ confirmPassword: joi.string().empty().min(8).required().messages({
33
+ "string.base": "please enter a valid password",
34
+ "any.required": "password must be entered",
35
+ "string.empty": "password cannot be empty",
36
+ "string.min": "password must be at least 8 characters",
37
+ }),
38
+ image: joi
39
+ .object()
40
+ .optional()
41
+ .keys({
42
+ url: joi.string().optional().messages({
43
+ "string.base": "please enter a valid url",
44
+ }),
45
+ public_id: joi.string().optional().messages({
46
+ "string.base": "please enter a valid public_id",
47
+ }),
48
+ }),
49
+ gender: joi.string().valid(...Object.values(Gender)).empty().required().messages({
50
+ "string.base": "please enter a valid gender",
51
+ "any.required": "gender must be entered",
52
+ "string.empty": "gender cannot be empty",
53
+ }),
54
+ height: joi.number().empty().required().messages({
55
+ "number.base": "please enter a valid height number",
56
+ "any.required": "height must be entered",
57
+ "number.empty": "height cannot be empty",
58
+ }),
59
+ weight: joi.number().empty().required().messages({
60
+ "number.base": "please enter a valid weight number",
61
+ "any.required": "weight must be entered",
62
+ "number.empty": "weight cannot be empty",
63
+ }),
64
+ fitness_level: joi.string().valid(...Object.values(FitnessLevel)).empty().required().messages({
65
+ "string.base": "please enter a valid fitness_level",
66
+ "any.required": "fitness_level must be entered",
67
+ "string.empty": "fitness_level cannot be empty",
68
+ }),
69
+ preferences: joi
70
+ .object()
71
+ .optional()
72
+ .keys({
73
+ fitness_goal: joi.string().valid(...Object.values(FitnessGoal)).empty().required().messages({
74
+ "string.base": "please enter a valid fitness_goal",
75
+ "any.required": "fitness_goal must be entered",
76
+ "string.empty": "fitness_goal cannot be empty",
77
+ }),
78
+ target_weight: joi.number().empty().required().messages({
79
+ "number.base": "please enter a valid target_weight number",
80
+ "any.required": "target_weight must be entered",
81
+ "number.empty": "target_weight cannot be empty",
82
+ }),
83
+ workout_frequency: joi.number().empty().required().messages({
84
+ "number.base": "please enter a valid workout_frequency number",
85
+ "any.required": "workout_frequency must be entered",
86
+ "number.empty": "workout_frequency cannot be empty",
87
+ }),
88
+ preferred_days: joi
89
+ .array()
90
+ .valid(...Object.values(PreferredDay))
91
+ .empty()
92
+ .required()
93
+ .items(
94
+ joi.string().empty().required().messages({
95
+ "string.base": "please enter a valid preferred_days",
96
+ "any.required": "preferred_days must be entered",
97
+ "string.empty": "preferred_days cannot be empty",
98
+ })
99
+ ),
100
+ workout_place: joi.string().valid(...Object.values(WorkoutPlace)).empty().required().messages({
101
+ "string.base": "please enter a valid workout_place",
102
+ "any.required": "workout_place must be entered",
103
+ "string.empty": "workout_place cannot be empty",
104
+ }),
105
+ preferred_equipment: joi
106
+ .array()
107
+ .valid(...Object.values(PreferredEquipment))
108
+ .empty()
109
+ .required()
110
+ .items(
111
+ joi.string().empty().required().messages({
112
+ "string.base": "please enter a valid preferred_equipment",
113
+ "any.required": "preferred_equipment must be entered",
114
+ "string.empty": "preferred_equipment cannot be empty",
115
+ })
116
+ ),
117
+ }),
118
+ injuries: joi
119
+ .array()
120
+ .valid(...Object.values(Injurie))
121
+ .empty()
122
+ .required()
123
+ .items(
124
+ joi.string().empty().required().messages({
125
+ "string.base": "please enter a valid injuries",
126
+ "any.required": "injuries must be entered",
127
+ "string.empty": "injuries cannot be empty",
128
+ })
129
+ ),
130
+ dob: joi.date().empty().optional().messages({
131
+ "date.base": "please enter a valid date",
132
+ }),
133
+ role: joi
134
+ .string()
135
+ .valid(...Object.values(Role))
136
+ .optional().messages({
137
+ "string.base": "please enter a valid role",
138
+ "string.empty": "role cannot be empty"
139
+ }),
140
+ });
src/routes.ts CHANGED
@@ -35,15 +35,19 @@ const setCustomRoutes = (router: Router) => {
35
  /* importing all controllers */
36
 
37
  const findControllerFiles = (): string[] => {
38
- return glob.sync(path.join(__dirname, "**/*.controller.{ts,js}"));
 
 
39
  };
40
 
41
  const importControllers = async (router: Router) => {
42
  const files = findControllerFiles();
43
 
 
44
  await Promise.all(
45
  files.map(async (file) => {
46
  const controllerClass = await importController(file);
 
47
  if (!controllerClass) return;
48
  const controller: BaseController = new (controllerClass as any)();
49
  controller.setRoutes();
 
35
  /* importing all controllers */
36
 
37
  const findControllerFiles = (): string[] => {
38
+ return glob.sync("**/*.controller.ts", {}).map((file) => {
39
+ return path.resolve(file);
40
+ });
41
  };
42
 
43
  const importControllers = async (router: Router) => {
44
  const files = findControllerFiles();
45
 
46
+
47
  await Promise.all(
48
  files.map(async (file) => {
49
  const controllerClass = await importController(file);
50
+
51
  if (!controllerClass) return;
52
  const controller: BaseController = new (controllerClass as any)();
53
  controller.setRoutes();