Uecko_ERP/apps/server/src/contexts/auth/infraestructure/mappers/authenticated-user.mapper.ts

54 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-02-01 21:48:13 +00:00
import { Result, UniqueID } from "@common/domain";
2025-02-05 20:40:59 +00:00
import { AuthenticatedUser, EmailAddress, HashPassword, Username } from "@contexts/auth/domain";
import { AuthUserModel } from "../sequelize";
2025-02-03 13:12:36 +00:00
import { IAuthenticatedUserMapper } from "./authenticated-user-mapper.interface";
2025-02-01 21:48:13 +00:00
2025-02-03 13:12:36 +00:00
export class AuthenticatedUserMapper implements IAuthenticatedUserMapper {
2025-02-01 21:48:13 +00:00
/**
* 🔹 Convierte una entidad de la base de datos en un agregado de dominio `AuthenticatedUser`
*/
2025-02-05 20:40:59 +00:00
toDomain(entity: AuthUserModel): Result<AuthenticatedUser, Error> {
2025-02-01 21:48:13 +00:00
if (!entity) {
return Result.fail(new Error("Entity not found"));
}
// Crear Value Objects asegurando que sean válidos
const uniqueIdResult = UniqueID.create(entity.id);
const usernameResult = Username.create(entity.username);
2025-02-05 20:40:59 +00:00
const passwordHashResult = HashPassword.createFromHash(entity.hash_password);
2025-02-01 21:48:13 +00:00
const emailResult = EmailAddress.create(entity.email);
2025-02-04 14:58:33 +00:00
2025-02-01 21:48:13 +00:00
// Validar que no haya errores en la creación de los Value Objects
2025-02-03 13:12:36 +00:00
const okOrError = Result.combine([
uniqueIdResult,
usernameResult,
passwordHashResult,
emailResult,
]);
if (okOrError.isFailure) {
return Result.fail(okOrError.error.message);
2025-02-01 21:48:13 +00:00
}
// Crear el agregado de dominio
return AuthenticatedUser.create(
{
username: usernameResult.data!,
email: emailResult.data!,
2025-02-05 20:40:59 +00:00
hashPassword: passwordHashResult.data!,
2025-02-01 21:48:13 +00:00
roles: entity.roles || [],
},
uniqueIdResult.data!
);
}
/**
* 🔹 Convierte un agregado `AuthenticatedUser` en un objeto listo para persistencia
*/
2025-02-05 20:40:59 +00:00
toPersistence(authenticatedUser: AuthenticatedUser): AuthUserModel {
2025-02-01 21:48:13 +00:00
return authenticatedUser.toPersistenceData();
}
}
2025-02-03 13:12:36 +00:00
export const createAuthenticatedUserMapper = (): IAuthenticatedUserMapper =>
new AuthenticatedUserMapper();