"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RegisterCommand = void 0; const Result_1 = require("../../../../shared/domain/Result"); const User_1 = require("../../domain/entities/User"); const Email_1 = require("../../domain/value-objects/Email"); const Role_1 = require("../../domain/value-objects/Role"); class RegisterCommand { constructor(userRepository, eventBus, hashPassword) { this.userRepository = userRepository; this.eventBus = eventBus; this.hashPassword = hashPassword; } async execute(request) { let email; try { email = Email_1.Email.create(request.email); } catch { return (0, Result_1.Err)('Invalid email address'); } const existing = await this.userRepository.findByEmail(email.value); if (existing) { return (0, Result_1.Err)('Email already registered'); } if (request.password.length < 8) { return (0, Result_1.Err)('Password must be at least 8 characters'); } let role; try { role = request.role ? Role_1.Role.create(request.role) : Role_1.Role.member(); } catch { return (0, Result_1.Err)('Invalid role'); } const passwordHash = await this.hashPassword(request.password); const user = User_1.User.create({ email, name: request.name, passwordHash, role }); await this.userRepository.save(user); for (const event of user.domainEvents) { await this.eventBus.publish(event); } user.clearEvents(); return (0, Result_1.Ok)({ userId: user.id.toString(), email: user.email.value, name: user.name, role: user.role.value, }); } } exports.RegisterCommand = RegisterCommand;