View file ProForum/Files/application/app/Lib/SocialLogin.php

File size: 4.96Kb
<?php

namespace App\Lib;

use Exception;
use App\Models\User;
use App\Constants\Status;
use App\Models\UserLogin;
use App\Models\AdminNotification;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Config;
use Laravel\Socialite\Facades\Socialite;


class SocialLogin
{
    private $provider;
    public function __construct($provider)
    {
        $this->provider = $provider;
        $this->configuration();
    }

    public function redirectDriver()
    {
        return Socialite::driver($this->provider)->redirect();
    }

    private function configuration()
    {
        $provider = $this->provider;
        $configuration = gs()->socialite_credentials->$provider;
        Config::set('services.' . $provider, [
            'client_id'     => $configuration->client_id,
            'client_secret' => $configuration->client_secret,
            'redirect'      => route('user.social.login.callback', $provider),
        ]);

    }

    public function login()
    {
        $user = Socialite::driver($this->provider)->user();
        $username = $this->generateUsername($user->name);
        $userData = User::where('username', $username)->first();

        if (!$userData) {
            $emailExists = User::where('email', @$user->email)->exists();
            if ($emailExists) {
                throw new Exception('Email already exists');
            }
            $userData = $this->createUser($user, $this->provider);
        }

        auth()->login($userData);
        $this->loginLog($userData);

        return to_route('user.home');
    }

    private function createUser($user, $provider)
    {
        $general = gs();
        $password = getTrx(8);
        $firstName = preg_replace('/\W\w+\s*(\W*)$/', '$1', $user->name);
        $pieces = explode(' ', $user->name);
        $lastName = array_pop($pieces);
        $username = $this->generateUsername($user->name);

        if (@$firstName) {
            $firstName = $firstName;
        }
        if (@$lastName) {
            $lastName = $lastName;
        }

        $newUser = new User();
        $newUser->username = $username;
        $newUser->email = $user->email;
        $newUser->password = Hash::make($password);
        $newUser->firstname = $firstName;
        $newUser->lastname = $lastName;

        $newUser->address = [
            'address' => '',
            'state' => '',
            'zip' => '',
            'country' => '',
            'city' => ''
        ];

        $newUser->status = 1;
        $newUser->kv = $general->kv ? 0 :01;
        $newUser->ev = 1;
        $newUser->sv = 1;
        $newUser->ts = 0;
        $newUser->tv = 1;
        $newUser->reg_step = 1;
        $newUser->login_by = $provider;

        if (@$user->avatar) {
            $fileName = uniqid() . time() . '.jpg';
            file_put_contents(getFilePath('userProfile') . '/' . $fileName, file_get_contents($this->provider != 'facebook' ? $user->avatar : $user->avatar . '&access_token=' . $user->token));
            $newUser->image = $fileName;
        }

        $newUser->save();

        $adminNotification = new AdminNotification();
        $adminNotification->user_id = $newUser->id;
        $adminNotification->title = 'New member registered';
        $adminNotification->click_url = urlPath('admin.users.detail', $newUser->id);
        $adminNotification->save();

        return $newUser;
    }

    private function loginLog($user)
    {
        //Login Log Create
        $ip = getRealIP();
        $exist = UserLogin::where('user_ip', $ip)->first();
        $userLogin = new UserLogin();

        //Check exist or not
        if ($exist) {
            $userLogin->longitude =  $exist->longitude;
            $userLogin->latitude =  $exist->latitude;
            $userLogin->city =  $exist->city;
            $userLogin->country_code = $exist->country_code;
            $userLogin->country =  $exist->country;
        } else {
            $info = json_decode(json_encode(getIpInfo()), true);
            $userLogin->longitude =  @implode(',', $info['long']);
            $userLogin->latitude =  @implode(',', $info['lat']);
            $userLogin->city =  @implode(',', $info['city']);
            $userLogin->country_code = @implode(',', $info['code']);
            $userLogin->country =  @implode(',', $info['country']);
        }

        $userAgent = osBrowser();
        $userLogin->user_id = $user->id;
        $userLogin->user_ip =  $ip;

        $userLogin->browser = @$userAgent['browser'];
        $userLogin->os = @$userAgent['os_platform'];
        $userLogin->save();
    }


    protected function generateUsername($name)
    {
        // get first word into name
        $firstName = preg_replace('/\W\w+\s*(\W*)$/', '$1', $name);
        // get first and last word array wise set
        $pieces = explode(' ', $name);
        // get last word into name
        $lastName = array_pop($pieces);
        $username = preg_replace("/[^a-z0-9_]/", '', strtolower($firstName . $lastName));

        return $username;
    }
}