metis-desk/modules/companies/src/api/application/remote-connection-policy.ts
2026-10-10 12:01:58 +02:00

50 lines
1.8 KiB
TypeScript

import type { RemoteConnectionValues } from "../domain/value-objects/remote-connection-values.vo";
import type { RemoteContext } from "./remote-connection.repository";
import { teleworkAuthorizationState } from "./telework-authorization-policy";
export function remoteReferences(values: RemoteConnectionValues, context: RemoteContext) {
const v = values.toPrimitive();
return (
context.people.some((p) => p.id.equals(values.personId)) &&
(!v.sourceAssetId || context.assets.some((a) => a.id.toPrimitive() === v.sourceAssetId)) &&
(!v.siteId || context.sites.some((s) => s.toPrimitive() === v.siteId)) &&
(v.targetKind === "network" ||
(v.targetKind === "asset"
? context.assets.some((a) => a.id.toPrimitive() === v.targetId)
: context.resources.some((r) => r.id.toPrimitive() === v.targetId)))
);
}
export function remoteAuthorizationEffective(
values: RemoteConnectionValues,
context: RemoteContext
) {
const authorization = context.authorizations.find((item) =>
item.values.personId.equals(values.personId)
);
return Boolean(authorization && teleworkAuthorizationState(authorization, context).effective);
}
export function remoteNeedsReview(values: RemoteConnectionValues, context: RemoteContext) {
if (values.closed) {
return false;
}
const v = values.toPrimitive();
return (
values.state === "removal_pending" ||
!remoteAuthorizationEffective(values, context) ||
Boolean(
v.sourceAssetId &&
!context.assets.some((a) => a.id.toPrimitive() === v.sourceAssetId && a.available)
) ||
(v.targetKind === "asset" &&
!context.assets.some((a) => a.id.toPrimitive() === v.targetId && a.available)) ||
(v.targetKind === "resource" &&
!context.resources.some((r) => r.id.toPrimitive() === v.targetId && r.active))
);
}