public function handleProviderCallback($provider, UserRepository $userRepository)
 {
     /** @var User $oauthUser */
     $oauthUser = Socialite::driver($provider)->user();
     $oauthId = $oauthUser->getId();
     $idField = $provider . '_id';
     // if user with the oauth id already exists simply authenticate
     // meaning user has used this provider but may not have authenticated manually before
     // or used any other providers
     if ($user = $userRepository->where($idField, '=', $oauthId)->first()) {
         return $this->authenticateAndSendResponse($user);
     }
     // if email exists then add the provider id to user
     // this means user has authencated manually or other providers before
     if ($user = $userRepository->where('email', '=', $oauthUser->getEmail())->first()) {
         $user->{$idField} = $oauthId;
         // verify if not already verified
         list($saved, $user) = $userRepository->save($user->verify());
     } else {
         $user = $userRepository->createOauthUser($oauthUser, $idField, $oauthId);
     }
     return $this->authenticateAndSendResponse($user);
 }