ProtectedisIs this row for the notice at hand? A primary record must be the caller's primary scope, the recipient, or one of the recipient's roles; every secondary scope the row names must match the notice's.
Resolves every channel for one notice. candidates are the type's rows, any status.
ProtectedscoreSpecificity: secondary scopes match +4, primary record +2, global +1 (the prompt resolver's scale).
ScopedNotificationConfigResolver: the notification sibling of
ScopedPromptConfigResolver. Given the configs for a notification type, the scope the notice is sent in and the recipient, it answers each channel from the most specific in-scope row down.In scope: a global row (no primary record, no secondary scopes); a row whose primary record is the caller's primary scope, the recipient, or a role the recipient holds; and in every case a row whose secondary scopes all match the notice's. Specificity is the primitive's score: secondary match +4, primary record +2, global +1, ties by
Priority. At equal specificity oneDenybeats anyAllow, MJ's permission rule. ADenyon a row withIsLockedis absorbing for everything less specific and for the recipient's own preference.Pluggable through
ClassFactory:CreateScopedNotificationConfigResolver()returns a host's@RegisterClass(ScopedNotificationConfigResolver)subclass when one is registered, else this base. The base itself carries no decorator, likeScopedPromptConfigResolver: a decorated class in this package would pull it into every host's generated class manifest, and the server bootstrap does not depend on it.isInScopeandscoreare the override points.