AuthService.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Services;
  3. use App\Repositories\AuthRepositoryInterface;
  4. use App\DTO\AuthDTO;
  5. use App\DTO\RefreshTokenDTO;
  6. use Illuminate\Support\Str;
  7. use Illuminate\Support\Facades\Auth;
  8. class AuthService
  9. {
  10. public function __construct(
  11. protected AuthRepositoryInterface $authRepository,
  12. ) {}
  13. public function login(AuthDTO $credentials): ?array
  14. {
  15. if (!$this->authRepository->attemptLogin(credentials: $credentials)) {
  16. return null;
  17. }
  18. $user = $this->authRepository->findUserByEmail(email: $credentials->email);
  19. $deviceId = Str::uuid()->toString();
  20. $accessToken = $this->authRepository->createAccessToken(user: $user, deviceId: $deviceId);
  21. $refreshToken = $this->authRepository->createRefreshToken(user: $user, deviceId: $deviceId);
  22. return [
  23. 'payload' => [
  24. 'access_token' => $accessToken,
  25. 'user' => $user,
  26. ],
  27. 'refreshToken' => $refreshToken
  28. ];
  29. }
  30. public function refresh(RefreshTokenDTO $refreshTokenDto): ?array
  31. {
  32. if (!$refreshTokenDto->refresh_token) {
  33. return null;
  34. }
  35. $tokenModel = $this->authRepository->findToken($refreshTokenDto->refresh_token);
  36. if (!$tokenModel || !in_array('refresh', $tokenModel->abilities) || $tokenModel->expires_at < now()) {
  37. return null;
  38. }
  39. $user = $tokenModel->tokenable;
  40. if (!$user) {
  41. return null;
  42. }
  43. $deviceId = Str::afterLast($tokenModel->name, '_');
  44. $tokens = $this->authRepository->refreshToken($tokenModel, $user, $deviceId);
  45. return [
  46. 'payload' => [
  47. 'access_token' => $tokens['access_token'],
  48. 'user' => $user,
  49. ],
  50. 'refreshToken' => $tokens['refresh_token']
  51. ];
  52. }
  53. public function logout(): void
  54. {
  55. $user = Auth::user();
  56. if (!$user) {
  57. return;
  58. }
  59. $tokenName = $user->currentAccessToken()->name;
  60. $deviceId = Str::afterLast($tokenName, '_');
  61. $this->authRepository->deleteUserTokensByDevice(user: $user, deviceId: $deviceId);
  62. }
  63. }