Trade-In account impersonation: onderzoeken vanaf de klantzijde
Hoe impersonation specifiek scoped is naar de trade-in customer surface, waarom het op een eigen M020 detail page leeft en wat scoping van profile en notifications voorkomt.
De trade-in module heeft zijn eigen auth shell, eigen RLS en eigen user model — los van de operator app, om goede redenen. Dat betekent dat impersonation van een trade-in customer een eigen pad nodig heeft; het operator-side impersonation tool bereikt de customer surface niet. De pagina /admin/trade-in-accounts/[id] (M020 detail) is waar dat pad leeft.
Wat het doet
Vanuit de M020 detail page kiest een platform-staff user een trade-in account en start een impersonated session ervoor. De session opent het customer-facing portal zoals die customer het zou zien: pickup requests, bids, awarded ITADs, invoices, notifications. Read-only — dezelfde write-block van operator-side impersonation geldt ook hier.
Waarom scoped naar M020
Omdat trade-in customers en operator users in verschillende tabellen leven, met verschillende join paths naar companies. De operator-side impersonate flow gaat uit van operator-tenant relationships; de trade-in side gaat uit van customer-account relationships. De twee in één tool bedraden zou een brij conditionals zijn geweest — een aparte pagina voor elk is cleaner, en de M020 detail page is sowieso de natuurlijke thuisbasis voor trade-in account admin.
Profile + notifications scoping
Profile component en notifications component lezen expliciet de impersonated company wanneer een impersonation context actief is. Zo ziet de platform-staff user wat de customer ziet: het customerprofiel, de customernotifications en geen accountdecoratie van de medewerker zelf.
Banner countdown
Impersonation toont bovenaan een banner: “impersonating {company} — read-only — exit in {time}.” De countdown gebruikt een server-derived timestamp, zodat de banner stabiel blijft bij page load en de resterende read-only sessietijd duidelijk is.
Audit log, end-to-end
Elke pagina die de impersonator bezoekt schrijft naar de activity log met action “impersonate-view: /trade-in/{path}” en de user_id van de impersonator. Einde session schrijft een “impersonate-end” event met duration. De impersonated customer kan de log via zijn account opvragen, en het platform kan het antwoord “heeft iemand van het platform onze data bekeken, wanneer en wat?” leveren met rijen, niet alinea’s.