metis-desk/modules/companies/src/api/application/remote-connection-input.mapper.ts
2026-10-16 11:09:56 +02:00

50 lines
1.6 KiB
TypeScript

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;
}