@ackplus/nest-auth 1.1.18 → 1.1.20
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/package.json +1 -1
- package/src/lib/admin-console/static/index.html +697 -177
- package/src/lib/audit/services/audit.service.d.ts +15 -0
- package/src/lib/audit/services/audit.service.d.ts.map +1 -0
- package/src/lib/audit/services/audit.service.js +143 -0
- package/src/lib/auth/controllers/auth.controller.d.ts +1 -1
- package/src/lib/auth/controllers/mfa.controller.js +5 -5
- package/src/lib/auth/dto/responses/mfa-status.response.dto.d.ts +2 -2
- package/src/lib/auth/dto/responses/mfa-status.response.dto.d.ts.map +1 -1
- package/src/lib/auth/dto/responses/mfa-status.response.dto.js +5 -5
- package/src/lib/auth/events/index.d.ts +13 -0
- package/src/lib/auth/events/index.d.ts.map +1 -0
- package/src/lib/auth/events/index.js +15 -0
- package/src/lib/auth/events/user-2fa-disabled.event.d.ts +10 -0
- package/src/lib/auth/events/user-2fa-disabled.event.d.ts.map +1 -0
- package/src/lib/auth/events/user-2fa-disabled.event.js +12 -0
- package/src/lib/auth/events/user-2fa-enabled.event.d.ts +13 -0
- package/src/lib/auth/events/user-2fa-enabled.event.d.ts.map +1 -0
- package/src/lib/auth/events/user-2fa-enabled.event.js +15 -0
- package/src/lib/auth/events/user-password-changed.event.d.ts +12 -0
- package/src/lib/auth/events/user-password-changed.event.d.ts.map +1 -0
- package/src/lib/auth/events/user-password-changed.event.js +15 -0
- package/src/lib/auth/guards/auth.guard.d.ts +19 -1
- package/src/lib/auth/guards/auth.guard.d.ts.map +1 -1
- package/src/lib/auth/guards/auth.guard.js +113 -25
- package/src/lib/auth/services/auth.service.d.ts +10 -6
- package/src/lib/auth/services/auth.service.d.ts.map +1 -1
- package/src/lib/auth/services/auth.service.js +313 -133
- package/src/lib/auth/services/mfa.service.d.ts +1 -1
- package/src/lib/auth/services/mfa.service.d.ts.map +1 -1
- package/src/lib/auth/services/mfa.service.js +46 -10
- package/src/lib/auth.constants.d.ts +181 -8
- package/src/lib/auth.constants.d.ts.map +1 -1
- package/src/lib/auth.constants.js +142 -10
- package/src/lib/core/interfaces/auth-module-options.interface.d.ts +170 -0
- package/src/lib/core/interfaces/auth-module-options.interface.d.ts.map +1 -1
- package/src/lib/core/interfaces/session-options.interface.d.ts +52 -0
- package/src/lib/core/interfaces/session-options.interface.d.ts.map +1 -1
- package/src/lib/core/interfaces/token-payload.interface.d.ts +14 -6
- package/src/lib/core/interfaces/token-payload.interface.d.ts.map +1 -1
- package/src/lib/core/services/auth-config.service.js +1 -1
- package/src/lib/nest-auth.module.d.ts.map +1 -1
- package/src/lib/nest-auth.module.js +5 -2
- package/src/lib/session/services/session-manager.service.d.ts +6 -6
- package/src/lib/session/services/session-manager.service.d.ts.map +1 -1
- package/src/lib/session/services/session-manager.service.js +54 -21
- package/src/lib/user/entities/user.entity.d.ts.map +1 -1
- package/src/lib/user/entities/user.entity.js +19 -0
- package/src/lib/user/services/user.service.d.ts +8 -6
- package/src/lib/user/services/user.service.d.ts.map +1 -1
- package/src/lib/user/services/user.service.js +51 -46
|
@@ -13,71 +13,75 @@ const user_deleted_event_1 = require("../events/user-deleted.event");
|
|
|
13
13
|
const user_created_event_1 = require("../events/user-created.event");
|
|
14
14
|
const tenant_1 = require("../../tenant");
|
|
15
15
|
const debug_logger_service_1 = require("../../core/services/debug-logger.service");
|
|
16
|
+
const auth_config_service_1 = require("../../core/services/auth-config.service");
|
|
16
17
|
let UserService = class UserService {
|
|
17
|
-
constructor(userRepository, eventEmitter,
|
|
18
|
+
constructor(userRepository, tenantService, eventEmitter, authConfigService, debugLogger) {
|
|
18
19
|
this.userRepository = userRepository;
|
|
19
|
-
this.eventEmitter = eventEmitter;
|
|
20
20
|
this.tenantService = tenantService;
|
|
21
|
+
this.eventEmitter = eventEmitter;
|
|
22
|
+
this.authConfigService = authConfigService;
|
|
21
23
|
this.debugLogger = debugLogger;
|
|
22
24
|
}
|
|
23
|
-
async createUser(data) {
|
|
25
|
+
async createUser(data, context) {
|
|
24
26
|
this.debugLogger.logFunctionEntry('createUser', 'UserService', { email: data.email, phone: data.phone, hasPassword: !!data.password });
|
|
25
27
|
try {
|
|
26
28
|
const { email, phone } = data;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
let { tenantId = null } = data;
|
|
30
|
+
// Resolve tenant ID
|
|
31
|
+
tenantId = await this.tenantService.resolveTenantId(tenantId);
|
|
32
|
+
data.tenantId = tenantId;
|
|
33
|
+
// Check if user already exists
|
|
34
|
+
if (email) {
|
|
35
|
+
const existingUser = await this.getUserByEmail(email, tenantId);
|
|
36
|
+
if (existingUser) {
|
|
37
|
+
this.debugLogger.warn('User with email already exists', 'UserService', { email, tenantId });
|
|
38
|
+
throw new common_1.ConflictException({
|
|
39
|
+
message: 'User with this email already exists',
|
|
40
|
+
code: 'USER_ALREADY_EXISTS'
|
|
41
|
+
});
|
|
42
|
+
}
|
|
36
43
|
}
|
|
37
|
-
// Check for existing user with same email or phone in the same tenant
|
|
38
|
-
this.debugLogger.debug('Checking for existing user', 'UserService', { email: !!email, phone: !!phone, tenantId });
|
|
39
|
-
let existingUser = null;
|
|
40
|
-
// Normalize email to lowercase for case-insensitive matching
|
|
41
|
-
const normalizedEmail = email ? email.toLowerCase().trim() : email;
|
|
42
44
|
if (phone) {
|
|
43
|
-
existingUser = await this.
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
const existingUser = await this.getUserByPhone(phone, tenantId);
|
|
46
|
+
if (existingUser) {
|
|
47
|
+
this.debugLogger.warn('User with phone already exists', 'UserService', { phone, tenantId });
|
|
48
|
+
throw new common_1.ConflictException({
|
|
49
|
+
message: 'User with this phone number already exists',
|
|
50
|
+
code: 'USER_ALREADY_EXISTS'
|
|
51
|
+
});
|
|
52
|
+
}
|
|
46
53
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
// Apply user.beforeCreate hook if configured
|
|
55
|
+
const config = this.authConfigService.getConfig();
|
|
56
|
+
if (config.user?.beforeCreate) {
|
|
57
|
+
this.debugLogger.debug('Applying user.beforeCreate hook', 'UserService');
|
|
58
|
+
data = await config.user.beforeCreate(data, context);
|
|
51
59
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
});
|
|
60
|
+
this.debugLogger.debug('Creating new user entity', 'UserService');
|
|
61
|
+
const user = this.userRepository.create(data);
|
|
62
|
+
// Handle password if provided in data (even though it's not a column)
|
|
63
|
+
if (data.password) {
|
|
64
|
+
await user.setPassword(data.password);
|
|
58
65
|
}
|
|
59
|
-
this.debugLogger.debug('Creating new user', 'UserService', { email: !!email, phone: !!phone, tenantId });
|
|
60
|
-
const user = this.userRepository.create({
|
|
61
|
-
...data,
|
|
62
|
-
email: normalizedEmail || data.email,
|
|
63
|
-
tenantId
|
|
64
|
-
});
|
|
65
66
|
await this.userRepository.save(user);
|
|
66
|
-
this.debugLogger.info('User created successfully', 'UserService', { userId: user.id
|
|
67
|
-
// Create
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
this.debugLogger.info('User created successfully', 'UserService', { userId: user.id });
|
|
68
|
+
// Create identities
|
|
69
|
+
const normalizedEmail = email?.toLowerCase().trim();
|
|
70
|
+
if (normalizedEmail)
|
|
70
71
|
await user.findOrCreateIdentity(auth_constants_1.EMAIL_AUTH_PROVIDER, normalizedEmail);
|
|
71
|
-
|
|
72
|
-
if (phone) {
|
|
73
|
-
this.debugLogger.debug('Creating phone identity', 'UserService', { userId: user.id });
|
|
72
|
+
if (phone)
|
|
74
73
|
await user.findOrCreateIdentity(auth_constants_1.PHONE_AUTH_PROVIDER, phone);
|
|
75
|
-
}
|
|
76
74
|
// Emit user created event
|
|
77
75
|
this.debugLogger.debug('Emitting user created event', 'UserService', { userId: user.id });
|
|
78
76
|
await this.eventEmitter.emitAsync(auth_constants_1.NestAuthEvents.USER_CREATED, new user_created_event_1.UserCreatedEvent({
|
|
79
|
-
user
|
|
77
|
+
user,
|
|
78
|
+
tenantId: user.tenantId
|
|
80
79
|
}));
|
|
80
|
+
// Apply user.afterCreate hook if configured
|
|
81
|
+
if (config.user?.afterCreate) {
|
|
82
|
+
this.debugLogger.debug('Applying user.afterCreate hook', 'UserService', { userId: user.id });
|
|
83
|
+
await config.user.afterCreate(user);
|
|
84
|
+
}
|
|
81
85
|
this.debugLogger.logFunctionExit('createUser', 'UserService', { userId: user.id });
|
|
82
86
|
return user;
|
|
83
87
|
}
|
|
@@ -338,7 +342,8 @@ exports.UserService = UserService = tslib_1.__decorate([
|
|
|
338
342
|
(0, common_1.Injectable)(),
|
|
339
343
|
tslib_1.__param(0, (0, typeorm_1.InjectRepository)(user_entity_1.NestAuthUser)),
|
|
340
344
|
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
341
|
-
event_emitter_1.EventEmitter2,
|
|
342
345
|
tenant_1.TenantService,
|
|
346
|
+
event_emitter_1.EventEmitter2,
|
|
347
|
+
auth_config_service_1.AuthConfigService,
|
|
343
348
|
debug_logger_service_1.DebugLoggerService])
|
|
344
349
|
], UserService);
|