feat(auth): add contexts + platform.is_super_admin to /auth/me, factory role-category states

Additive enrichment to MeResource — existing fields untouched, MeTest stays green.
New fields:
- contexts.available: list<'portal'|'organizer'> derived from Person + Organisation memberships
- contexts.default: precedence super_admin > organizer > portal > fallback portal
- platform.is_super_admin: bool promoted from app_roles
- organisations[].roles: 1-element array form alongside the legacy scalar role,
  forward-compatible for the multi-role pivot work tracked in TECH-PIVOT-ROLES-MULTI

UserFactory gains volunteer(), orgAdmin(), volunteerAndOrganizer(), superAdmin()
state methods — codified role categories for reuse across future workstreams.

Adds forbidden.vue placeholder (PublicLayout) for the context-failure landing in
the upcoming guard rewrite.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-05 21:15:10 +02:00
parent b5a2140517
commit a2760ffd64
6 changed files with 272 additions and 19 deletions

View File

@@ -823,6 +823,38 @@ introduceert is het natuurlijke moment.
---
### TECH-PIVOT-ROLES-MULTI — Multi-role per (user, organisation) pivot
**Aanleiding:** WS-3 PR-B2a maakt context-aware routing op
`me.contexts.available` en `me.organisations[].roles`. Het pivot-veld
`organisation_user.role` is vandaag een single string (één rol per user
per org). De resource emit `roles` als 1-element array zodat het
frontend-contract forward-compatible is, maar het schema ondersteunt
nog niet meerdere rollen per relatie.
**Wat:** Architectuur-discussie + design-document, niet een directe
schema-uitbreiding. Te beantwoorden vragen voordat dit gepland wordt:
- Spatie-permission-integratie: blijft `organisation_user.role`
een free-form string of komt het onder `model_has_roles` met
team-id = organisation_id? Spatie's "teams" feature is bedoeld voor
precies dit scenario.
- Multi-role-precedence: als een user `org_admin` ÉN `event_manager` is
binnen dezelfde organisatie, hoe resolven policies? Hoogste
permissie-set? Meest restrictieve? Expliciete merge?
- Migratie-pad: bestaande pivot-rijen (single string) → array of
pivot-tabel naar `model_has_roles`? Backfill-strategie?
- Frontend impact: `organisations[].role` (scalar) blijft voorlopig
staan voor backward-compatibility. Wanneer mag dat veld weg?
**Prioriteit:** Laag — geen blocker voor B2a, B2b of de 4 kern-workflows.
Pas oppakken wanneer een concrete use case multi-role per (user, org)
vereist (denkbaar: festival waarbij organizer ook als crew werkt).
**Belangrijk:** dit is GEEN simpel "voeg een kolom toe" werk. Pak het
niet op als drive-by tijdens een ander ticket; het verdient een eigen
ARCH-discussie en RFC.
---
### ~~TECH-02 — scopeForFestival helper op Event model~~ ✅ OPGELOST
---