Skip to main content

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

String

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

String

TargetPath

public string TargetPath { get; set; }

Property Value

String

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

String

Constructors

ResolveNotificationChannelNodeConfiguration()

Initializes the node with the default sink $.recipient.

public ResolveNotificationChannelNodeConfiguration()