feat(behandelportal): WP-62 medewerker caller identity + authz seam

Splits backend CallerIdentity into the two ADR-0002 §3 actor kinds
(ZorgverlenerCaller/MedewerkerCaller), a stub X-Medewerker/X-Rollen header
path mirroring WP-53's citizen stub, and Authz.CanBeoordelen as the first
medewerker capability — backend-only, no consumer until WP-64. Also fixes
the backlog README's stale WP-61 status (done, but table said todo).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
eho
2026-07-31 23:47:43 +02:00
co-authored by Claude Sonnet 5
parent e4ea75414b
commit a09c4ed87b
21 changed files with 289 additions and 72 deletions
@@ -81,4 +81,30 @@ public class AuthzTests
Assert.True(Authz.Decisions(Drafter, "sent", DrafterId).CanRevealBigNummer);
Assert.False(Authz.Decisions(Approver, "draft", DrafterId).CanRevealBigNummer);
}
// --- CanBeoordelen (WP-62) --------------------------------------------------------------
[Fact]
public void CanBeoordelen_true_for_a_medewerker_with_the_behandelaar_rol()
{
var medewerker = new MedewerkerCaller("m.jansen", [MedewerkerRol.Behandelaar], "M. Jansen", PrincipalRole.Drafter);
Assert.True(Authz.CanBeoordelen(medewerker));
}
[Fact]
public void CanBeoordelen_false_for_a_medewerker_without_it()
{
var medewerker = new MedewerkerCaller("m.jansen", [], "M. Jansen", PrincipalRole.Drafter);
Assert.False(Authz.CanBeoordelen(medewerker));
}
[Theory]
[InlineData(PrincipalRole.Drafter)]
[InlineData(PrincipalRole.Approver)]
[InlineData(PrincipalRole.Admin)]
public void CanBeoordelen_false_for_a_zorgverlener_regardless_of_role(PrincipalRole role)
{
var zorgverlener = new ZorgverlenerCaller("111222333", "Dr. Test", role);
Assert.False(Authz.CanBeoordelen(zorgverlener));
}
}