user(); $session = $this->impersonationService->start( admin: $admin, targetUser: $user, reason: $request->validated('reason'), mfaCode: $request->validated('mfa_code'), mfaMethod: MfaMethod::from($request->validated('mfa_method')), ipAddress: $request->ip(), userAgent: $request->userAgent(), ); $session->load('targetUser.organisations'); return $this->success([ 'session' => new ImpersonationSessionResource($session), 'user' => new AdminUserResource($session->targetUser), ]); } /** * Stop impersonation. * POST /admin/stop-impersonation * Called by the admin (without X-Impersonate-User header). */ public function stop(Request $request): JsonResponse { /** @var User $admin */ $admin = $request->user(); $session = $this->impersonationService->getActiveSessionForAdmin($admin); if (! $session) { return $this->error('No active impersonation session.', 400); } $this->impersonationService->stop($session); return $this->success([ 'user' => new AdminUserResource($admin->load('organisations')), ]); } /** * Get impersonation status. * GET /admin/impersonate/status */ public function status(Request $request): JsonResponse { /** @var User $admin */ $admin = $request->user(); $session = $this->impersonationService->getActiveSessionForAdmin($admin); if (! $session) { return $this->success([ 'active' => false, ]); } $session->load('targetUser'); return $this->success([ 'active' => true, 'session' => new ImpersonationSessionResource($session), ]); } /** * Send MFA email code for impersonation verification. * POST /admin/impersonate/send-mfa-code */ public function sendMfaCode(Request $request): JsonResponse { /** @var User $admin */ $admin = $request->user(); if (! $admin->mfa_enabled) { return $this->error('MFA is not enabled.', 403); } $this->mfaService->sendEmailCode($admin); return $this->success(null, 'Verification code sent.'); } }