PasswordResetController.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\ForgotPasswordRequest;
  4. use App\Http\Requests\VerifyCodeRequest;
  5. use App\Http\Requests\ResetPasswordRequest;
  6. use App\Http\Resources\UserResource;
  7. use App\Services\AuthService;
  8. use App\Services\PasswordResetService;
  9. use Illuminate\Http\JsonResponse;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Str;
  12. class PasswordResetController extends Controller
  13. {
  14. public function __construct(
  15. protected PasswordResetService $passwordResetService,
  16. protected AuthService $authService,
  17. ) {}
  18. public function forgotPassword(ForgotPasswordRequest $request): JsonResponse
  19. {
  20. $validated = $request->validated();
  21. $sent = $this->passwordResetService->sendCode(
  22. email: $validated['email'],
  23. tipo: $validated['tipo'],
  24. );
  25. if (!$sent) {
  26. return $this->errorResponse(
  27. message: __('auth.wrong_type'),
  28. code: 403,
  29. );
  30. }
  31. return $this->successResponse(
  32. message: __('auth.password_reset_sent'),
  33. );
  34. }
  35. public function verifyCode(VerifyCodeRequest $request): JsonResponse
  36. {
  37. $validated = $request->validated();
  38. $valid = $this->passwordResetService->verifyCode(
  39. email: $validated['email'],
  40. code: $validated['codigo'],
  41. );
  42. if (!$valid) {
  43. return $this->errorResponse(
  44. message: __('auth.password_reset_invalid'),
  45. code: 422,
  46. );
  47. }
  48. return $this->successResponse(
  49. message: 'OK',
  50. );
  51. }
  52. public function resetPassword(ResetPasswordRequest $request): JsonResponse
  53. {
  54. $validated = $request->validated();
  55. $user = $this->passwordResetService->resetPassword(
  56. email: $validated['email'],
  57. code: $validated['codigo'],
  58. password: $validated['password'],
  59. );
  60. if (!$user) {
  61. return $this->errorResponse(
  62. message: __('auth.password_reset_invalid'),
  63. code: 422,
  64. );
  65. }
  66. $deviceId = Str::uuid()->toString();
  67. $accessToken = $user->createAccessToken($deviceId);
  68. $refreshToken = $user->createRefreshToken($deviceId);
  69. $cookieName = $this->getCookieName($request);
  70. return $this->successResponse(
  71. payload: [
  72. 'access_token' => $accessToken,
  73. 'user' => new UserResource($user),
  74. ],
  75. message: __('auth.password_reset_success'),
  76. )->withCookie(
  77. cookie(
  78. $cookieName,
  79. $refreshToken,
  80. config('sanctum.rt_expiration') * 60,
  81. '/',
  82. config('session.domain'),
  83. config('session.secure'),
  84. true,
  85. false,
  86. 'Lax',
  87. ),
  88. );
  89. }
  90. }