import { Result, UniqueID } from "@common/domain"; import { AuthenticatedUser, EmailAddress, HashPassword, Username } from "@contexts/auth/domain"; import { AuthUserModel } from "../sequelize"; import { IAuthenticatedUserMapper } from "./authenticated-user-mapper.interface"; export class AuthenticatedUserMapper implements IAuthenticatedUserMapper { /** * 🔹 Convierte una entidad de la base de datos en un agregado de dominio `AuthenticatedUser` */ toDomain(entity: AuthUserModel): Result { 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); const passwordHashResult = HashPassword.createFromHash(entity.hash_password); const emailResult = EmailAddress.create(entity.email); // Validar que no haya errores en la creación de los Value Objects const okOrError = Result.combine([ uniqueIdResult, usernameResult, passwordHashResult, emailResult, ]); if (okOrError.isFailure) { return Result.fail(okOrError.error.message); } // Crear el agregado de dominio return AuthenticatedUser.create( { username: usernameResult.data!, email: emailResult.data!, hashPassword: passwordHashResult.data!, roles: entity.roles || [], }, uniqueIdResult.data! ); } /** * 🔹 Convierte un agregado `AuthenticatedUser` en un objeto listo para persistencia */ toPersistence(authenticatedUser: AuthenticatedUser): AuthUserModel { return authenticatedUser.toPersistenceData(); } } export const createAuthenticatedUserMapper = (): IAuthenticatedUserMapper => new AuthenticatedUserMapper();