ResolveNotificationChannelNodeConfiguration
Namespace: Meshmakers.Octo.MeshAdapter.Nodes.Extract
Resolves a recipient user's subjectId against the verified-identifier directory
(System.Identity/VerifiedExternalIdentifier, AB#5122) and writes the user's verified
channel identifiers plus the AB#5149 preferredChannel — and the deterministically
resolved effectiveChannel — to
(AB#5152).
This is the reverse direction of the AB#5136 caller-binding lookups: those resolve a channel
identifier (phone number / EntraID oid / e-mail) to a user; this node resolves a user to the
identifiers a system-initiated message may be delivered on. The fallback chain is fixed and
never guesses: the user's BINDING-SPECIFIC preference (PreferredChannelBindingId,
System.Identity 2.18.0 — the rtId of the chosen VerifiedExternalIdentifier) wins when
the referenced binding is still valid; its kind yields the channel (PhoneNumber → "SIGNAL",
EntraIdObjectId → "TEAMS") and its identifier value is the EXACT delivery target. A dangling or
expired reference — and every user without a preference — resolves to "EMAIL", which
every user has. OTP/security messages stay channel-forced and never go through this node.
Output object at TargetPath:
{
"found": bool, // the subjectId resolved to a user
"subjectId": "...",
"email": "...", // the user's directory e-mail (absent when unset)
"name": "...", // the user's user name (absent when unset)
"preferredChannel": "SIGNAL", // channel derived from the preferred binding's kind
// (legacy strings verbatim); ABSENT when none
"effectiveChannel": "SIGNAL", // "SIGNAL" | "TEAMS" | "EMAIL" — fallback chain applied
"channelAddress": "+43660...", // the selected identifier value; ABSENT for EMAIL
"identifiers": [ // all valid bindings, for diagnostics / future branches
{ "kind": "PhoneNumber", "value": "+43660..." }
]
}
TRANSITIONAL (pre-System.Identity-2.18.0 rollout skew): a user carrying only the legacy kind-level PreferredChannel string ("TEAMS" | "SIGNAL") and no binding id gets the old kind-level resolution; multiple valid bindings of the preferred kind (a user may enroll several phone numbers) are then disambiguated DETERMINISTICALLY — the most recently verified binding wins (LastVerifiedAt, falling back to EnrolledAt; ties broken by the lowest binding rtId) and a warning names the chosen identifier and the number of alternatives. The choice never varies between runs for unchanged data.
public record ResolveNotificationChannelNodeConfiguration : TargetPathNodeConfiguration, INodeConfiguration, IEquatable<NodeConfiguration>, ITargetPathNodeConfiguration, IEquatable<TargetPathNodeConfiguration>, IEquatable<ResolveNotificationChannelNodeConfiguration>
Inheritance Object → NodeConfiguration → TargetPathNodeConfiguration → ResolveNotificationChannelNodeConfiguration
Implements INodeConfiguration, IEquatable<NodeConfiguration>, ITargetPathNodeConfiguration, IEquatable<TargetPathNodeConfiguration>, IEquatable<ResolveNotificationChannelNodeConfiguration>
Properties
SubjectId
Literal subjectId (runtime id of the System.Identity/User, the same value the
identity service issues as the token sub) of the recipient to resolve.
public string SubjectId { get; set; }
Property Value
SubjectIdPath
JSONPath to resolve the recipient's subjectId from the data context
(e.g. $.body.toSubjectIds[0]). Takes precedence over ResolveNotificationChannelNodeConfiguration.SubjectId
when it resolves to a non-empty value.
public string SubjectIdPath { get; set; }
Property Value
TargetPath
public string TargetPath { get; set; }
Property Value
TargetValueWriteMode
public TargetValueWriteModes TargetValueWriteMode { get; set; }
Property Value
TargetValueWriteModes
TargetValueKind
public ValueKinds TargetValueKind { get; set; }
Property Value
ValueKinds
DocumentMode
public DocumentModes DocumentMode { get; set; }
Property Value
DocumentModes
Description
public string Description { get; set; }
Property Value
Constructors
ResolveNotificationChannelNodeConfiguration()
Initializes the node with the default sink $.recipient.
public ResolveNotificationChannelNodeConfiguration()