mongodb-dynamic-api 3.2.1 → 4.0.0
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 +54 -0
- package/README.md +34 -3
- package/package.json +5 -2
- package/src/adapters/socket-adapter.d.ts +3 -3
- package/src/adapters/socket-adapter.js.map +1 -1
- package/src/builders/route-decorators/auth-decorators.builder.d.ts +1 -1
- package/src/builders/route-decorators/route-decorators.builder.d.ts +1 -1
- package/src/builders/route-decorators/route-decorators.builder.js.map +1 -1
- package/src/decorators/validator-pipe.decorator.js.map +1 -1
- package/src/dynamic-api.module.js +4 -1
- package/src/dynamic-api.module.js.map +1 -1
- package/src/guards/jwt-socket.guard.js +1 -1
- package/src/guards/jwt-socket.guard.js.map +1 -1
- package/src/helpers/swagger-config.helper.js.map +1 -1
- package/src/interceptors/dynamic-api-cache.interceptor.d.ts +3 -2
- package/src/interceptors/dynamic-api-cache.interceptor.js +4 -0
- package/src/interceptors/dynamic-api-cache.interceptor.js.map +1 -1
- package/src/interfaces/dynamic-api-decorator-builder.interface.d.ts +1 -1
- package/src/interfaces/dynamic-api-global-state.interface.d.ts +3 -0
- package/src/interfaces/dynamic-api-swagger-options.type.d.ts +1 -1
- package/src/modules/auth/auth-broadcast.helper.d.ts +3 -0
- package/src/modules/auth/auth-broadcast.helper.js +11 -0
- package/src/modules/auth/auth-broadcast.helper.js.map +1 -0
- package/src/modules/auth/auth-events.constants.d.ts +13 -0
- package/src/modules/auth/auth-events.constants.js +28 -0
- package/src/modules/auth/auth-events.constants.js.map +1 -0
- package/src/modules/auth/auth.helper.d.ts +19 -5
- package/src/modules/auth/auth.helper.js +15 -8
- package/src/modules/auth/auth.helper.js.map +1 -1
- package/src/modules/auth/auth.module.d.ts +5 -2
- package/src/modules/auth/auth.module.js +45 -6
- package/src/modules/auth/auth.module.js.map +1 -1
- package/src/modules/auth/guards/index.d.ts +2 -0
- package/src/modules/auth/guards/index.js +2 -0
- package/src/modules/auth/guards/index.js.map +1 -1
- package/src/modules/auth/guards/jwt-refresh/jwt-refresh.guard.d.ts +4 -0
- package/src/modules/auth/guards/jwt-refresh/jwt-refresh.guard.js +18 -0
- package/src/modules/auth/guards/jwt-refresh/jwt-refresh.guard.js.map +1 -0
- package/src/modules/auth/guards/jwt-socket-auth/jwt-socket-auth.guard.js +1 -1
- package/src/modules/auth/guards/jwt-socket-auth/jwt-socket-auth.guard.js.map +1 -1
- package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.d.ts +8 -0
- package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.js +62 -0
- package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.js.map +1 -0
- package/src/modules/auth/index.d.ts +2 -0
- package/src/modules/auth/index.js +2 -0
- package/src/modules/auth/index.js.map +1 -1
- package/src/modules/auth/interfaces/auth-controller.interface.d.ts +19 -4
- package/src/modules/auth/interfaces/auth-gateway.interface.d.ts +2 -0
- package/src/modules/auth/interfaces/auth-options.interface.d.ts +19 -2
- package/src/modules/auth/interfaces/auth-service.interface.d.ts +3 -0
- package/src/modules/auth/mixins/auth-controller.mixin.d.ts +2 -2
- package/src/modules/auth/mixins/auth-controller.mixin.js +112 -18
- package/src/modules/auth/mixins/auth-controller.mixin.js.map +1 -1
- package/src/modules/auth/mixins/auth-gateway.mixin.d.ts +2 -2
- package/src/modules/auth/mixins/auth-gateway.mixin.js +65 -31
- package/src/modules/auth/mixins/auth-gateway.mixin.js.map +1 -1
- package/src/modules/auth/services/base-auth.service.d.ts +9 -0
- package/src/modules/auth/services/base-auth.service.js +74 -15
- package/src/modules/auth/services/base-auth.service.js.map +1 -1
- package/src/modules/auth/strategies/index.d.ts +1 -0
- package/src/modules/auth/strategies/index.js +1 -0
- package/src/modules/auth/strategies/index.js.map +1 -1
- package/src/modules/auth/strategies/jwt-refresh.strategy.d.ts +14 -0
- package/src/modules/auth/strategies/jwt-refresh.strategy.js +45 -0
- package/src/modules/auth/strategies/jwt-refresh.strategy.js.map +1 -0
- package/src/modules/auth/strategies/jwt.strategy.d.ts +3 -1
- package/src/modules/auth/strategies/jwt.strategy.js.map +1 -1
- package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
- package/src/routes/create-many/base-create-many.service.js.map +1 -1
- package/src/routes/create-one/base-create-one.service.js.map +1 -1
- package/src/routes/delete-many/base-delete-many.service.js.map +1 -1
- package/src/routes/delete-one/base-delete-one.service.js.map +1 -1
- package/src/routes/duplicate-many/base-duplicate-many.service.js +4 -3
- package/src/routes/duplicate-many/base-duplicate-many.service.js.map +1 -1
- package/src/routes/duplicate-one/base-duplicate-one.service.js +3 -2
- package/src/routes/duplicate-one/base-duplicate-one.service.js.map +1 -1
- package/src/routes/get-many/base-get-many.service.js.map +1 -1
- package/src/routes/get-one/base-get-one.service.js.map +1 -1
- package/src/routes/replace-one/base-replace-one.service.js +3 -2
- package/src/routes/replace-one/base-replace-one.service.js.map +1 -1
- package/src/routes/update-many/base-update-many.service.js.map +1 -1
- package/src/routes/update-one/base-update-one.service.js.map +1 -1
- package/src/services/base/base.service.d.ts +3 -3
- package/src/services/base/base.service.js +26 -8
- 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/e2e.setup.d.ts +3 -2
- package/test/e2e.setup.js +5 -4
- package/test/e2e.setup.js.map +1 -1
- package/test/for-feature/base-entity.e2e-spec.js +316 -0
- package/test/for-feature/base-entity.e2e-spec.js.map +1 -0
- package/test/for-feature/http-broadcast.e2e-spec.js +187 -0
- package/test/for-feature/http-broadcast.e2e-spec.js.map +1 -0
- package/test/for-feature/soft-deletable-entity.e2e-spec.d.ts +1 -0
- package/test/for-feature/soft-deletable-entity.e2e-spec.js +335 -0
- package/test/for-feature/soft-deletable-entity.e2e-spec.js.map +1 -0
- package/test/for-feature/websockets.e2e-spec.d.ts +1 -0
- package/test/for-feature/websockets.e2e-spec.js +324 -0
- package/test/for-feature/websockets.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-basic.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-basic.e2e-spec.js +338 -0
- package/test/for-root/auth-api-basic.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-broadcast.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-broadcast.e2e-spec.js +82 -0
- package/test/for-root/auth-api-broadcast.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-login.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-login.e2e-spec.js +103 -0
- package/test/for-root/auth-api-login.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-logout.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-logout.e2e-spec.js +74 -0
- package/test/for-root/auth-api-logout.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.js +110 -0
- package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-refresh-token.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-refresh-token.e2e-spec.js +153 -0
- package/test/for-root/auth-api-refresh-token.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-register.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-register.e2e-spec.js +116 -0
- package/test/for-root/auth-api-register.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-reset-password.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-reset-password.e2e-spec.js +168 -0
- package/test/for-root/auth-api-reset-password.e2e-spec.js.map +1 -0
- package/test/for-root/initialization.e2e-spec.d.ts +1 -0
- package/test/for-root/initialization.e2e-spec.js +84 -0
- package/test/for-root/initialization.e2e-spec.js.map +1 -0
- package/test/for-root/websockets-auth-basic.e2e-spec.d.ts +1 -0
- package/test/for-root/websockets-auth-basic.e2e-spec.js +313 -0
- package/test/for-root/websockets-auth-basic.e2e-spec.js.map +1 -0
- package/test/for-root/websockets-auth-broadcast.e2e-spec.d.ts +1 -0
- package/test/for-root/websockets-auth-broadcast.e2e-spec.js +86 -0
- package/test/for-root/websockets-auth-broadcast.e2e-spec.js.map +1 -0
- package/test/for-root/websockets-auth-login.e2e-spec.d.ts +1 -0
- package/test/for-root/websockets-auth-login.e2e-spec.js +107 -0
- package/test/for-root/websockets-auth-login.e2e-spec.js.map +1 -0
- package/test/for-root/websockets-auth-refresh-token.e2e-spec.d.ts +1 -0
- package/test/for-root/websockets-auth-refresh-token.e2e-spec.js +104 -0
- package/test/for-root/websockets-auth-refresh-token.e2e-spec.js.map +1 -0
- package/test/for-root/websockets-auth-register.e2e-spec.d.ts +1 -0
- package/test/for-root/websockets-auth-register.e2e-spec.js +131 -0
- package/test/for-root/websockets-auth-register.e2e-spec.js.map +1 -0
- package/test/for-root/websockets-auth-reset-password.e2e-spec.d.ts +1 -0
- package/test/for-root/websockets-auth-reset-password.e2e-spec.js +164 -0
- package/test/for-root/websockets-auth-reset-password.e2e-spec.js.map +1 -0
- package/test/shared/entities/basic-user.factory.d.ts +12 -0
- package/test/shared/entities/basic-user.factory.js +31 -0
- package/test/shared/entities/basic-user.factory.js.map +1 -0
- package/test/shared/entities/broadcast-user.factory.d.ts +13 -0
- package/test/shared/entities/broadcast-user.factory.js +35 -0
- package/test/shared/entities/broadcast-user.factory.js.map +1 -0
- package/test/shared/entities/index.d.ts +7 -0
- package/test/shared/entities/index.js +24 -0
- package/test/shared/entities/index.js.map +1 -0
- package/test/shared/entities/login-user.factory.d.ts +14 -0
- package/test/shared/entities/login-user.factory.js +39 -0
- package/test/shared/entities/login-user.factory.js.map +1 -0
- package/test/shared/entities/refresh-token-user.factory.d.ts +13 -0
- package/test/shared/entities/refresh-token-user.factory.js +35 -0
- package/test/shared/entities/refresh-token-user.factory.js.map +1 -0
- package/test/shared/entities/register-user.factory.d.ts +14 -0
- package/test/shared/entities/register-user.factory.js +39 -0
- package/test/shared/entities/register-user.factory.js.map +1 -0
- package/test/shared/entities/reset-password-user.factory.d.ts +14 -0
- package/test/shared/entities/reset-password-user.factory.js +39 -0
- package/test/shared/entities/reset-password-user.factory.js.map +1 -0
- package/test/shared/entities/validated-user.factory.d.ts +12 -0
- package/test/shared/entities/validated-user.factory.js +40 -0
- package/test/shared/entities/validated-user.factory.js.map +1 -0
- package/test/shared/fixtures/index.d.ts +2 -0
- package/test/shared/fixtures/index.js +19 -0
- package/test/shared/fixtures/index.js.map +1 -0
- package/test/shared/fixtures/login.fixtures.d.ts +16 -0
- package/test/shared/fixtures/login.fixtures.js +20 -0
- package/test/shared/fixtures/login.fixtures.js.map +1 -0
- package/test/shared/fixtures/register.fixtures.d.ts +10 -0
- package/test/shared/fixtures/register.fixtures.js +14 -0
- package/test/shared/fixtures/register.fixtures.js.map +1 -0
- package/test/shared/index.d.ts +4 -0
- package/test/shared/index.js +24 -0
- package/test/shared/index.js.map +1 -0
- package/test/shared/init-app.d.ts +3 -0
- package/test/shared/init-app.js +19 -0
- package/test/shared/init-app.js.map +1 -0
- package/test/shared/init-module.d.ts +4 -0
- package/test/shared/init-module.js +16 -0
- package/test/shared/init-module.js.map +1 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/test/dynamic-api-for-feature.e2e-spec.js +0 -1100
- package/test/dynamic-api-for-feature.e2e-spec.js.map +0 -1
- package/test/dynamic-api-for-root.e2e-spec.js +0 -1573
- package/test/dynamic-api-for-root.e2e-spec.js.map +0 -1
- /package/test/{dynamic-api-for-feature.e2e-spec.d.ts → for-feature/base-entity.e2e-spec.d.ts} +0 -0
- /package/test/{dynamic-api-for-root.e2e-spec.d.ts → for-feature/http-broadcast.e2e-spec.d.ts} +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const mongoose_1 = require("mongoose");
|
|
4
|
+
const src_1 = require("../../src");
|
|
5
|
+
const socket_adapter_1 = require("../../src/adapters/socket-adapter");
|
|
6
|
+
const e2e_setup_1 = require("../e2e.setup");
|
|
7
|
+
require("dotenv/config");
|
|
8
|
+
const shared_1 = require("../shared");
|
|
9
|
+
describe('DynamicApiModule forRoot - Websockets useAuth with broadcast options (e2e)', () => {
|
|
10
|
+
const UserEntity = (0, shared_1.createBroadcastUserEntity)();
|
|
11
|
+
let wsAccessToken;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
src_1.DynamicApiModule.state['resetState']();
|
|
14
|
+
});
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
|
|
17
|
+
});
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
await (0, shared_1.initModule)({
|
|
20
|
+
useAuth: {
|
|
21
|
+
userEntity: UserEntity,
|
|
22
|
+
login: {
|
|
23
|
+
loginField: 'email',
|
|
24
|
+
passwordField: 'password',
|
|
25
|
+
broadcast: { enabled: true, fields: ['id', 'email'] },
|
|
26
|
+
},
|
|
27
|
+
register: {
|
|
28
|
+
broadcast: { enabled: true, fields: ['id', 'email'] },
|
|
29
|
+
},
|
|
30
|
+
getAccount: {
|
|
31
|
+
broadcast: { enabled: true, fields: ['id', 'email'] },
|
|
32
|
+
},
|
|
33
|
+
updateAccount: {
|
|
34
|
+
broadcast: { enabled: true, fields: ['id', 'email'] },
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
webSocket: true,
|
|
38
|
+
}, undefined, async (app) => {
|
|
39
|
+
app.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(app));
|
|
40
|
+
});
|
|
41
|
+
const { accessToken } = await e2e_setup_1.server.emit('auth-register', { email: 'broadcast-ws@test.co', password: 'ws-pass' });
|
|
42
|
+
wsAccessToken = accessToken;
|
|
43
|
+
jest.clearAllMocks();
|
|
44
|
+
});
|
|
45
|
+
it('[auth-login] should broadcast user data when login via WS with enabled broadcast', async () => {
|
|
46
|
+
await e2e_setup_1.server.emit('auth-login', { email: 'broadcast-ws@test.co', password: 'ws-pass' }, { expectBroadcast: true, broadcastEvent: 'auth-login-broadcast' });
|
|
47
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
|
|
48
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
|
|
49
|
+
event: 'auth-login-broadcast',
|
|
50
|
+
data: expect.arrayContaining([
|
|
51
|
+
expect.objectContaining({ email: 'broadcast-ws@test.co' }),
|
|
52
|
+
]),
|
|
53
|
+
}));
|
|
54
|
+
});
|
|
55
|
+
it('[auth-register] should broadcast user data when register via WS with enabled broadcast', async () => {
|
|
56
|
+
await e2e_setup_1.server.emit('auth-register', { email: 'broadcast-ws2@test.co', password: 'ws-pass2' }, { expectBroadcast: true, broadcastEvent: 'auth-register-broadcast' });
|
|
57
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
|
|
58
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
|
|
59
|
+
event: 'auth-register-broadcast',
|
|
60
|
+
data: expect.arrayContaining([
|
|
61
|
+
expect.objectContaining({ email: 'broadcast-ws2@test.co' }),
|
|
62
|
+
]),
|
|
63
|
+
}));
|
|
64
|
+
});
|
|
65
|
+
it('[auth-get-account] should broadcast account data when get account via WS with enabled broadcast', async () => {
|
|
66
|
+
await e2e_setup_1.server.emit('auth-get-account', {}, { accessToken: wsAccessToken, expectBroadcast: true, broadcastEvent: 'auth-get-account-broadcast' });
|
|
67
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
|
|
68
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
|
|
69
|
+
event: 'auth-get-account-broadcast',
|
|
70
|
+
data: expect.arrayContaining([
|
|
71
|
+
expect.objectContaining({ email: 'broadcast-ws@test.co' }),
|
|
72
|
+
]),
|
|
73
|
+
}));
|
|
74
|
+
});
|
|
75
|
+
it('[auth-update-account] should broadcast updated account data when update account via WS with enabled broadcast', async () => {
|
|
76
|
+
await e2e_setup_1.server.emit('auth-update-account', { name: 'WS Broadcast User' }, { accessToken: wsAccessToken, expectBroadcast: true, broadcastEvent: 'auth-update-account-broadcast' });
|
|
77
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
|
|
78
|
+
expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
|
|
79
|
+
event: 'auth-update-account-broadcast',
|
|
80
|
+
data: expect.arrayContaining([
|
|
81
|
+
expect.objectContaining({ email: 'broadcast-ws@test.co' }),
|
|
82
|
+
]),
|
|
83
|
+
}));
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=websockets-auth-broadcast.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websockets-auth-broadcast.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-broadcast.e2e-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const common_1 = require("@nestjs/common");
|
|
4
|
+
const mongoose_1 = require("mongoose");
|
|
5
|
+
const src_1 = require("../../src");
|
|
6
|
+
const socket_adapter_1 = require("../../src/adapters/socket-adapter");
|
|
7
|
+
const e2e_setup_1 = require("../e2e.setup");
|
|
8
|
+
require("dotenv/config");
|
|
9
|
+
const utils_1 = require("../utils");
|
|
10
|
+
const shared_1 = require("../shared");
|
|
11
|
+
describe('DynamicApiModule forRoot - Websockets EVENT auth-login with login options (e2e)', () => {
|
|
12
|
+
const User = (0, shared_1.createLoginUserEntity)();
|
|
13
|
+
const admin = shared_1.LOGIN_ADMIN;
|
|
14
|
+
const user = shared_1.LOGIN_USER;
|
|
15
|
+
const client = shared_1.LOGIN_CLIENT;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
src_1.DynamicApiModule.state['resetState']();
|
|
18
|
+
});
|
|
19
|
+
afterEach(async () => {
|
|
20
|
+
await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
|
|
21
|
+
});
|
|
22
|
+
beforeEach(async () => {
|
|
23
|
+
const bcryptService = new src_1.BcryptService();
|
|
24
|
+
const fixtures = async (_) => {
|
|
25
|
+
const model = await (0, utils_1.getModelFromEntity)(User);
|
|
26
|
+
await model.insertMany([
|
|
27
|
+
{ ...admin, pass: await bcryptService.hashPassword(admin.pass) },
|
|
28
|
+
{ ...user, pass: await bcryptService.hashPassword(user.pass) },
|
|
29
|
+
{ ...client, pass: await bcryptService.hashPassword(client.pass) },
|
|
30
|
+
]);
|
|
31
|
+
};
|
|
32
|
+
await (0, shared_1.initModule)({
|
|
33
|
+
useAuth: {
|
|
34
|
+
userEntity: User,
|
|
35
|
+
login: {
|
|
36
|
+
loginField: 'username',
|
|
37
|
+
passwordField: 'pass',
|
|
38
|
+
additionalFields: ['role', 'isVerified'],
|
|
39
|
+
abilityPredicate: (user) => user.role === 'admin' || user.role === 'user',
|
|
40
|
+
callback: async (user) => {
|
|
41
|
+
if (user.isVerified) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
throw new common_1.UnauthorizedException(`Hello ${user.username}, you must verify your account first!`);
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
webSocket: true,
|
|
49
|
+
}, fixtures, async (_) => {
|
|
50
|
+
_.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('loginField', () => {
|
|
54
|
+
it('should throw a ws exception if loginField is missing', async () => {
|
|
55
|
+
await e2e_setup_1.server.emit('auth-login', { pass: 'test' });
|
|
56
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
|
|
57
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
|
|
58
|
+
message: 'Unauthorized',
|
|
59
|
+
});
|
|
60
|
+
expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('passwordField', () => {
|
|
64
|
+
it('should throw an unauthorized exception if passwordField is missing', async () => {
|
|
65
|
+
await e2e_setup_1.server.emit('auth-login', { username: 'unit' });
|
|
66
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
|
|
67
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
|
|
68
|
+
message: 'Unauthorized',
|
|
69
|
+
});
|
|
70
|
+
expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('abilityPredicate', () => {
|
|
74
|
+
it('should throw a ws exception if user role is not admin or user', async () => {
|
|
75
|
+
const { username, pass } = client;
|
|
76
|
+
await e2e_setup_1.server.emit('auth-login', { username, pass });
|
|
77
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
|
|
78
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
|
|
79
|
+
message: 'Access denied',
|
|
80
|
+
});
|
|
81
|
+
expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('callback', () => {
|
|
85
|
+
it('should throw a ws exception if user is not verified', async () => {
|
|
86
|
+
const { username, pass } = user;
|
|
87
|
+
await e2e_setup_1.server.emit('auth-login', { username, pass });
|
|
88
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
|
|
89
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
|
|
90
|
+
message: 'Hello user, you must verify your account first!',
|
|
91
|
+
});
|
|
92
|
+
expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('additionalFields', () => {
|
|
96
|
+
it('should return additional fields', async () => {
|
|
97
|
+
const { username, pass } = admin;
|
|
98
|
+
const { accessToken } = await e2e_setup_1.server.emit('auth-login', { username, pass });
|
|
99
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
100
|
+
await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken });
|
|
101
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
102
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
|
|
103
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ id: expect.any(String), username: 'admin', role: 'admin', isVerified: true });
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=websockets-auth-login.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websockets-auth-login.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-login.e2e-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const jwt_1 = require("@nestjs/jwt");
|
|
4
|
+
const mongoose_1 = require("mongoose");
|
|
5
|
+
const src_1 = require("../../src");
|
|
6
|
+
const socket_adapter_1 = require("../../src/adapters/socket-adapter");
|
|
7
|
+
const e2e_setup_1 = require("../e2e.setup");
|
|
8
|
+
require("dotenv/config");
|
|
9
|
+
const utils_1 = require("../utils");
|
|
10
|
+
const shared_1 = require("../shared");
|
|
11
|
+
describe('DynamicApiModule forRoot - Websockets EVENT auth-refresh-token with refreshTokenExpiresIn (e2e)', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
src_1.DynamicApiModule.state['resetState']();
|
|
14
|
+
});
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
|
|
17
|
+
});
|
|
18
|
+
describe('with jwt.refreshTokenExpiresIn configured', () => {
|
|
19
|
+
let app;
|
|
20
|
+
let jwtService;
|
|
21
|
+
let wsAccessToken;
|
|
22
|
+
let wsRefreshToken;
|
|
23
|
+
beforeEach(async () => {
|
|
24
|
+
app = await (0, shared_1.initModule)({
|
|
25
|
+
useAuth: {
|
|
26
|
+
userEntity: (0, shared_1.createBasicUserEntity)(),
|
|
27
|
+
webSocket: true,
|
|
28
|
+
jwt: {
|
|
29
|
+
secret: 'test-secret',
|
|
30
|
+
expiresIn: '2s',
|
|
31
|
+
refreshTokenExpiresIn: '10s',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
}, undefined, async (_) => {
|
|
35
|
+
_.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
|
|
36
|
+
});
|
|
37
|
+
jwtService = app.get(jwt_1.JwtService);
|
|
38
|
+
const { accessToken, refreshToken } = await e2e_setup_1.server.emit('auth-register', { email: 'ws-refresh@test.co', password: 'test' });
|
|
39
|
+
wsAccessToken = accessToken;
|
|
40
|
+
wsRefreshToken = refreshToken;
|
|
41
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
42
|
+
});
|
|
43
|
+
it('should return { accessToken, refreshToken } with refresh token having longer expiration', async () => {
|
|
44
|
+
await e2e_setup_1.server.emit('auth-refresh-token', undefined, { refreshToken: wsRefreshToken });
|
|
45
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
46
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
|
|
47
|
+
const [responseData] = e2e_setup_1.handleSocketResponse.mock.calls[0];
|
|
48
|
+
expect(responseData).toHaveProperty('accessToken');
|
|
49
|
+
expect(responseData).toHaveProperty('refreshToken');
|
|
50
|
+
const newRefreshDecoded = jwtService.decode(responseData.refreshToken);
|
|
51
|
+
const accessDecoded = jwtService.decode(wsAccessToken);
|
|
52
|
+
expect(newRefreshDecoded.exp - newRefreshDecoded.iat).toBeGreaterThan(accessDecoded.exp - accessDecoded.iat);
|
|
53
|
+
});
|
|
54
|
+
it('should still issue a valid new access token after the original access token has expired', async () => {
|
|
55
|
+
await (0, utils_1.wait)(3000);
|
|
56
|
+
await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: wsAccessToken });
|
|
57
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({ message: 'Unauthorized' });
|
|
58
|
+
e2e_setup_1.handleSocketException.mockReset();
|
|
59
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
60
|
+
await e2e_setup_1.server.emit('auth-refresh-token', undefined, { refreshToken: wsRefreshToken });
|
|
61
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
62
|
+
const [refreshData] = e2e_setup_1.handleSocketResponse.mock.calls[0];
|
|
63
|
+
const newAccessToken = refreshData.accessToken;
|
|
64
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
65
|
+
await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: newAccessToken });
|
|
66
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
67
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith(expect.objectContaining({ email: 'ws-refresh@test.co' }));
|
|
68
|
+
}, 10000);
|
|
69
|
+
});
|
|
70
|
+
describe('without jwt.refreshTokenExpiresIn (defaults to 7d)', () => {
|
|
71
|
+
let app;
|
|
72
|
+
let jwtService;
|
|
73
|
+
let wsAccessToken;
|
|
74
|
+
let wsRefreshToken;
|
|
75
|
+
beforeEach(async () => {
|
|
76
|
+
app = await (0, shared_1.initModule)({
|
|
77
|
+
useAuth: {
|
|
78
|
+
userEntity: (0, shared_1.createBasicUserEntity)(),
|
|
79
|
+
webSocket: true,
|
|
80
|
+
jwt: {
|
|
81
|
+
secret: 'test-secret',
|
|
82
|
+
expiresIn: '1h',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
}, undefined, async (_) => {
|
|
86
|
+
_.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
|
|
87
|
+
});
|
|
88
|
+
jwtService = app.get(jwt_1.JwtService);
|
|
89
|
+
const { accessToken, refreshToken } = await e2e_setup_1.server.emit('auth-register', { email: 'ws-fallback@test.co', password: 'test' });
|
|
90
|
+
wsAccessToken = accessToken;
|
|
91
|
+
wsRefreshToken = refreshToken;
|
|
92
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
93
|
+
});
|
|
94
|
+
it('should return a refresh token with longer expiration than the access token (defaults to 7d)', async () => {
|
|
95
|
+
await e2e_setup_1.server.emit('auth-refresh-token', undefined, { refreshToken: wsRefreshToken });
|
|
96
|
+
const [responseData] = e2e_setup_1.handleSocketResponse.mock.calls[0];
|
|
97
|
+
expect(responseData).toHaveProperty('refreshToken');
|
|
98
|
+
const newRefreshDecoded = jwtService.decode(responseData.refreshToken);
|
|
99
|
+
const accessDecoded = jwtService.decode(wsAccessToken);
|
|
100
|
+
expect(newRefreshDecoded.exp - newRefreshDecoded.iat).toBeGreaterThan(accessDecoded.exp - accessDecoded.iat);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=websockets-auth-refresh-token.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websockets-auth-refresh-token.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-refresh-token.e2e-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const mongoose_1 = require("mongoose");
|
|
4
|
+
const src_1 = require("../../src");
|
|
5
|
+
const socket_adapter_1 = require("../../src/adapters/socket-adapter");
|
|
6
|
+
const e2e_setup_1 = require("../e2e.setup");
|
|
7
|
+
require("dotenv/config");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
const shared_1 = require("../shared");
|
|
10
|
+
describe('DynamicApiModule forRoot - Websockets EVENT auth-register with register options (e2e)', () => {
|
|
11
|
+
const User = (0, shared_1.createRegisterUserEntity)();
|
|
12
|
+
const admin = shared_1.REGISTER_ADMIN;
|
|
13
|
+
const user = shared_1.REGISTER_USER;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
src_1.DynamicApiModule.state['resetState']();
|
|
16
|
+
});
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
|
|
19
|
+
});
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
const bcryptService = new src_1.BcryptService();
|
|
22
|
+
const fixtures = async (_) => {
|
|
23
|
+
const model = await (0, utils_1.getModelFromEntity)(User);
|
|
24
|
+
await model.insertMany([
|
|
25
|
+
{ ...admin, password: await bcryptService.hashPassword(admin.password) },
|
|
26
|
+
{ ...user, password: await bcryptService.hashPassword(user.password) },
|
|
27
|
+
]);
|
|
28
|
+
};
|
|
29
|
+
await (0, shared_1.initModule)({
|
|
30
|
+
useAuth: {
|
|
31
|
+
userEntity: User,
|
|
32
|
+
register: {
|
|
33
|
+
protected: true,
|
|
34
|
+
abilityPredicate: (user) => user.isVerified,
|
|
35
|
+
additionalFields: ['role'],
|
|
36
|
+
callback: async (user, { updateOneDocument }) => {
|
|
37
|
+
if (user.role !== 'admin') {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
await updateOneDocument(User, { _id: user.id }, { $set: { isVerified: true } });
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
login: {
|
|
44
|
+
additionalFields: ['role', 'isVerified'],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
webSocket: true,
|
|
48
|
+
}, fixtures, async (_) => {
|
|
49
|
+
_.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('protected', () => {
|
|
53
|
+
it('should throw a ws exception if user is not logged in and protected is true', async () => {
|
|
54
|
+
await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' });
|
|
55
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
|
|
56
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
|
|
57
|
+
message: 'Unauthorized',
|
|
58
|
+
});
|
|
59
|
+
expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('abilityPredicate', () => {
|
|
63
|
+
it('should not create a new user if user is not verified', async () => {
|
|
64
|
+
const { email, password } = user;
|
|
65
|
+
const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
|
|
66
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
67
|
+
await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' }, {
|
|
68
|
+
accessToken,
|
|
69
|
+
});
|
|
70
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
|
|
71
|
+
expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
|
|
72
|
+
message: 'Access denied',
|
|
73
|
+
});
|
|
74
|
+
expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
|
|
75
|
+
});
|
|
76
|
+
it('should create a new user and return access token if user is verified', async () => {
|
|
77
|
+
const { email, password } = admin;
|
|
78
|
+
const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
|
|
79
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
80
|
+
await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' }, {
|
|
81
|
+
accessToken,
|
|
82
|
+
});
|
|
83
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
84
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
|
|
85
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ accessToken: expect.any(String), refreshToken: expect.any(String) });
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('additionalFields', () => {
|
|
89
|
+
it('should allow to register a new user with additional fields', async () => {
|
|
90
|
+
const { email, password } = admin;
|
|
91
|
+
const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
|
|
92
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
93
|
+
await e2e_setup_1.server.emit('auth-register', { email: 'client@test.co', password: 'client', role: 'client' }, {
|
|
94
|
+
accessToken,
|
|
95
|
+
});
|
|
96
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
97
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
|
|
98
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ accessToken: expect.any(String), refreshToken: expect.any(String) });
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('callback', () => {
|
|
102
|
+
let adminAccessToken;
|
|
103
|
+
beforeEach(async () => {
|
|
104
|
+
const { email, password } = admin;
|
|
105
|
+
const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
|
|
106
|
+
adminAccessToken = accessToken;
|
|
107
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
108
|
+
});
|
|
109
|
+
it('should not set isVerified to true if role is not admin', async () => {
|
|
110
|
+
const { accessToken: clientAccessToken } = await e2e_setup_1.server.emit('auth-register', { email: 'client@test.co', password: 'client', role: 'client' }, {
|
|
111
|
+
accessToken: adminAccessToken,
|
|
112
|
+
});
|
|
113
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
114
|
+
const body = await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: clientAccessToken });
|
|
115
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
116
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
|
|
117
|
+
expect(body).toHaveProperty('isVerified', false);
|
|
118
|
+
});
|
|
119
|
+
it('should set isVerified to true if role is admin', async () => {
|
|
120
|
+
const { accessToken: admin2AccessToken } = await e2e_setup_1.server.emit('auth-register', { email: 'admin2@test.co', password: 'admin2', role: 'admin' }, {
|
|
121
|
+
accessToken: adminAccessToken,
|
|
122
|
+
});
|
|
123
|
+
e2e_setup_1.handleSocketResponse.mockReset();
|
|
124
|
+
const body = await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: admin2AccessToken });
|
|
125
|
+
expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
|
|
126
|
+
expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
|
|
127
|
+
expect(body).toHaveProperty('isVerified', true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=websockets-auth-register.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websockets-auth-register.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-register.e2e-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'dotenv/config';
|