import { Result } from "contexts/common/domain"; import { EmailAddress, PasswordHash, Username, UserRoles } from "./value-objects"; export class AuthUser { private constructor( public readonly id: number | null, public readonly username: Username, public readonly email: EmailAddress, private password: PasswordHash, public readonly roles: UserRoles, public readonly isActive: boolean ) {} static async create( id: number | null, username: string, email: string | null, plainPassword: string, roles: string[], isActive: boolean ): Promise> { const usernameResult = Username.create(username); const emailResult = EmailAddress.create(email); const passwordResult = await PasswordHash.create(plainPassword); const rolesResult = UserRoles.create(roles); const combined = Result.combine([usernameResult, emailResult, passwordResult, rolesResult]); if (combined.isError()) { return Result.fail(combined.error); } return Result.ok( new AuthUser( id, usernameResult.data, emailResult.data, passwordResult.data, rolesResult.data, isActive ) ); } async validatePassword(plainPassword: string): Promise { return await this.password.compare(plainPassword); } }