52 lines
1.8 KiB
JavaScript
52 lines
1.8 KiB
JavaScript
"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;
|