https://project.mdnd-it.cc/work_packages/94
This commit is contained in:
2025-08-23 04:25:28 +02:00
parent 725516ad6c
commit 19cfa031d0
25823 changed files with 1095587 additions and 2801760 deletions
@@ -0,0 +1,12 @@
export interface CreateUserCommand {
username: string;
password: string;
email: string;
fname: string;
lname: string;
code?: string;
orgid?: string;
type: string;
phone?: string;
}
//# sourceMappingURL=CreateUserCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"CreateUserCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/CreateUserCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=CreateUserCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"CreateUserCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/CreateUserCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
import { CreateUserCommand } from './CreateUserCommand';
import { ShortUserDto } from '../../DTOs/UserDto';
export declare class CreateUserCommandHandler {
private readonly userRepo;
private emailService;
constructor(userRepo: IUserRepository);
execute(cmd: CreateUserCommand): Promise<ShortUserDto>;
}
//# sourceMappingURL=CreateUserCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"CreateUserCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/CreateUserCommandHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,qBAAa,wBAAwB;IAGvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,YAAY,CAAe;gBAEN,QAAQ,EAAE,eAAe;IAIhD,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;CAuE7D"}
@@ -0,0 +1,74 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateUserCommandHandler = void 0;
const UserAggregate_1 = require("../../../Domain/User/UserAggregate");
const UserMapper_1 = require("../../DTOs/Mappers/UserMapper");
const PasswordService_1 = require("../../Services/PasswordService");
const EmailService_1 = require("../../Services/EmailService");
const TokenService_1 = require("../../Services/TokenService");
const Logger_1 = require("../../Services/Logger");
class CreateUserCommandHandler {
constructor(userRepo) {
this.userRepo = userRepo;
this.emailService = new EmailService_1.EmailService();
}
async execute(cmd) {
try {
// Validate password strength
const passwordValidation = PasswordService_1.PasswordService.validatePasswordStrength(cmd.password);
if (!passwordValidation.isValid) {
throw new Error(`Password validation failed: ${passwordValidation.errors.join(', ')}`);
}
const user = new UserAggregate_1.UserAggregate();
user.username = cmd.username;
// Hash the password before storing
user.password = await PasswordService_1.PasswordService.hashPassword(cmd.password);
// Generate verification token
const verificationTokenData = TokenService_1.TokenService.generateVerificationToken();
user.token = await TokenService_1.TokenService.hashToken(verificationTokenData.token);
user.TokenExpires = verificationTokenData.expiresAt;
user.email = cmd.email;
user.fname = cmd.fname;
user.lname = cmd.lname;
user.orgid = cmd.orgid || null;
user.token = cmd.code || null;
user.type = cmd.type;
user.phone = cmd.phone || null;
user.state = UserAggregate_1.UserState.REGISTERED_NOT_VERIFIED;
const created = await this.userRepo.create(user);
// Send verification email
try {
const baseUrl = process.env.APP_BASE_URL || 'http://localhost:3000';
const verificationUrl = TokenService_1.TokenService.generateVerificationUrl(baseUrl, verificationTokenData.token);
const emailSent = await this.emailService.sendVerificationEmail(created.email, `${created.fname} ${created.lname}`, verificationTokenData.token, verificationUrl);
if (!emailSent) {
(0, Logger_1.logWarning)('Failed to send verification email', { email: created.email, userId: created.id });
// Don't throw error - user creation should still succeed even if email fails
}
else {
(0, Logger_1.logAuth)('Verification email sent successfully', created.id, { email: created.email });
}
}
catch (emailError) {
(0, Logger_1.logError)('Error sending verification email', emailError);
// Don't throw error - user creation should still succeed even if email fails
}
return UserMapper_1.UserMapper.toShortDto(created);
}
catch (error) {
(0, Logger_1.logError)('CreateUserCommandHandler error', error);
// Re-throw validation errors as-is
if (error instanceof Error && error.message.includes('Password validation failed')) {
throw error;
}
// Handle database constraint errors
if (error instanceof Error && (error.message.includes('duplicate') || error.message.includes('unique'))) {
throw new Error('User with this username or email already exists');
}
// Generic error for other cases
throw new Error('Failed to create user');
}
}
}
exports.CreateUserCommandHandler = CreateUserCommandHandler;
//# sourceMappingURL=CreateUserCommandHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"CreateUserCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/CreateUserCommandHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
export interface DeactivateUserCommand {
id: string;
}
//# sourceMappingURL=DeactivateUserCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"DeactivateUserCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeactivateUserCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=DeactivateUserCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"DeactivateUserCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeactivateUserCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
import { DeactivateUserCommand } from './DeactivateUserCommand';
export declare class DeactivateUserCommandHandler {
private readonly userRepo;
constructor(userRepo: IUserRepository);
execute(cmd: DeactivateUserCommand): Promise<boolean>;
}
//# sourceMappingURL=DeactivateUserCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"DeactivateUserCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeactivateUserCommandHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEhD,OAAO,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC;CAI5D"}
@@ -0,0 +1,14 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeactivateUserCommandHandler = void 0;
class DeactivateUserCommandHandler {
constructor(userRepo) {
this.userRepo = userRepo;
}
async execute(cmd) {
await this.userRepo.deactivate(cmd.id);
return true;
}
}
exports.DeactivateUserCommandHandler = DeactivateUserCommandHandler;
//# sourceMappingURL=DeactivateUserCommandHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"DeactivateUserCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeactivateUserCommandHandler.ts"],"names":[],"mappings":";;;AAIA,MAAa,4BAA4B;IACvC,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,GAA0B;QACtC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAPD,oEAOC"}
@@ -0,0 +1,5 @@
export interface DeleteUserCommand {
id: string;
soft?: boolean;
}
//# sourceMappingURL=DeleteUserCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"DeleteUserCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeleteUserCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=DeleteUserCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"DeleteUserCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeleteUserCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
import { DeleteUserCommand } from './DeleteUserCommand';
export declare class DeleteUserCommandHandler {
private readonly userRepo;
constructor(userRepo: IUserRepository);
execute(cmd: DeleteUserCommand): Promise<boolean>;
}
//# sourceMappingURL=DeleteUserCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"DeleteUserCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeleteUserCommandHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEhD,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQxD"}
@@ -0,0 +1,19 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeleteUserCommandHandler = void 0;
class DeleteUserCommandHandler {
constructor(userRepo) {
this.userRepo = userRepo;
}
async execute(cmd) {
if (cmd.soft) {
await this.userRepo.softDelete(cmd.id);
}
else {
await this.userRepo.delete(cmd.id);
}
return true;
}
}
exports.DeleteUserCommandHandler = DeleteUserCommandHandler;
//# sourceMappingURL=DeleteUserCommandHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"DeleteUserCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/DeleteUserCommandHandler.ts"],"names":[],"mappings":";;;AAIA,MAAa,wBAAwB;IACnC,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,GAAsB;QAClC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAXD,4DAWC"}
@@ -0,0 +1,5 @@
export interface LoginCommand {
username: string;
password: string;
}
//# sourceMappingURL=LoginCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"LoginCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/LoginCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=LoginCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"LoginCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/LoginCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository';
import { LoginCommand } from './LoginCommand';
import { ShortUserDto } from '../../DTOs/UserDto';
import { JWTService } from '../../Services/JWTService';
export interface LoginResponse {
user: ShortUserDto;
token: string;
requiresOrgReauth?: boolean;
orgLoginUrl?: string;
organizationName?: string;
}
export declare class LoginCommandHandler {
private readonly userRepo;
private readonly jwtService;
private readonly orgRepo;
constructor(userRepo: IUserRepository, jwtService: JWTService, orgRepo: IOrganizationRepository);
execute(cmd: LoginCommand): Promise<LoginResponse | null>;
}
//# sourceMappingURL=LoginCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"LoginCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/LoginCommandHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,uBAAuB;IAG7C,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAkIhE"}
@@ -0,0 +1,127 @@
"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
@@ -0,0 +1 @@
{"version":3,"file":"LoginCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/LoginCommandHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
export interface RequestPasswordResetCommand {
email: string;
}
//# sourceMappingURL=RequestPasswordResetCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"RequestPasswordResetCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/RequestPasswordResetCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=RequestPasswordResetCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"RequestPasswordResetCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/RequestPasswordResetCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
import { RequestPasswordResetCommand } from './RequestPasswordResetCommand';
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
export declare class RequestPasswordResetCommandHandler {
private userRepo;
private emailService;
constructor(userRepo: IUserRepository);
execute(cmd: RequestPasswordResetCommand): Promise<boolean>;
}
//# sourceMappingURL=RequestPasswordResetCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"RequestPasswordResetCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/RequestPasswordResetCommandHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAK9E,qBAAa,kCAAkC;IAGjC,OAAO,CAAC,QAAQ;IAF5B,OAAO,CAAC,YAAY,CAAe;gBAEf,QAAQ,EAAE,eAAe;IAIvC,OAAO,CAAC,GAAG,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;CAsDlE"}
@@ -0,0 +1,57 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequestPasswordResetCommandHandler = void 0;
const EmailService_1 = require("../../Services/EmailService");
const TokenService_1 = require("../../Services/TokenService");
const Logger_1 = require("../../Services/Logger");
class RequestPasswordResetCommandHandler {
constructor(userRepo) {
this.userRepo = userRepo;
this.emailService = new EmailService_1.EmailService();
}
async execute(cmd) {
try {
if (!cmd.email) {
throw new Error('Email is required');
}
// Find user by email
const user = await this.userRepo.findByEmail(cmd.email);
if (!user) {
// Don't reveal if user exists or not for security reasons
// Still return true but don't send email
(0, Logger_1.logAuth)(`Password reset requested for non-existent email: ${cmd.email}`);
return true;
}
// Generate password reset token
const resetTokenData = TokenService_1.TokenService.generatePasswordResetToken();
// Update user with reset token
user.token = await TokenService_1.TokenService.hashToken(resetTokenData.token);
user.TokenExpires = resetTokenData.expiresAt;
await this.userRepo.update(user.id, user);
// Send password reset email
try {
const baseUrl = process.env.APP_BASE_URL || 'http://localhost:3000';
const resetUrl = TokenService_1.TokenService.generatePasswordResetUrl(baseUrl, resetTokenData.token);
const emailSent = await this.emailService.sendPasswordResetEmail(user.email, `${user.fname} ${user.lname}`, resetTokenData.token, resetUrl);
if (!emailSent) {
(0, Logger_1.logWarning)(`Failed to send password reset email to ${user.email}`);
// Don't throw error - request should still succeed even if email fails
}
else {
(0, Logger_1.logAuth)(`Password reset email sent successfully to ${user.email}`);
}
}
catch (emailError) {
(0, Logger_1.logError)('Error sending password reset email', emailError instanceof Error ? emailError : new Error(String(emailError)));
// Don't throw error - request should still succeed even if email fails
}
return true;
}
catch (error) {
(0, Logger_1.logError)('Password reset request error', error instanceof Error ? error : new Error(String(error)));
throw error;
}
}
}
exports.RequestPasswordResetCommandHandler = RequestPasswordResetCommandHandler;
//# sourceMappingURL=RequestPasswordResetCommandHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"RequestPasswordResetCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/RequestPasswordResetCommandHandler.ts"],"names":[],"mappings":";;;AAGA,8DAA2D;AAC3D,8DAA2D;AAC3D,kDAAsE;AAEtE,MAAa,kCAAkC;IAG7C,YAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAgC;QAC5C,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,qBAAqB;YACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAExD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,0DAA0D;gBAC1D,yCAAyC;gBACzC,IAAA,gBAAO,EAAC,oDAAoD,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,gCAAgC;YAChC,MAAM,cAAc,GAAG,2BAAY,CAAC,0BAA0B,EAAE,CAAC;YAEjE,+BAA+B;YAC/B,IAAI,CAAC,KAAK,GAAG,MAAM,2BAAY,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAChE,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC;YAE7C,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE1C,4BAA4B;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,uBAAuB,CAAC;gBACpE,MAAM,QAAQ,GAAG,2BAAY,CAAC,wBAAwB,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;gBAEtF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAC9D,IAAI,CAAC,KAAK,EACV,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,EAC7B,cAAc,CAAC,KAAK,EACpB,QAAQ,CACT,CAAC;gBAEF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,IAAA,mBAAU,EAAC,0CAA0C,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;oBACnE,uEAAuE;gBACzE,CAAC;qBAAM,CAAC;oBACN,IAAA,gBAAO,EAAC,6CAA6C,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,IAAA,iBAAQ,EAAC,oCAAoC,EAAE,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACzH,uEAAuE;YACzE,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpG,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA7DD,gFA6DC"}
@@ -0,0 +1,5 @@
export interface ResetPasswordCommand {
token: string;
newPassword: string;
}
//# sourceMappingURL=ResetPasswordCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"ResetPasswordCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/ResetPasswordCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=ResetPasswordCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"ResetPasswordCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/ResetPasswordCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
import { ResetPasswordCommand } from './ResetPasswordCommand';
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
export declare class ResetPasswordCommandHandler {
private userRepo;
constructor(userRepo: IUserRepository);
execute(cmd: ResetPasswordCommand): Promise<boolean>;
}
//# sourceMappingURL=ResetPasswordCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"ResetPasswordCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/ResetPasswordCommandHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAK9E,qBAAa,2BAA2B;IAC1B,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEvC,OAAO,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;CA+C3D"}
@@ -0,0 +1,51 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResetPasswordCommandHandler = void 0;
const TokenService_1 = require("../../Services/TokenService");
const PasswordService_1 = require("../../Services/PasswordService");
const Logger_1 = require("../../Services/Logger");
class ResetPasswordCommandHandler {
constructor(userRepo) {
this.userRepo = userRepo;
}
async execute(cmd) {
try {
if (!cmd.token) {
throw new Error('Reset token is required');
}
if (!cmd.newPassword) {
throw new Error('New password is required');
}
// Validate password strength
const validation = PasswordService_1.PasswordService.validatePasswordStrength(cmd.newPassword);
if (!validation.isValid) {
throw new Error(`Password validation failed: ${validation.errors.join(', ')}`);
}
// Hash the token to compare with stored value
const hashedToken = await TokenService_1.TokenService.hashToken(cmd.token);
// Find user with this password reset token
const user = await this.userRepo.findByToken(hashedToken);
if (!user) {
throw new Error('Invalid or expired reset token');
}
// Check if token is expired
if (user.TokenExpires && user.TokenExpires < new Date()) {
throw new Error('Reset token has expired');
}
// Hash the new password
const hashedPassword = await PasswordService_1.PasswordService.hashPassword(cmd.newPassword);
// Update user password and clear reset token
user.password = hashedPassword;
user.token = null;
user.TokenExpires = null;
await this.userRepo.update(user.id, user);
return true;
}
catch (error) {
(0, Logger_1.logError)('Password reset error', error instanceof Error ? error : new Error(String(error)));
throw error;
}
}
}
exports.ResetPasswordCommandHandler = ResetPasswordCommandHandler;
//# sourceMappingURL=ResetPasswordCommandHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"ResetPasswordCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/ResetPasswordCommandHandler.ts"],"names":[],"mappings":";;;AAGA,8DAA2D;AAC3D,oEAAiE;AACjE,kDAAiD;AAEjD,MAAa,2BAA2B;IACtC,YAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAEjD,KAAK,CAAC,OAAO,CAAC,GAAyB;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YAED,6BAA6B;YAC7B,MAAM,UAAU,GAAG,iCAAe,CAAC,wBAAwB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC7E,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;YAED,8CAA8C;YAC9C,MAAM,WAAW,GAAG,MAAM,2BAAY,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAE5D,2CAA2C;YAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAE1D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,wBAAwB;YACxB,MAAM,cAAc,GAAG,MAAM,iCAAe,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAE3E,6CAA6C;YAC7C,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAEzB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE1C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAlDD,kEAkDC"}
@@ -0,0 +1,14 @@
export interface UpdateUserCommand {
id: string;
orgid?: string;
username?: string;
password?: string;
email?: string;
fname?: string;
lname?: string;
code?: string;
type?: string;
phone?: string;
state?: number;
}
//# sourceMappingURL=UpdateUserCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"UpdateUserCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/UpdateUserCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=UpdateUserCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"UpdateUserCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/UpdateUserCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
import { UpdateUserCommand } from './UpdateUserCommand';
import { ShortUserDto } from '../../DTOs/UserDto';
export declare class UpdateUserCommandHandler {
private readonly userRepo;
constructor(userRepo: IUserRepository);
execute(cmd: UpdateUserCommand): Promise<ShortUserDto | null>;
}
//# sourceMappingURL=UpdateUserCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"UpdateUserCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/UpdateUserCommandHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEhD,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAkBpE"}
@@ -0,0 +1,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UpdateUserCommandHandler = void 0;
const UserMapper_1 = require("../../DTOs/Mappers/UserMapper");
const PasswordService_1 = require("../../Services/PasswordService");
class UpdateUserCommandHandler {
constructor(userRepo) {
this.userRepo = userRepo;
}
async execute(cmd) {
const updateData = { ...cmd };
// Hash the password if it's being updated
if (cmd.password) {
// Validate password strength
const passwordValidation = PasswordService_1.PasswordService.validatePasswordStrength(cmd.password);
if (!passwordValidation.isValid) {
throw new Error(`Password validation failed: ${passwordValidation.errors.join(', ')}`);
}
updateData.password = await PasswordService_1.PasswordService.hashPassword(cmd.password);
}
const updated = await this.userRepo.update(cmd.id, updateData);
if (!updated)
return null;
return UserMapper_1.UserMapper.toShortDto(updated);
}
}
exports.UpdateUserCommandHandler = UpdateUserCommandHandler;
//# sourceMappingURL=UpdateUserCommandHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"UpdateUserCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/UpdateUserCommandHandler.ts"],"names":[],"mappings":";;;AAIA,8DAA2D;AAC3D,oEAAiE;AAEjE,MAAa,wBAAwB;IACnC,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,GAAsB;QAClC,MAAM,UAAU,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;QAE9B,0CAA0C;QAC1C,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,6BAA6B;YAC7B,MAAM,kBAAkB,GAAG,iCAAe,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClF,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,UAAU,CAAC,QAAQ,GAAG,MAAM,iCAAe,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,uBAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACF;AArBD,4DAqBC"}
@@ -0,0 +1,4 @@
export interface VerifyEmailCommand {
token: string;
}
//# sourceMappingURL=VerifyEmailCommand.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"VerifyEmailCommand.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/VerifyEmailCommand.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=VerifyEmailCommand.js.map
@@ -0,0 +1 @@
{"version":3,"file":"VerifyEmailCommand.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/VerifyEmailCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
import { VerifyEmailCommand } from './VerifyEmailCommand';
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
export declare class VerifyEmailCommandHandler {
private userRepo;
constructor(userRepo: IUserRepository);
execute(cmd: VerifyEmailCommand): Promise<boolean>;
}
//# sourceMappingURL=VerifyEmailCommandHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"VerifyEmailCommandHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/commands/VerifyEmailCommandHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAK9E,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEvC,OAAO,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;CAkCzD"}
@@ -0,0 +1,41 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VerifyEmailCommandHandler = void 0;
const TokenService_1 = require("../../Services/TokenService");
const UserAggregate_1 = require("../../../Domain/User/UserAggregate");
const Logger_1 = require("../../Services/Logger");
class VerifyEmailCommandHandler {
constructor(userRepo) {
this.userRepo = userRepo;
}
async execute(cmd) {
try {
if (!cmd.token) {
throw new Error('Verification token is required');
}
// Hash the token to compare with stored value
const hashedToken = await TokenService_1.TokenService.hashToken(cmd.token);
// Find user with this verification token
const user = await this.userRepo.findByToken(hashedToken);
if (!user) {
throw new Error('Invalid or expired verification token');
}
// Check if token is expired
if (user.TokenExpires && user.TokenExpires < new Date()) {
throw new Error('Verification token has expired');
}
// Update user verification status
user.token = null;
user.TokenExpires = null;
user.state = UserAggregate_1.UserState.VERIFIED_REGULAR;
await this.userRepo.update(user.id, user);
return true;
}
catch (error) {
(0, Logger_1.logError)('Email verification error', error instanceof Error ? error : new Error(String(error)));
throw error;
}
}
}
exports.VerifyEmailCommandHandler = VerifyEmailCommandHandler;
//# sourceMappingURL=VerifyEmailCommandHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"VerifyEmailCommandHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/commands/VerifyEmailCommandHandler.ts"],"names":[],"mappings":";;;AAGA,8DAA2D;AAC3D,sEAA+D;AAC/D,kDAAiD;AAEjD,MAAa,yBAAyB;IACpC,YAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAEjD,KAAK,CAAC,OAAO,CAAC,GAAuB;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YAED,8CAA8C;YAC9C,MAAM,WAAW,GAAG,MAAM,2BAAY,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAE5D,yCAAyC;YACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAE1D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YAED,kCAAkC;YAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,yBAAS,CAAC,gBAAgB,CAAC;YAExC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE1C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,iBAAQ,EAAC,0BAA0B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChG,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AArCD,8DAqCC"}
@@ -0,0 +1,4 @@
export interface GetUserByIdQuery {
id: string;
}
//# sourceMappingURL=GetUserByIdQuery.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUserByIdQuery.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUserByIdQuery.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=GetUserByIdQuery.js.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUserByIdQuery.js","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUserByIdQuery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
import { GetUserByIdQuery } from './GetUserByIdQuery';
import { ShortUserDto } from '../../DTOs/UserDto';
export declare class GetUserByIdQueryHandler {
private readonly userRepo;
constructor(userRepo: IUserRepository);
execute(query: GetUserByIdQuery): Promise<ShortUserDto | null>;
}
//# sourceMappingURL=GetUserByIdQueryHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUserByIdQueryHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUserByIdQueryHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEhD,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAsBrE"}
@@ -0,0 +1,33 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetUserByIdQueryHandler = void 0;
const UserMapper_1 = require("../../DTOs/Mappers/UserMapper");
const Logger_1 = require("../../Services/Logger");
class GetUserByIdQueryHandler {
constructor(userRepo) {
this.userRepo = userRepo;
}
async execute(query) {
try {
const user = await this.userRepo.findById(query.id);
if (!user)
return null;
return UserMapper_1.UserMapper.toShortDto(user);
}
catch (error) {
(0, Logger_1.logError)('GetUserByIdQueryHandler error', error instanceof Error ? error : new Error(String(error)));
// Handle invalid ID format
if (error instanceof Error && error.message.includes('invalid') && error.message.includes('uuid')) {
return null; // Treat invalid UUID as not found
}
// Handle database errors
if (error instanceof Error && error.message.includes('database')) {
throw new Error('Database connection error');
}
// Generic error for other cases
throw new Error('Failed to retrieve user');
}
}
}
exports.GetUserByIdQueryHandler = GetUserByIdQueryHandler;
//# sourceMappingURL=GetUserByIdQueryHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUserByIdQueryHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUserByIdQueryHandler.ts"],"names":[],"mappings":";;;AAGA,8DAA2D;AAC3D,kDAAiD;AAEjD,MAAa,uBAAuB;IAClC,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,KAAuB;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO,uBAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,iBAAQ,EAAC,+BAA+B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAErG,2BAA2B;YAC3B,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClG,OAAO,IAAI,CAAC,CAAC,kCAAkC;YACjD,CAAC;YAED,yBAAyB;YACzB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,gCAAgC;YAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF;AAzBD,0DAyBC"}
@@ -0,0 +1,6 @@
export interface GetUsersByPageQuery {
from: number;
to: number;
includeDeleted?: boolean;
}
//# sourceMappingURL=GetUsersByPageQuery.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUsersByPageQuery.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUsersByPageQuery.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B"}
@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=GetUsersByPageQuery.js.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUsersByPageQuery.js","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUsersByPageQuery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
import { GetUsersByPageQuery } from './GetUsersByPageQuery';
import { ShortUserDto } from '../../DTOs/UserDto';
export declare class GetUsersByPageQueryHandler {
private readonly userRepo;
constructor(userRepo: IUserRepository);
execute(query: GetUsersByPageQuery): Promise<{
users: ShortUserDto[];
totalCount: number;
}>;
}
//# sourceMappingURL=GetUsersByPageQueryHandler.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUsersByPageQueryHandler.d.ts","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUsersByPageQueryHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,qBAAa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEhD,OAAO,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAkDlG"}
@@ -0,0 +1,55 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetUsersByPageQueryHandler = void 0;
const UserMapper_1 = require("../../DTOs/Mappers/UserMapper");
const Logger_1 = require("../../Services/Logger");
class GetUsersByPageQueryHandler {
constructor(userRepo) {
this.userRepo = userRepo;
}
async execute(query) {
try {
// Validate pagination parameters
if (query.from < 0 || query.to < query.from) {
throw new Error('Invalid pagination parameters');
}
const limit = query.to - query.from + 1;
if (limit > 100) {
throw new Error('Page size too large. Maximum 100 records per request');
}
(0, Logger_1.logRequest)('Get users by page query started', undefined, undefined, {
from: query.from,
to: query.to,
includeDeleted: query.includeDeleted || false
});
const result = query.includeDeleted
? await this.userRepo.findByPageIncludingDeleted(query.from, query.to)
: await this.userRepo.findByPage(query.from, query.to);
(0, Logger_1.logRequest)('Get users by page query completed', undefined, undefined, {
from: query.from,
to: query.to,
returned: result.users.length,
totalCount: result.totalCount,
includeDeleted: query.includeDeleted || false
});
return {
users: UserMapper_1.UserMapper.toShortDtoList(result.users),
totalCount: result.totalCount
};
}
catch (error) {
(0, Logger_1.logError)('GetUsersByPageQueryHandler error', error instanceof Error ? error : new Error(String(error)));
// Handle database errors
if (error instanceof Error && error.message.includes('database')) {
throw new Error('Database connection error');
}
// Re-throw validation errors as-is
if (error instanceof Error && (error.message.includes('Invalid pagination') || error.message.includes('Page size'))) {
throw error;
}
throw new Error('Failed to retrieve users');
}
}
}
exports.GetUsersByPageQueryHandler = GetUsersByPageQueryHandler;
//# sourceMappingURL=GetUsersByPageQueryHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"GetUsersByPageQueryHandler.js","sourceRoot":"","sources":["../../../../src/Application/User/queries/GetUsersByPageQueryHandler.ts"],"names":[],"mappings":";;;AAGA,8DAA2D;AAC3D,kDAA6D;AAE7D,MAAa,0BAA0B;IACrC,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,KAA0B;QACtC,IAAI,CAAC;YACH,iCAAiC;YACjC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YACxC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YAED,IAAA,mBAAU,EAAC,iCAAiC,EAAE,SAAS,EAAE,SAAS,EAAE;gBAClE,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK;aAC9C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc;gBACjC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;gBACtE,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAEzD,IAAA,mBAAU,EAAC,mCAAmC,EAAE,SAAS,EAAE,SAAS,EAAE;gBACpE,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK;aAC9C,CAAC,CAAC;YAEH,OAAO;gBACL,KAAK,EAAE,uBAAU,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC9C,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,iBAAQ,EAAC,kCAAkC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAExG,yBAAyB;YACzB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,mCAAmC;YACnC,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;gBACpH,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;CACF;AArDD,gEAqDC"}