userModel->where('email', $email)->first(); } public function findToken(string $token): ?PersonalAccessToken { return $this->personalAccessTokenModel->findToken($token); } public function createAccessToken(User $user, string $deviceId): string { return $user->createToken( "access_token_{$deviceId}", ['access'], Carbon::now()->addMinutes(15) )->plainTextToken; } public function createRefreshToken(User $user, string $deviceId): string { return $user->createToken( "refresh_token_{$deviceId}", ['refresh'], Carbon::now()->addDays(30) )->plainTextToken; } public function updateTokenExpiration(PersonalAccessToken $token, \DateTime $expirationTime): void { $token->update(['expires_at' => $expirationTime]); } public function deleteUserTokensByDevice(User $user, string $deviceId): void { $user->tokens() ->where('name', 'like', "%_{$deviceId}") ->delete(); } public function attemptLogin(AuthDto $credentials): bool { return Auth::attempt($credentials->toArray()); } public function refreshToken(PersonalAccessToken $tokenModel, User $user, string $deviceId): array { return DB::transaction(function () use ($tokenModel, $user, $deviceId) { $this->updateTokenExpiration($tokenModel, Carbon::now()->addMinutes(2)); $accessToken = $this->createAccessToken($user, $deviceId); $refreshToken = $this->createRefreshToken($user, $deviceId); return [ 'access_token' => $accessToken, 'refresh_token' => $refreshToken, ]; }); } }