2025-01-30 10:45:31 +00:00
|
|
|
import { Result } from "contexts/common/domain";
|
2025-01-29 19:02:59 +00:00
|
|
|
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<Result<AuthUser, Error>> {
|
|
|
|
|
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<boolean> {
|
|
|
|
|
return await this.password.compare(plainPassword);
|
|
|
|
|
}
|
|
|
|
|
}
|