AuthController.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\AuthRequest;
  4. use App\Http\Requests\ConfirmPasswordRequest;
  5. use App\Http\Requests\ForgotPasswordRequest;
  6. use App\Http\Requests\RefreshTokenRequest;
  7. use App\Http\Requests\ResetPasswordRequest;
  8. use App\Http\Requests\VerifyPasswordCodeRequest;
  9. use App\Http\Resources\AuthResource;
  10. use App\Services\AuthService;
  11. use Illuminate\Http\JsonResponse;
  12. use Illuminate\Http\Request;
  13. class AuthController extends Controller
  14. {
  15. public function __construct(protected AuthService $authService) {}
  16. public function login(AuthRequest $request): JsonResponse
  17. {
  18. $validated = $request->validated();
  19. $result = $this->authService->login(
  20. email: $validated["email"],
  21. password: $validated["password"],
  22. origem: $validated["origem"]
  23. );
  24. if (!$result) {
  25. return $this->errorResponse(message: __("auth.failed"), code: 401);
  26. }
  27. $cookieName = $this->getCookieName($request);
  28. return $this->successResponse(
  29. payload: new AuthResource($result["payload"]),
  30. message: __("auth.logged_in"),
  31. )->withCookie(
  32. cookie(
  33. $cookieName,
  34. $result["refreshToken"],
  35. config("sanctum.rt_expiration") * 60,
  36. "/",
  37. config("session.domain"),
  38. config("session.secure"),
  39. true,
  40. false,
  41. "Lax",
  42. ),
  43. );
  44. }
  45. public function logout(Request $request): JsonResponse
  46. {
  47. $this->authService->logout();
  48. $cookieName = $this->getCookieName($request);
  49. return $this->successResponse(
  50. message: __("auth.logout"),
  51. )->withoutCookie($cookieName);
  52. }
  53. public function refresh(RefreshTokenRequest $request): JsonResponse
  54. {
  55. $cookieName = $this->getCookieName($request);
  56. $refresh_token = $request->cookie($cookieName);
  57. if (is_null($refresh_token)) {
  58. return $this->errorResponse(
  59. code: 403,
  60. )->withoutCookie($cookieName);
  61. }
  62. $result = $this->authService->refresh(
  63. $refresh_token
  64. );
  65. if (is_null($result)) {
  66. return $this->errorResponse(
  67. message: __("auth.unauthorized"),
  68. code: 403,
  69. )->withoutCookie($cookieName);
  70. }
  71. return $this->successResponse(
  72. payload: new AuthResource($result["payload"]),
  73. )->withCookie(
  74. cookie(
  75. $cookieName,
  76. $result["refreshToken"],
  77. config("sanctum.rt_expiration") * 60,
  78. "/",
  79. config("session.domain"),
  80. config("session.secure"),
  81. true,
  82. true,
  83. "Lax",
  84. ),
  85. );
  86. }
  87. //
  88. public function confirmPassword(ConfirmPasswordRequest $request): JsonResponse
  89. {
  90. $validated = $request->validated();
  91. $confirmed = $this->authService->confirmPassword(
  92. password: $validated["password"],
  93. );
  94. if (!$confirmed) {
  95. return $this->errorResponse(message: __("auth.password"), code: 422);
  96. }
  97. return $this->successResponse(message: __("auth.password_confirmed"));
  98. }
  99. public function forgotPassword(ForgotPasswordRequest $request): JsonResponse
  100. {
  101. $validated = $request->validated();
  102. $sent = $this->authService->forgotPassword(
  103. email: $validated['email'],
  104. portal: $validated['portal'] ?? 'franchisee',
  105. );
  106. if (!$sent) {
  107. return $this->errorResponse(message: __('auth.email_not_found'), code: 422);
  108. }
  109. return $this->successResponse(message: __('auth.password_reset_sent'));
  110. }
  111. public function resetPassword(ResetPasswordRequest $request): JsonResponse
  112. {
  113. $validated = $request->validated();
  114. $reset = $this->authService->resetPassword(
  115. email: $validated['email'],
  116. code: $validated['code'],
  117. password: $validated['password'],
  118. );
  119. if (!$reset) {
  120. return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
  121. }
  122. return $this->successResponse(message: __('auth.password_reset_success'));
  123. }
  124. public function verifyPasswordCode(VerifyPasswordCodeRequest $request): JsonResponse
  125. {
  126. $validated = $request->validated();
  127. $valid = $this->authService->verifyPasswordCode(
  128. email: $validated['email'],
  129. code: $validated['code'],
  130. );
  131. if (!$valid) {
  132. return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
  133. }
  134. return $this->successResponse(message: __('auth.code_verified'));
  135. }
  136. /**
  137. * Resolves the dynamic cookie name based on the requesting application.
  138. */
  139. private function getCookieName(mixed $request): string
  140. {
  141. $appOrigin = $request->header("X-App-Origin", "default");
  142. return "{$appOrigin}_refresh_token";
  143. }
  144. }