Spaces:
Running
Running
Hozifaelgharbawy
commited on
Commit
·
8b3449a
1
Parent(s):
8a78b71
update
Browse files
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(
|
|
|
|
|
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();
|