import { Result } from "@repo/rdx-utils"; import type { RemoteConnection } from "../domain/remote-connection.aggregate"; import type { RemoteConnectionInput } from "../domain/remote-connection-values"; import { RemoteConnectionError } from "../domain/remote-connection-values"; import { RemoteConnectionValues } from "../domain/value-objects/remote-connection-values.vo"; import type { RemoteContext } from "./remote-connection.repository"; import { remoteReferences } from "./remote-connection-policy"; export function mapRemoteInput( input: RemoteConnectionInput, context: RemoteContext, previous?: RemoteConnection ) { const mapped = RemoteConnectionValues.create(input); if (!mapped.isSuccess) { return mapped; } const values = mapped.data; if (previous && !previous.values.sameTarget(values)) { return Result.fail(new RemoteConnectionError("REMOTE_TARGET_IMMUTABLE")); } if (!remoteReferences(values, context)) { return Result.fail(new RemoteConnectionError("REMOTE_REFERENCE_NOT_FOUND")); } if ( !previous && input.siteId && !context.sites.some((site) => site.id.toPrimitive() === input.siteId && site.active) ) { return Result.fail(new RemoteConnectionError("REMOTE_REFERENCE_NOT_FOUND")); } // Se documentan conexiones existentes aunque su autorización ya no sea vigente; se señalan para revisión. if ( !values.closed && context.connections.some( (item) => !(item.id.equals(previous?.id) || item.values.closed) && item.values.connectionKey === values.connectionKey ) ) { return Result.fail(new RemoteConnectionError("REMOTE_ALREADY_OPEN")); } return mapped; }