fractal->item($request->user()) ->transformWith($this->getTransformer(AccountTransformer::class)) ->toArray(); } /** * Update the authenticated user's email address. */ public function updateEmail(UpdateEmailRequest $request): JsonResponse { $user = $request->user(); // Only allow a user to change their email three times in the span // of 24 hours. This prevents malicious users from trying to find // existing accounts in the system by constantly changing their email. if (RateLimiter::tooManyAttempts($key = "user:update-email:{$user->uuid}", 3)) { throw new TooManyRequestsHttpException(message: 'Your email address has been changed too many times today. Please try again later.'); } $original = $user->email; if (mb_strtolower($original) !== mb_strtolower($request->validated('email'))) { RateLimiter::hit($key, self::EMAIL_UPDATE_THROTTLE); $this->updateService->handle($user, $request->validated()); Activity::event('user:account.email-changed') ->property(['old' => $original, 'new' => $request->validated('email')]) ->log(); } return new JsonResponse([], Response::HTTP_NO_CONTENT); } /** * Update the authenticated user's password. All existing sessions will be logged * out immediately. * * @throws \Throwable */ public function updatePassword(UpdatePasswordRequest $request): JsonResponse { $user = Activity::event('user:account.password-changed')->transaction(function () use ($request) { return $this->updateService->handle($request->user(), $request->validated()); }); $guard = $this->manager->guard(); // If you do not update the user in the session you'll end up working with a // cached copy of the user that does not include the updated password. Do this // to correctly store the new user details in the guard and allow the logout // other devices functionality to work. $guard->setUser($user); // This method doesn't exist in the stateless Sanctum world. if (method_exists($guard, 'logoutOtherDevices')) { // @phpstan-ignore function.alreadyNarrowedType $guard->logoutOtherDevices($request->input('password')); } return new JsonResponse([], Response::HTTP_NO_CONTENT); } }