import { missingTargetError } from "../../../src/infra/outbound/target-errors.js"; import { isWhatsAppGroupJid, normalizeWhatsAppTarget } from "./normalize.js"; export type WhatsAppOutboundTargetResolution = | { ok: true; to: string } | { ok: false; error: Error }; export function resolveWhatsAppOutboundTarget(params: { to: string | null | undefined; allowFrom: Array | null | undefined; mode: string | null | undefined; }): WhatsAppOutboundTargetResolution { const trimmed = params.to?.trim() ?? ""; const allowListRaw = (params.allowFrom ?? []) .map((entry) => String(entry).trim()) .filter(Boolean); const hasWildcard = allowListRaw.includes("*"); const allowList = allowListRaw .filter((entry) => entry !== "*") .map((entry) => normalizeWhatsAppTarget(entry)) .filter((entry): entry is string => Boolean(entry)); if (trimmed) { const normalizedTo = normalizeWhatsAppTarget(trimmed); if (!normalizedTo) { return { ok: false, error: missingTargetError("WhatsApp", ""), }; } if (isWhatsAppGroupJid(normalizedTo)) { return { ok: true, to: normalizedTo }; } // Enforce allowFrom for all direct-message send modes (including explicit). // Group destinations are handled by group policy and are allowed above. if (hasWildcard || allowList.length === 0) { return { ok: true, to: normalizedTo }; } if (allowList.includes(normalizedTo)) { return { ok: true, to: normalizedTo }; } return { ok: false, error: missingTargetError("WhatsApp", ""), }; } return { ok: false, error: missingTargetError("WhatsApp", ""), }; }