AuthRepository.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace App\Repositories;
  3. use App\Models\User;
  4. use App\Models\PersonalAccessToken;
  5. use App\DataTransferObjects\AuthDto;
  6. use Carbon\Carbon;
  7. use Illuminate\Support\Facades\Auth;
  8. use Illuminate\Support\Facades\DB;
  9. class AuthRepository implements AuthRepositoryInterface
  10. {
  11. public function __construct(
  12. protected User $userModel,
  13. protected PersonalAccessToken $personalAccessTokenModel
  14. ) {}
  15. public function findUserByEmail(string $email): ?User
  16. {
  17. return $this->userModel->where('email', $email)->first();
  18. }
  19. public function findToken(string $token): ?PersonalAccessToken
  20. {
  21. return $this->personalAccessTokenModel->findToken($token);
  22. }
  23. public function createAccessToken(User $user, string $deviceId): string
  24. {
  25. return $user->createToken(
  26. "access_token_{$deviceId}",
  27. ['access'],
  28. Carbon::now()->addMinutes(15)
  29. )->plainTextToken;
  30. }
  31. public function createRefreshToken(User $user, string $deviceId): string
  32. {
  33. return $user->createToken(
  34. "refresh_token_{$deviceId}",
  35. ['refresh'],
  36. Carbon::now()->addDays(30)
  37. )->plainTextToken;
  38. }
  39. public function updateTokenExpiration(PersonalAccessToken $token, \DateTime $expirationTime): void
  40. {
  41. $token->update(['expires_at' => $expirationTime]);
  42. }
  43. public function deleteUserTokensByDevice(User $user, string $deviceId): void
  44. {
  45. $user->tokens()
  46. ->where('name', 'like', "%_{$deviceId}")
  47. ->delete();
  48. }
  49. public function attemptLogin(AuthDto $credentials): bool
  50. {
  51. return Auth::attempt($credentials->toArray());
  52. }
  53. public function refreshToken(PersonalAccessToken $tokenModel, User $user, string $deviceId): array
  54. {
  55. return DB::transaction(function () use ($tokenModel, $user, $deviceId) {
  56. $this->updateTokenExpiration($tokenModel, Carbon::now()->addMinutes(2));
  57. $accessToken = $this->createAccessToken($user, $deviceId);
  58. $refreshToken = $this->createRefreshToken($user, $deviceId);
  59. return [
  60. 'access_token' => $accessToken,
  61. 'refresh_token' => $refreshToken,
  62. ];
  63. });
  64. }
  65. }