127 lines
5.9 KiB
JavaScript
127 lines
5.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.LoginCommandHandler = void 0;
|
|
const UserMapper_1 = require("../../DTOs/Mappers/UserMapper");
|
|
const PasswordService_1 = require("../../Services/PasswordService");
|
|
const UserAggregate_1 = require("../../../Domain/User/UserAggregate");
|
|
const Logger_1 = require("../../Services/Logger");
|
|
class LoginCommandHandler {
|
|
constructor(userRepo, jwtService, orgRepo) {
|
|
this.userRepo = userRepo;
|
|
this.jwtService = jwtService;
|
|
this.orgRepo = orgRepo;
|
|
}
|
|
async execute(cmd) {
|
|
const startTime = Date.now();
|
|
try {
|
|
(0, Logger_1.logAuth)('Login attempt', undefined, { username: cmd.username });
|
|
const user = await this.userRepo.findByUsername(cmd.username) ||
|
|
await this.userRepo.findByEmail(cmd.username);
|
|
(0, Logger_1.logDatabase)('User lookup completed', undefined, Date.now() - startTime, {
|
|
found: !!user,
|
|
searchBy: cmd.username.includes('@') ? 'email' : 'username'
|
|
});
|
|
if (!user) {
|
|
(0, Logger_1.logAuth)('Login failed - User not found', undefined, { username: cmd.username });
|
|
return null;
|
|
}
|
|
try {
|
|
const passwordStartTime = Date.now();
|
|
const isPasswordValid = await PasswordService_1.PasswordService.verifyPassword(cmd.password, user.password);
|
|
(0, Logger_1.logAuth)('Password verification completed', user.id, {
|
|
valid: isPasswordValid,
|
|
verificationTime: Date.now() - passwordStartTime
|
|
});
|
|
if (!isPasswordValid) {
|
|
(0, Logger_1.logWarning)('Login failed - Invalid password', {
|
|
userId: user.id,
|
|
username: cmd.username
|
|
});
|
|
return null;
|
|
}
|
|
}
|
|
catch (error) {
|
|
(0, Logger_1.logError)('Password verification error', error);
|
|
return null;
|
|
}
|
|
const mockRes = {
|
|
cookie: () => { }
|
|
};
|
|
const tokenPayload = {
|
|
userId: user.id,
|
|
authLevel: (user.state === UserAggregate_1.UserState.ADMIN ? 1 : 0),
|
|
userStatus: user.state,
|
|
orgId: user.orgid || ''
|
|
};
|
|
try {
|
|
const token = this.jwtService.create(tokenPayload, mockRes);
|
|
// Check if user belongs to an organization and needs reauthentication
|
|
let requiresOrgReauth = false;
|
|
let orgLoginUrl;
|
|
let organizationName;
|
|
if (user.orgid) {
|
|
const organization = await this.orgRepo.findById(user.orgid);
|
|
if (organization) {
|
|
organizationName = organization.name;
|
|
// Check if user has logged in to organization within the last month
|
|
const oneMonthAgo = new Date();
|
|
oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);
|
|
const needsReauth = !user.Orglogindate || user.Orglogindate < oneMonthAgo;
|
|
if (needsReauth && organization.url) {
|
|
requiresOrgReauth = true;
|
|
orgLoginUrl = organization.url;
|
|
(0, Logger_1.logAuth)('User requires organization reauthentication', user.id, {
|
|
organizationId: user.orgid,
|
|
organizationName: organization.name,
|
|
lastOrgLogin: user.Orglogindate?.toISOString() || 'never',
|
|
orgLoginUrl: organization.url
|
|
});
|
|
}
|
|
}
|
|
}
|
|
(0, Logger_1.logAuth)('Login successful', user.id, {
|
|
authLevel: tokenPayload.authLevel,
|
|
userStatus: tokenPayload.userStatus,
|
|
orgId: tokenPayload.orgId,
|
|
requiresOrgReauth,
|
|
organizationName,
|
|
totalLoginTime: Date.now() - startTime
|
|
});
|
|
const response = {
|
|
user: UserMapper_1.UserMapper.toShortDto(user),
|
|
token
|
|
};
|
|
if (requiresOrgReauth) {
|
|
response.requiresOrgReauth = true;
|
|
response.orgLoginUrl = orgLoginUrl;
|
|
response.organizationName = organizationName;
|
|
}
|
|
return response;
|
|
}
|
|
catch (error) {
|
|
(0, Logger_1.logError)('Token creation failed during login', error);
|
|
throw new Error('Login failed due to internal error');
|
|
}
|
|
}
|
|
catch (error) {
|
|
if (error instanceof Error) {
|
|
(0, Logger_1.logError)('Login handler error', error);
|
|
// Handle database connection errors
|
|
if (error.message.includes('database connection')) {
|
|
(0, Logger_1.logDatabase)('Database connection error during login', undefined, Date.now() - startTime);
|
|
throw new Error('Database connection error');
|
|
}
|
|
// If it's already a properly formatted error, re-throw it
|
|
if (error.message === 'Login failed due to internal error' ||
|
|
error.message === 'Database connection error') {
|
|
throw error;
|
|
}
|
|
}
|
|
// Default database error handling
|
|
(0, Logger_1.logDatabase)('Unexpected database error during login', undefined, Date.now() - startTime);
|
|
throw new Error('Database connection error');
|
|
}
|
|
}
|
|
}
|
|
exports.LoginCommandHandler = LoginCommandHandler;
|
|
//# sourceMappingURL=LoginCommandHandler.js.map
|