Current File : /home/getxxhzo/app.genicards.com/app/Http/Controllers/SocialAuthController.php |
<?php
namespace App\Http\Controllers;
use App\Models\MultiTenant;
use App\Models\Plan;
use App\Models\Role;
use App\Models\SocialAccount;
use App\Models\Subscription;
use App\Models\User;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Laracasts\Flash\Flash;
use Laravel\Socialite\Facades\Socialite;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
class SocialAuthController extends Controller
{
public function redirectToSocial($provider): RedirectResponse
{
return Socialite::driver($provider)->redirect();
}
/**
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function handleSocialCallback($provider): \Illuminate\Http\RedirectResponse
{
if (Auth::check()) {
return redirect('/');
}
$socialUser = Socialite::driver($provider)->user();
if (empty($socialUser['email'])) {
Flash::error(__('messages.placeholder.we_could_not_fb_id'));
return redirect(route('register'));
}
try {
DB::beginTransaction();
/** @var User $user */
$user = User::whereRaw('lower(email) = ?', strtolower($socialUser['email']))->first();
$existingAccount = null;
if (! empty($user)) {
/** @var SocialAccount $existingProfile */
$existingAccount = SocialAccount::where('provider_id', $socialUser->id)->first();
} else {
$username = explode(' ', $socialUser['name']);
$userData['first_name'] = $username[0];
$userData['last_name'] = $username[1];
$userData['email'] = $socialUser['email'];
$userData['email_verified_at'] = Carbon::now();
$userData['password'] = bcrypt(Str::random(40));
$userData['affiliate_code'] = generateUniqueAffiliateCode();
$tenant = MultiTenant::create(['tenant_username' => $userData['first_name']]);
$userData['tenant_id'] = $tenant->id;
/** @var User $user */
$user = User::create($userData)->assignRole(Role::ROLE_ADMIN);
$plan = Plan::whereIsDefault(true)->first();
$subscription = new Subscription();
$subscription->plan_id = $plan->id;
$subscription->starts_at = Carbon::now();
$subscription->ends_at = Carbon::now()->addDays($plan->trial_days);
$subscription->plan_amount = $plan->price;
$subscription->plan_frequency = $plan->frequency;
$subscription->trial_ends_at = Carbon::now()->addDays($plan->trial_days);
$subscription->no_of_vcards = $plan->no_of_vcards;
$subscription->tenant_id = $user['tenant_id'];
$subscription->status = Subscription::ACTIVE;
$subscription->saveQuietly();
}
if (empty($existingAccount)) {
$existingAccount = SocialAccount::where('provider_id', $socialUser->id)->first();
if (empty($existingAccount)) {
$socialAccount = new SocialAccount();
$socialAccount->tenant_id = $user->tenant_id;
$socialAccount->provider = $provider;
$socialAccount->provider_id = $socialUser->id;
$socialAccount->save();
}
}
DB::commit();
Auth::login($user);
return redirect(route('admin.dashboard'));
} catch (Exception $e) {
DB::rollBack();
throw new UnprocessableEntityHttpException($e->getMessage());
}
}
}