import { Result, UniqueID } from "@common/domain"; import { AuthenticatedUser, EmailAddress, PasswordHash, Username } from "@contexts/auth/domain"; 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: any): 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 = PasswordHash.create(entity.passwordHash); const emailResult = EmailAddress.create(entity.email); 1; // 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!, passwordHash: passwordHashResult.data!, roles: entity.roles || [], token: entity.token, }, uniqueIdResult.data! ); } /** * 🔹 Convierte un agregado `AuthenticatedUser` en un objeto listo para persistencia */ toPersistence(authenticatedUser: AuthenticatedUser): any { return authenticatedUser.toPersistenceData(); } } export const createAuthenticatedUserMapper = (): IAuthenticatedUserMapper => new AuthenticatedUserMapper();