metis-desk/modules/companies/src/api/application/remote-connection-input.mapper.ts

41 lines
1.4 KiB
TypeScript
Raw Normal View History

2026-10-06 16:44:21 +00:00
import { Result } from "@repo/rdx-utils";
import type { RemoteConnection } from "../domain/remote-connection.aggregate";
import {
RemoteConnectionError,
type RemoteConnectionInput,
} from "../domain/remote-connection-values";
import { RemoteConnectionValues } from "../domain/value-objects/remote-connection-values";
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"));
}
// 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;
}