57 lines
2.1 KiB
JavaScript
57 lines
2.1 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.LoginCommand = void 0;
|
|
const Result_1 = require("../../../../shared/domain/Result");
|
|
const Email_1 = require("../../domain/value-objects/Email");
|
|
const UserLoggedIn_1 = require("../../domain/events/UserLoggedIn");
|
|
const crypto_1 = require("crypto");
|
|
class LoginCommand {
|
|
constructor(userRepository, sessionRepository, eventBus, verifyPassword, sessionMaxAgeSeconds = 7 * 24 * 60 * 60) {
|
|
this.userRepository = userRepository;
|
|
this.sessionRepository = sessionRepository;
|
|
this.eventBus = eventBus;
|
|
this.verifyPassword = verifyPassword;
|
|
this.sessionMaxAgeSeconds = sessionMaxAgeSeconds;
|
|
}
|
|
async execute(request) {
|
|
let email;
|
|
try {
|
|
email = Email_1.Email.create(request.email);
|
|
}
|
|
catch {
|
|
return (0, Result_1.Err)('Invalid credentials');
|
|
}
|
|
const user = await this.userRepository.findByEmail(email.value);
|
|
if (!user) {
|
|
return (0, Result_1.Err)('Invalid credentials');
|
|
}
|
|
const valid = await this.verifyPassword(request.password, user.passwordHash);
|
|
if (!valid) {
|
|
return (0, Result_1.Err)('Invalid credentials');
|
|
}
|
|
const token = (0, crypto_1.randomUUID)();
|
|
const expiresAt = new Date(Date.now() + this.sessionMaxAgeSeconds * 1000);
|
|
const session = {
|
|
id: (0, crypto_1.randomUUID)(),
|
|
userId: user.id.toString(),
|
|
token,
|
|
expiresAt,
|
|
createdAt: new Date(),
|
|
};
|
|
await this.sessionRepository.save(session);
|
|
const event = new UserLoggedIn_1.UserLoggedIn(user.id.toString(), {
|
|
email: user.email.value,
|
|
sessionId: session.id,
|
|
});
|
|
await this.eventBus.publish(event);
|
|
return (0, Result_1.Ok)({
|
|
userId: user.id.toString(),
|
|
sessionToken: token,
|
|
expiresAt,
|
|
role: user.role.value,
|
|
name: user.name,
|
|
});
|
|
}
|
|
}
|
|
exports.LoginCommand = LoginCommand;
|