mongodb-dynamic-api 2.3.16 → 2.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/package.json +1 -1
- package/src/interfaces/dynamic-api-service-callback.interface.d.ts +2 -2
- package/src/modules/auth/auth.module.js +2 -2
- package/src/modules/auth/auth.module.js.map +1 -1
- package/src/modules/auth/interfaces/auth-options.interface.d.ts +1 -1
- package/src/modules/auth/services/base-auth.service.js +10 -6
- package/src/modules/auth/services/base-auth.service.js.map +1 -1
- package/src/services/base/base.service.d.ts +3 -3
- package/src/services/base/base.service.js +7 -5
- package/src/services/base/base.service.js.map +1 -1
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +3 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js.map +1 -1
- package/src/version.json +1 -1
- package/test/dynamic-api-for-root.e2e-spec.js +200 -12
- package/test/dynamic-api-for-root.e2e-spec.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.17](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v2.3.16...v2.3.17) (2024-05-26)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### authentication
|
|
7
|
+
|
|
8
|
+
* **authentication:** rework reset and change password behaviors when options are provided ([3a0f09d](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3a0f09dd23f0083c79632bed9a83e93eb90c62d2))
|
|
9
|
+
|
|
3
10
|
## [2.3.16](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v2.3.15...v2.3.16) (2024-05-25)
|
|
4
11
|
|
|
5
12
|
|
package/package.json
CHANGED
|
@@ -38,8 +38,8 @@ type DynamicApiCallbackMethods = {
|
|
|
38
38
|
};
|
|
39
39
|
type DynamicApiServiceCallback<Entity extends BaseEntity> = (entity: Entity, methods: DynamicApiCallbackMethods) => Promise<void>;
|
|
40
40
|
type DynamicApiResetPasswordCallbackMethods<Entity extends BaseEntity, UpdateBy = 'userId'> = {
|
|
41
|
-
findUserByEmail: (
|
|
42
|
-
updateUserByEmail: (
|
|
41
|
+
findUserByEmail: () => Promise<Entity>;
|
|
42
|
+
updateUserByEmail: (update: UpdateQuery<Entity> | UpdateWithAggregationPipeline) => Promise<Entity>;
|
|
43
43
|
};
|
|
44
44
|
type DynamicApiResetPasswordCallback<Entity extends BaseEntity> = (_: {
|
|
45
45
|
resetPasswordToken: string;
|
|
@@ -20,9 +20,9 @@ const strategies_1 = require("./strategies");
|
|
|
20
20
|
let AuthModule = AuthModule_1 = class AuthModule {
|
|
21
21
|
static forRoot(options, extraImports = []) {
|
|
22
22
|
const { userEntity, login: { loginField, passwordField, ...login }, register, resetPassword, jwt: { secret, expiresIn }, validationPipeOptions, } = this.initializeAuthOptions(options);
|
|
23
|
-
const { resetPasswordCallback, changePasswordCallback, emailField, expirationInMinutes,
|
|
23
|
+
const { resetPasswordCallback, changePasswordCallback, emailField, expirationInMinutes, changePasswordAbilityPredicate, } = resetPassword;
|
|
24
24
|
const resetPasswordOptions = resetPasswordCallback
|
|
25
|
-
? { resetPasswordCallback, changePasswordCallback, emailField, expirationInMinutes,
|
|
25
|
+
? { resetPasswordCallback, changePasswordCallback, emailField, expirationInMinutes, changePasswordAbilityPredicate: changePasswordAbilityPredicate }
|
|
26
26
|
: undefined;
|
|
27
27
|
const AuthController = (0, auth_helper_1.createAuthController)(userEntity, { loginField, passwordField, ...login }, register, validationPipeOptions, resetPasswordOptions);
|
|
28
28
|
const AuthServiceProvider = (0, auth_helper_1.createAuthServiceProvider)(userEntity, { loginField, passwordField, ...login }, register.callback, resetPasswordOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/modules/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAwC;AACxC,qCAAwC;AACxC,+CAAkD;AAClD,+CAAkD;AAClD,iEAA4D;AAC5D,2CAAsD;AAEtD,6CAA6E;AAC7E,+CAA6G;AAE7G,6CAA2C;AAGpC,IAAM,UAAU,kBAAhB,MAAM,UAAU;IACrB,MAAM,CAAC,OAAO,CACZ,OAAsC,EACtC,eAAsB,EAAE;QAExB,MAAM,EACJ,UAAU,EACV,KAAK,EAAE,EACL,UAAU,EACV,aAAa,EACb,GAAG,KAAK,EACT,EACD,QAAQ,EACR,aAAa,EACb,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAC1B,qBAAqB,GACtB,GAAG,IAAI,CAAC,qBAAqB,CAAS,OAAO,CAAC,CAAC;QAEhD,MAAM,EACJ,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/modules/auth/auth.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ type DynamicApiResetPasswordOptions<Entity extends BaseEntity = any> = {
|
|
|
26
26
|
expirationInMinutes: number;
|
|
27
27
|
resetPasswordCallback: DynamicApiResetPasswordCallback<Entity>;
|
|
28
28
|
changePasswordCallback: DynamicApiServiceCallback<Entity>;
|
|
29
|
-
|
|
29
|
+
changePasswordAbilityPredicate?: AuthAbilityPredicate;
|
|
30
30
|
};
|
|
31
31
|
type DynamicApiAuthOptions<Entity extends BaseEntity = any> = {
|
|
32
32
|
userEntity: Type<Entity>;
|
|
@@ -78,7 +78,7 @@ class BaseAuthService extends services_1.BaseService {
|
|
|
78
78
|
return;
|
|
79
79
|
}
|
|
80
80
|
this.resetPasswordCallbackMethods = {
|
|
81
|
-
findUserByEmail: async (
|
|
81
|
+
findUserByEmail: async () => {
|
|
82
82
|
const user = await this.model.findOne({ [this.resetPasswordOptions.emailField]: email })
|
|
83
83
|
.lean()
|
|
84
84
|
.exec();
|
|
@@ -87,8 +87,8 @@ class BaseAuthService extends services_1.BaseService {
|
|
|
87
87
|
}
|
|
88
88
|
return this.buildInstance(user);
|
|
89
89
|
},
|
|
90
|
-
updateUserByEmail: async (
|
|
91
|
-
const user = await this.model.findOneAndUpdate({ [this.resetPasswordOptions.emailField]: email },
|
|
90
|
+
updateUserByEmail: async (update) => {
|
|
91
|
+
const user = await this.model.findOneAndUpdate({ [this.resetPasswordOptions.emailField]: email }, update, { new: true }).lean().exec();
|
|
92
92
|
if (!user) {
|
|
93
93
|
return;
|
|
94
94
|
}
|
|
@@ -119,10 +119,13 @@ class BaseAuthService extends services_1.BaseService {
|
|
|
119
119
|
}
|
|
120
120
|
let userId;
|
|
121
121
|
try {
|
|
122
|
-
const { _id } = await this.findOneDocumentWithAbilityPredicate(undefined, { [this.resetPasswordOptions.emailField]: email });
|
|
122
|
+
const { _id } = await this.findOneDocumentWithAbilityPredicate(undefined, { [this.resetPasswordOptions.emailField]: email }, this.resetPasswordOptions?.changePasswordAbilityPredicate);
|
|
123
123
|
userId = _id.toString();
|
|
124
124
|
}
|
|
125
125
|
catch (error) {
|
|
126
|
+
if (error.status === 403) {
|
|
127
|
+
throw new common_1.ForbiddenException('You are not allowed to change your password.');
|
|
128
|
+
}
|
|
126
129
|
this.logger.warn('Invalid email, user not found');
|
|
127
130
|
}
|
|
128
131
|
if (!userId) {
|
|
@@ -131,8 +134,9 @@ class BaseAuthService extends services_1.BaseService {
|
|
|
131
134
|
const hashedPassword = await this.bcryptService.hashPassword(newPassword);
|
|
132
135
|
await this.model.updateOne({ _id: userId }, { [this.passwordField]: hashedPassword });
|
|
133
136
|
if (this.resetPasswordOptions?.changePasswordCallback) {
|
|
134
|
-
const user = await this.
|
|
135
|
-
|
|
137
|
+
const user = (await this.model.findOne({ _id: userId }).lean().exec());
|
|
138
|
+
const instance = this.buildInstance(user);
|
|
139
|
+
await this.resetPasswordOptions.changePasswordCallback(instance, this.callbackMethods);
|
|
136
140
|
}
|
|
137
141
|
}
|
|
138
142
|
buildUserFields(user, fieldsToBuild) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-auth.service.js","sourceRoot":"","sources":["../../../../../libs/dynamic-api/src/modules/auth/services/base-auth.service.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"base-auth.service.js","sourceRoot":"","sources":["../../../../../libs/dynamic-api/src/modules/auth/services/base-auth.service.ts"],"names":[],"mappings":";;;AAAA,2CAA8G;AAK9G,gDAA+D;AAG/D,MAAsB,eAA2C,SAAQ,sBAAmB;IAa1F,YACqB,KAAoB,EACpB,UAAsB,EACtB,aAA4B;QAE/C,KAAK,CAAC,KAAK,CAAC,CAAC;QAJM,UAAK,GAAL,KAAK,CAAe;QACpB,eAAU,GAAV,UAAU,CAAY;QACtB,kBAAa,GAAb,aAAa,CAAe;QAdvC,eAAU,GAAG,OAAuB,CAAC;QACrC,kBAAa,GAAG,UAA0B,CAAC;QAC3C,4BAAuB,GAAqB,EAAE,CAAC;QAOxC,WAAM,GAAG,IAAI,eAAM,CAAC,aAAa,CAAC,CAAC;IAQpD,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,IAAY;QACtD,MAAM,IAAI,GAAG,CAEX,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAC3D,CAAC;QAGZ,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEhH,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,KAAqB;YACrB,IAAI,CAAC,UAAU;YACf,GAAG,IAAI,CAAC,uBAAuB;SAChC,CAAC;QAEF,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC;IAES,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,UAAU,GAAG,KAAK;QACpD,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAW,CAAC;YACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,KAAqB;YACrB,IAAoB;YACpB,IAAI,CAAC,UAAU;YACf,GAAG,IAAI,CAAC,uBAAuB;SAChC,CAAC;QAGF,MAAM,OAAO,GAAW;YACtB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC;SAC7C,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;SAC3C,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,YAA6B;QACpD,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAEvC,IAAI,CAAC;YAEH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAC/F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;YAEnG,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAW,CAAC;gBACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAW,CAAC;YAEtF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,EAAU;QACvC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAW,CAAC;QAE7E,MAAM,aAAa,GAAG;YACpB,KAAqB;YACrB,IAAI,CAAC,UAAU;YACf,GAAG,IAAI,CAAC,uBAAuB;SAChC,CAAC;QAEF,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,KAAa;QACzC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,4BAA4B,GAAG;YAClC,eAAe,EAAE,KAAK,IAAI,EAAE;gBAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC;qBACvF,IAAI,EAAE;qBACN,IAAI,EAAE,CAAC;gBAER,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBAED,OAAO,IAAI,CAAC,aAAa,CAAC,IAAc,CAAC,CAAC;YAC5C,CAAC;YACD,iBAAiB,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBACvF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAE5C,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EACjD,MAAM,EACN,EAAE,GAAG,EAAE,IAAI,EAAE,CACd,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBAEhB,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBAED,OAAO,IAAI,CAAC,aAAa,CAAC,IAAc,CAAC,CAAC;YAC5C,CAAC;SACF,CAAC;QAEF,MAAM,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAEjF,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAC7C,EAAE,KAAK,EAAE,EACT,EAAE,SAAS,EAAE,mBAAmB,GAAG,EAAE,EAAE,CACxC,CAAC;QAEF,MAAM,qBAAqB,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAChG,CAAC;IAES,KAAK,CAAC,cAAc,CAAC,kBAA0B,EAAE,WAAmB;QAC5E,IAAI,KAAa,CAAC;QAClB,IAAI,GAAW,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC3D,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YACtB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,4BAAmB,CAAC,uEAAuE,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,8BAAqB,CAAC,6EAA6E,CAAC,CAAC;QACjH,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAC5D,SAAS,EAET,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EACjD,IAAI,CAAC,oBAAoB,EAAE,8BAA8B,CAC1D,CAAC;YACF,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACzB,MAAM,IAAI,2BAAkB,CAAC,8CAA8C,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAE1E,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CACxB,EAAE,GAAG,EAAE,MAAM,EAAE,EAEf,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CACzC,CAAC;QAEF,IAAI,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAW,CAAC;YACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAAY,EAAE,aAA+B;QACnE,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAC5C,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACd,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CACnE,EACD,EAAY,CACb,CAAC,CAAC;IACL,CAAC;IAEO,mBAAmB,CAAC,YAA6B;QACvD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,4BAAmB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;CACF;AApOD,0CAoOC"}
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
/// <reference types="mongoose/types/inferschematype" />
|
|
25
25
|
import { Type } from '@nestjs/common';
|
|
26
26
|
import { FilterQuery, Model, Schema, UpdateQuery, UpdateWithAggregationPipeline } from 'mongoose';
|
|
27
|
-
import { AbilityPredicate, DeleteResult, DynamicApiCallbackMethods, UpdateResult } from '../../interfaces';
|
|
27
|
+
import { AbilityPredicate, AuthAbilityPredicate, DeleteResult, DynamicApiCallbackMethods, UpdateResult } from '../../interfaces';
|
|
28
28
|
import { BaseEntity } from '../../models';
|
|
29
29
|
import { DynamicApiResetPasswordOptions } from '../../modules';
|
|
30
30
|
export declare abstract class BaseService<Entity extends BaseEntity> {
|
|
@@ -38,7 +38,7 @@ export declare abstract class BaseService<Entity extends BaseEntity> {
|
|
|
38
38
|
protected constructor(model: Model<Entity>);
|
|
39
39
|
get isSoftDeletable(): boolean;
|
|
40
40
|
protected findManyDocumentsWithAbilityPredicate(conditions?: FilterQuery<Entity>): Promise<Entity[]>;
|
|
41
|
-
protected findOneDocumentWithAbilityPredicate(_id: string | Schema.Types.ObjectId | undefined, conditions?: FilterQuery<Entity>): Promise<Entity>;
|
|
41
|
+
protected findOneDocumentWithAbilityPredicate(_id: string | Schema.Types.ObjectId | undefined, conditions?: FilterQuery<Entity>, authAbilityPredicate?: AuthAbilityPredicate<Entity>): Promise<Entity>;
|
|
42
42
|
protected findManyDocuments<T>(entity: Type<T>, query: FilterQuery<T>): Promise<T[]>;
|
|
43
43
|
protected findOneDocument<T>(entity: Type<T>, query: FilterQuery<T>): Promise<T | undefined>;
|
|
44
44
|
protected createManyDocuments<T>(entity: Type<T>, data: Partial<T>[]): Promise<T[]>;
|
|
@@ -48,7 +48,7 @@ export declare abstract class BaseService<Entity extends BaseEntity> {
|
|
|
48
48
|
protected deleteManyDocuments<T>(entity: Type<T>, ids: string[]): Promise<DeleteResult>;
|
|
49
49
|
protected deleteOneDocument<T>(entity: Type<T>, id: string): Promise<DeleteResult>;
|
|
50
50
|
protected buildInstance(document: Entity): Entity;
|
|
51
|
-
protected handleAbilityPredicate(document: Entity): void;
|
|
51
|
+
protected handleAbilityPredicate(document: Entity, authAbilityPredicate?: AuthAbilityPredicate<Entity>): void;
|
|
52
52
|
protected handleDuplicateKeyError(error: any, reThrow?: boolean): void;
|
|
53
53
|
protected handleMongoErrors(error: any, reThrow?: boolean): void;
|
|
54
54
|
protected handleDocumentNotFound(): void;
|
|
@@ -29,7 +29,7 @@ class BaseService {
|
|
|
29
29
|
}
|
|
30
30
|
return documents;
|
|
31
31
|
}
|
|
32
|
-
async findOneDocumentWithAbilityPredicate(_id, conditions = {}) {
|
|
32
|
+
async findOneDocumentWithAbilityPredicate(_id, conditions = {}, authAbilityPredicate) {
|
|
33
33
|
const document = await this.findOneDocument(this.entity, {
|
|
34
34
|
...(_id ? { _id } : {}),
|
|
35
35
|
...conditions,
|
|
@@ -37,8 +37,8 @@ class BaseService {
|
|
|
37
37
|
if (!document) {
|
|
38
38
|
throw new common_1.BadRequestException('Document not found');
|
|
39
39
|
}
|
|
40
|
-
if (this.abilityPredicate) {
|
|
41
|
-
this.handleAbilityPredicate(document);
|
|
40
|
+
if (authAbilityPredicate || this.abilityPredicate) {
|
|
41
|
+
this.handleAbilityPredicate(document, authAbilityPredicate);
|
|
42
42
|
}
|
|
43
43
|
return document;
|
|
44
44
|
}
|
|
@@ -92,8 +92,10 @@ class BaseService {
|
|
|
92
92
|
.id(_id?.toString() ?? id)
|
|
93
93
|
.build();
|
|
94
94
|
}
|
|
95
|
-
handleAbilityPredicate(document) {
|
|
96
|
-
const isAllowed =
|
|
95
|
+
handleAbilityPredicate(document, authAbilityPredicate) {
|
|
96
|
+
const isAllowed = authAbilityPredicate
|
|
97
|
+
? authAbilityPredicate(this.buildInstance(document))
|
|
98
|
+
: this.abilityPredicate(document, this.user);
|
|
97
99
|
if (!isAllowed) {
|
|
98
100
|
throw new common_1.ForbiddenException('Forbidden resource');
|
|
99
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/services/base/base.service.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/services/base/base.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,6 +67,8 @@ class DynamicApiGlobalStateService {
|
|
|
67
67
|
return (key ? DynamicApiGlobalStateService._[key] : DynamicApiGlobalStateService._);
|
|
68
68
|
}
|
|
69
69
|
resetState(initialGlobalState = {}) {
|
|
70
|
+
DynamicApiGlobalStateService.entitySchemas$.next({});
|
|
71
|
+
DynamicApiGlobalStateService.connection = null;
|
|
70
72
|
Object.assign(DynamicApiGlobalStateService._, { ...this.defaultGlobalState }, initialGlobalState);
|
|
71
73
|
}
|
|
72
74
|
updateState() {
|
|
@@ -78,5 +80,6 @@ class DynamicApiGlobalStateService {
|
|
|
78
80
|
exports.DynamicApiGlobalStateService = DynamicApiGlobalStateService;
|
|
79
81
|
DynamicApiGlobalStateService.initialized$ = new rxjs_1.BehaviorSubject(false);
|
|
80
82
|
DynamicApiGlobalStateService.entitySchemas$ = new rxjs_1.BehaviorSubject({});
|
|
83
|
+
DynamicApiGlobalStateService.connection = null;
|
|
81
84
|
DynamicApiGlobalStateService._ = {};
|
|
82
85
|
//# sourceMappingURL=dynamic-api-global-state.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-api-global-state.service.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/services/dynamic-api-global-state/dynamic-api-global-state.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dynamic-api-global-state.service.js","sourceRoot":"","sources":["../../../../libs/dynamic-api/src/services/dynamic-api-global-state/dynamic-api-global-state.service.ts"],"names":[],"mappings":"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"}
|
package/src/version.json
CHANGED
|
@@ -20,7 +20,6 @@ const e2e_setup_1 = require("./e2e.setup");
|
|
|
20
20
|
require("dotenv/config");
|
|
21
21
|
const utils_1 = require("./utils");
|
|
22
22
|
describe('DynamicApiModule forRoot (e2e)', () => {
|
|
23
|
-
let app;
|
|
24
23
|
const uri = process.env.MONGO_DB_URL;
|
|
25
24
|
const initModule = async (dynamicApiForRootOptions, initFixtures) => {
|
|
26
25
|
const moduleRef = await testing_1.Test.createTestingModule({
|
|
@@ -35,7 +34,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
35
34
|
await (0, e2e_setup_1.closeTestingApp)(mongoose_2.default.connections);
|
|
36
35
|
});
|
|
37
36
|
it('should initialize dynamic api module state with default options', async () => {
|
|
38
|
-
app = await initModule({});
|
|
37
|
+
const app = await initModule({});
|
|
39
38
|
expect(app).toBeDefined();
|
|
40
39
|
expect(src_1.DynamicApiModule.state.get()).toStrictEqual({
|
|
41
40
|
uri,
|
|
@@ -65,7 +64,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
65
64
|
});
|
|
66
65
|
});
|
|
67
66
|
it('should initialize dynamic api module state with custom options', async () => {
|
|
68
|
-
app = await initModule({
|
|
67
|
+
const app = await initModule({
|
|
69
68
|
useGlobalCache: false,
|
|
70
69
|
cacheOptions: {
|
|
71
70
|
excludePaths: ['/fake-path'],
|
|
@@ -105,6 +104,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
105
104
|
UserEntity = __decorate([
|
|
106
105
|
(0, mongoose_1.Schema)({ collection: 'users' })
|
|
107
106
|
], UserEntity);
|
|
107
|
+
let app;
|
|
108
108
|
beforeEach(async () => {
|
|
109
109
|
app = await initModule({ useAuth: { userEntity: UserEntity } });
|
|
110
110
|
});
|
|
@@ -140,7 +140,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
140
140
|
},
|
|
141
141
|
});
|
|
142
142
|
});
|
|
143
|
-
describe('POST /register', () => {
|
|
143
|
+
describe('POST /auth/register', () => {
|
|
144
144
|
it('should throw a bad request exception if email is missing', async () => {
|
|
145
145
|
const { body, status } = await e2e_setup_1.server.post('/auth/register', { username: 'unit-test', password: 'test-2' });
|
|
146
146
|
expect(status).toBe(400);
|
|
@@ -165,7 +165,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
165
165
|
expect(body).toEqual({ accessToken: expect.any(String) });
|
|
166
166
|
});
|
|
167
167
|
});
|
|
168
|
-
describe('POST /login', () => {
|
|
168
|
+
describe('POST /auth/login', () => {
|
|
169
169
|
it('should throw an unauthorized exception if email is missing', async () => {
|
|
170
170
|
const { body, status } = await e2e_setup_1.server.post('/auth/login', { pass: 'test-2' });
|
|
171
171
|
expect(status).toBe(401);
|
|
@@ -189,7 +189,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
189
189
|
expect(body).toEqual({ accessToken: expect.any(String) });
|
|
190
190
|
});
|
|
191
191
|
});
|
|
192
|
-
describe('GET /account', () => {
|
|
192
|
+
describe('GET /auth/account', () => {
|
|
193
193
|
it('should throw an unauthorized exception if access token is missing', async () => {
|
|
194
194
|
const { body, status } = await e2e_setup_1.server.get('/auth/account');
|
|
195
195
|
expect(status).toBe(401);
|
|
@@ -208,9 +208,10 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
208
208
|
});
|
|
209
209
|
});
|
|
210
210
|
});
|
|
211
|
-
describe('useAuth with
|
|
211
|
+
describe('useAuth with jwt options', () => {
|
|
212
212
|
let jwtService;
|
|
213
213
|
let token;
|
|
214
|
+
let app;
|
|
214
215
|
let UserEntity = class UserEntity extends src_1.BaseEntity {
|
|
215
216
|
};
|
|
216
217
|
__decorate([
|
|
@@ -291,7 +292,8 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
291
292
|
});
|
|
292
293
|
});
|
|
293
294
|
});
|
|
294
|
-
describe('useAuth with
|
|
295
|
+
describe('useAuth with validation options', () => {
|
|
296
|
+
let app;
|
|
295
297
|
let UserEntity = class UserEntity extends src_1.BaseEntity {
|
|
296
298
|
};
|
|
297
299
|
__decorate([
|
|
@@ -325,7 +327,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
325
327
|
},
|
|
326
328
|
});
|
|
327
329
|
});
|
|
328
|
-
describe('POST /register', () => {
|
|
330
|
+
describe('POST /auth/register', () => {
|
|
329
331
|
it('should throw a bad request exception if payload contains non whitelisted property', async () => {
|
|
330
332
|
const { body, status } = await e2e_setup_1.server.post('/auth/register', { email: 'unit@test.co', password: 'Test-2', role: 'ADMIN' });
|
|
331
333
|
expect(status).toBe(400);
|
|
@@ -353,7 +355,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
353
355
|
expect(body).toEqual({ accessToken: expect.any(String) });
|
|
354
356
|
});
|
|
355
357
|
});
|
|
356
|
-
describe('POST /login', () => {
|
|
358
|
+
describe('POST /auth/login', () => {
|
|
357
359
|
beforeEach(async () => {
|
|
358
360
|
await e2e_setup_1.server.post('/auth/register', { email: 'unit@test.co', password: 'Test-2' });
|
|
359
361
|
});
|
|
@@ -390,7 +392,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
390
392
|
});
|
|
391
393
|
});
|
|
392
394
|
});
|
|
393
|
-
describe('POST /register with register options', () => {
|
|
395
|
+
describe('POST /auth/register with register options', () => {
|
|
394
396
|
let User = class User extends src_1.BaseEntity {
|
|
395
397
|
constructor() {
|
|
396
398
|
super(...arguments);
|
|
@@ -515,7 +517,7 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
515
517
|
});
|
|
516
518
|
});
|
|
517
519
|
});
|
|
518
|
-
describe('POST /login with login options', () => {
|
|
520
|
+
describe('POST /auth/login with login options', () => {
|
|
519
521
|
let User = class User extends src_1.BaseEntity {
|
|
520
522
|
constructor() {
|
|
521
523
|
super(...arguments);
|
|
@@ -626,5 +628,191 @@ describe('DynamicApiModule forRoot (e2e)', () => {
|
|
|
626
628
|
});
|
|
627
629
|
});
|
|
628
630
|
});
|
|
631
|
+
describe('useAuth with resetPassword options', () => {
|
|
632
|
+
let User = class User extends src_1.BaseEntity {
|
|
633
|
+
};
|
|
634
|
+
__decorate([
|
|
635
|
+
(0, mongoose_1.Prop)({ type: String, required: true }),
|
|
636
|
+
__metadata("design:type", String)
|
|
637
|
+
], User.prototype, "email", void 0);
|
|
638
|
+
__decorate([
|
|
639
|
+
(0, mongoose_1.Prop)({ type: String, required: true }),
|
|
640
|
+
__metadata("design:type", String)
|
|
641
|
+
], User.prototype, "password", void 0);
|
|
642
|
+
__decorate([
|
|
643
|
+
(0, mongoose_1.Prop)({ type: Boolean, default: false }),
|
|
644
|
+
__metadata("design:type", Boolean)
|
|
645
|
+
], User.prototype, "isVerified", void 0);
|
|
646
|
+
__decorate([
|
|
647
|
+
(0, mongoose_1.Prop)({ type: String }),
|
|
648
|
+
__metadata("design:type", String)
|
|
649
|
+
], User.prototype, "resetPasswordToken", void 0);
|
|
650
|
+
User = __decorate([
|
|
651
|
+
(0, mongoose_1.Schema)({ collection: 'users' })
|
|
652
|
+
], User);
|
|
653
|
+
let model;
|
|
654
|
+
let user;
|
|
655
|
+
let client;
|
|
656
|
+
let app;
|
|
657
|
+
beforeEach(async () => {
|
|
658
|
+
user = { email: 'user@test.co', password: 'user', isVerified: true };
|
|
659
|
+
client = { email: 'client@test.co', password: 'client' };
|
|
660
|
+
const bcryptService = new src_1.BcryptService();
|
|
661
|
+
const fixtures = async (_) => {
|
|
662
|
+
model = await (0, utils_1.getModelFromEntity)(User);
|
|
663
|
+
await model.insertMany([
|
|
664
|
+
{ ...user, password: await bcryptService.hashPassword(user.password) },
|
|
665
|
+
{ ...client, password: await bcryptService.hashPassword(client.password) },
|
|
666
|
+
]);
|
|
667
|
+
};
|
|
668
|
+
app = await initModule({
|
|
669
|
+
useAuth: {
|
|
670
|
+
userEntity: User,
|
|
671
|
+
resetPassword: {
|
|
672
|
+
emailField: 'email',
|
|
673
|
+
expirationInMinutes: 1,
|
|
674
|
+
resetPasswordCallback: async ({ resetPasswordToken }, { updateUserByEmail }) => {
|
|
675
|
+
await updateUserByEmail({ $set: { resetPasswordToken } });
|
|
676
|
+
},
|
|
677
|
+
changePasswordAbilityPredicate: (user) => user.isVerified && !!user.resetPasswordToken,
|
|
678
|
+
changePasswordCallback: async (user, { updateOneDocument }) => {
|
|
679
|
+
await updateOneDocument(User, { _id: user.id }, { $unset: { resetPasswordToken: 1 } });
|
|
680
|
+
},
|
|
681
|
+
},
|
|
682
|
+
},
|
|
683
|
+
}, fixtures);
|
|
684
|
+
});
|
|
685
|
+
describe('POST /auth/reset-password', () => {
|
|
686
|
+
it('should throw a bad request exception if email is missing', async () => {
|
|
687
|
+
const { body, status } = await e2e_setup_1.server.post('/auth/reset-password', {});
|
|
688
|
+
expect(status).toBe(400);
|
|
689
|
+
expect(body).toEqual({
|
|
690
|
+
error: 'Bad Request',
|
|
691
|
+
message: [
|
|
692
|
+
'email must be an email',
|
|
693
|
+
'email should not be empty',
|
|
694
|
+
'email must be a string',
|
|
695
|
+
],
|
|
696
|
+
statusCode: 400,
|
|
697
|
+
});
|
|
698
|
+
});
|
|
699
|
+
it('should throw a bad request exception if email is invalid', async () => {
|
|
700
|
+
const { body, status } = await e2e_setup_1.server.post('/auth/reset-password', { email: 'unit.test.co' });
|
|
701
|
+
expect(status).toBe(400);
|
|
702
|
+
expect(body).toEqual({
|
|
703
|
+
error: 'Bad Request',
|
|
704
|
+
message: ['email must be an email'],
|
|
705
|
+
statusCode: 400,
|
|
706
|
+
});
|
|
707
|
+
});
|
|
708
|
+
it('should not throw an exception if email is not found', async () => {
|
|
709
|
+
const { body, status } = await e2e_setup_1.server.post('/auth/reset-password', { email: 'invalid@test.co' });
|
|
710
|
+
expect(status).toBe(204);
|
|
711
|
+
expect(body).toEqual({});
|
|
712
|
+
});
|
|
713
|
+
describe('resetPasswordCallback', () => {
|
|
714
|
+
it('should set resetPasswordToken if email is valid', async () => {
|
|
715
|
+
const { email } = user;
|
|
716
|
+
const { resetPasswordToken: resetPasswordTokenBeforeUpdate } = (await model.findOne({ email }).lean().exec());
|
|
717
|
+
const { status } = await e2e_setup_1.server.post('/auth/reset-password', { email });
|
|
718
|
+
const { resetPasswordToken: resetPasswordTokenAfterUpdate } = (await model.findOne({ email }).lean().exec());
|
|
719
|
+
expect(status).toBe(204);
|
|
720
|
+
expect(resetPasswordTokenBeforeUpdate).toStrictEqual(undefined);
|
|
721
|
+
expect(resetPasswordTokenAfterUpdate).toStrictEqual(expect.any(String));
|
|
722
|
+
});
|
|
723
|
+
});
|
|
724
|
+
});
|
|
725
|
+
describe('PATCH /auth/change-password', () => {
|
|
726
|
+
it('should throw a bad request exception if resetPasswordToken is missing', async () => {
|
|
727
|
+
const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { newPassword: 'test' });
|
|
728
|
+
expect(status).toBe(400);
|
|
729
|
+
expect(body).toEqual({
|
|
730
|
+
error: 'Bad Request',
|
|
731
|
+
message: [
|
|
732
|
+
'resetPasswordToken should not be empty',
|
|
733
|
+
'resetPasswordToken must be a string',
|
|
734
|
+
],
|
|
735
|
+
statusCode: 400,
|
|
736
|
+
});
|
|
737
|
+
});
|
|
738
|
+
it('should throw a bad request exception if newPassword is missing', async () => {
|
|
739
|
+
const { email } = user;
|
|
740
|
+
await e2e_setup_1.server.post('/auth/reset-password', { email });
|
|
741
|
+
const { resetPasswordToken: resetPasswordTokenAfterUpdate } = (await model.findOne({ email }).lean().exec());
|
|
742
|
+
const resetPasswordToken = resetPasswordTokenAfterUpdate;
|
|
743
|
+
const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken });
|
|
744
|
+
expect(status).toBe(400);
|
|
745
|
+
expect(body).toEqual({
|
|
746
|
+
error: 'Bad Request',
|
|
747
|
+
message: [
|
|
748
|
+
'newPassword should not be empty',
|
|
749
|
+
'newPassword must be a string',
|
|
750
|
+
],
|
|
751
|
+
statusCode: 400,
|
|
752
|
+
});
|
|
753
|
+
});
|
|
754
|
+
it('should throw an unauthorized exception if resetPasswordToken is invalid', async () => {
|
|
755
|
+
const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken: 'test', newPassword: 'newPassword' });
|
|
756
|
+
expect(status).toBe(400);
|
|
757
|
+
expect(body).toEqual({
|
|
758
|
+
error: 'Bad Request',
|
|
759
|
+
message: 'Invalid reset password token. Please redo the reset password process.',
|
|
760
|
+
statusCode: 400,
|
|
761
|
+
});
|
|
762
|
+
});
|
|
763
|
+
it('should throw an unauthorized exception if resetPasswordToken is expired', async () => {
|
|
764
|
+
const jwtService = app.get(jwt_1.JwtService);
|
|
765
|
+
const expiredResetPasswordToken = jwtService.sign({ email: user.email }, { expiresIn: 1 });
|
|
766
|
+
await (0, utils_1.wait)(500);
|
|
767
|
+
const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken: expiredResetPasswordToken, newPassword: 'newPassword' });
|
|
768
|
+
expect(status).toBe(401);
|
|
769
|
+
expect(body).toEqual({
|
|
770
|
+
error: 'Unauthorized',
|
|
771
|
+
message: 'Time to reset password has expired. Please redo the reset password process.',
|
|
772
|
+
statusCode: 401,
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
describe('changePasswordAbilityPredicate', () => {
|
|
776
|
+
let resetPasswordToken;
|
|
777
|
+
beforeEach(async () => {
|
|
778
|
+
await e2e_setup_1.server.post('/auth/reset-password', { email: client.email });
|
|
779
|
+
const { resetPasswordToken: token } = (await model.findOne({ email: client.email }).lean().exec());
|
|
780
|
+
resetPasswordToken = token;
|
|
781
|
+
});
|
|
782
|
+
it('should throw a forbidden exception if user is not allowed to change password', async () => {
|
|
783
|
+
expect(resetPasswordToken).toStrictEqual(expect.any(String));
|
|
784
|
+
const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken, newPassword: 'newPassword' });
|
|
785
|
+
expect(status).toBe(403);
|
|
786
|
+
expect(body).toEqual({
|
|
787
|
+
error: 'Forbidden',
|
|
788
|
+
message: 'You are not allowed to change your password.',
|
|
789
|
+
statusCode: 403,
|
|
790
|
+
});
|
|
791
|
+
});
|
|
792
|
+
});
|
|
793
|
+
describe('changePasswordCallback', () => {
|
|
794
|
+
let resetPasswordToken;
|
|
795
|
+
beforeEach(async () => {
|
|
796
|
+
await e2e_setup_1.server.post('/auth/reset-password', { email: user.email });
|
|
797
|
+
const { resetPasswordToken: token } = (await model.findOne({ email: user.email }).lean().exec());
|
|
798
|
+
resetPasswordToken = token;
|
|
799
|
+
});
|
|
800
|
+
it('should change password and unset resetPasswordToken if resetPasswordToken is valid', async () => {
|
|
801
|
+
expect(resetPasswordToken).toStrictEqual(expect.any(String));
|
|
802
|
+
const newPassword = 'newPassword';
|
|
803
|
+
const bcryptService = app.get(src_1.BcryptService);
|
|
804
|
+
const { password: passwordBeforeUpdate } = (await model.findOne({ email: user.email }).lean().exec());
|
|
805
|
+
const { status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken, newPassword });
|
|
806
|
+
const { password: passwordAfterUpdate, resetPasswordToken: tokenAfterUpdate } = (await model.findOne({ email: user.email }).lean().exec());
|
|
807
|
+
const isPreviousPassword = await bcryptService.comparePassword(user.password, passwordBeforeUpdate);
|
|
808
|
+
expect(isPreviousPassword).toBe(true);
|
|
809
|
+
const isNewPassword = await bcryptService.comparePassword(newPassword, passwordAfterUpdate);
|
|
810
|
+
expect(isNewPassword).toBe(true);
|
|
811
|
+
expect(status).toBe(204);
|
|
812
|
+
expect(tokenAfterUpdate).toStrictEqual(undefined);
|
|
813
|
+
});
|
|
814
|
+
});
|
|
815
|
+
});
|
|
816
|
+
});
|
|
629
817
|
});
|
|
630
818
|
//# sourceMappingURL=dynamic-api-for-root.e2e-spec.js.map
|