File: /var/www/html/app/Http/Controllers/GoogleAuth.php
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use App\Services\ApiEndpoints;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Session;
use Laravel\Socialite\Facades\Socialite;
use Carbon\Carbon;
class GoogleAuth extends Controller
{
public function redirect(Request $request)
{
$role = $request->query('role');
// return Socialite::driver('google')->redirect();
return Socialite::driver('google')
->with(['prompt' => 'select_account'])
->redirect();
}
public function callback(Request $request)
{
try {
$clientIp = request()->getClientIp();
$device_name = Session::get("device_name");
$google_user = Socialite::driver('google')->user();
// If no user is found, register a new user
$fullName = $google_user->getName();
$nameParts = explode(' ', trim($fullName), 2);
$profilePicture = $google_user->getAvatar();
$body = [
'google_id' => $google_user->getId(),
'name' => $nameParts[0],
'lastname' => isset($nameParts[1]) ? $nameParts[1] : '',
'email' => $google_user->getEmail(),
'photo' => $profilePicture,
'nationality_id' => "1",
'role' => 'buyer',
'ip_address' => $clientIp,
'device_name' => $device_name,
];
$response = Http::post(ApiEndpoints::google(), $body);
if ($response->successful()) {
Session::flush();
$info = $response->json('message');
$user = $response->json('user');
$token = $response->json('token');
session(['user' => $user, 'token' => $token]);
$userCreatedAt = Carbon::parse($user['created_at']); // Convert to Carbon instance
$diffInSeconds = $userCreatedAt->diffInSeconds(now()); // Calculate the difference in seconds
if ($diffInSeconds <= 10) {
return redirect()->to('/complete-registration');
}
if ($user['role'] == 'seller' && $user['phone'] == null) {
Session::flash('success', 'Continue with NIN as a provider');
return redirect()->to('/nin-registration');
}
Session::flash('success', $info);
if (Session::get('redirect')) {
$this->addToFavorite();
return redirect()->to('/account/favorite');
} elseif (Session::get('url.intended')) {
return redirect()->intended('/services');
} else {
return redirect()->intended('/services');
}
} else {
$info = $response->json('message');
Session::flash('error', $info);
return redirect()->to('/login');
}
} catch (\Throwable $th) {
Log::info($th->getMessage());
Session::flash('error', 'Something went wrong, try again with another email pls!');
return redirect()->to('/login');
}
}
private function addToFavorite()
{
try {
$gig_slug = Session::get('gig_slug');
$body = [
'gig_slug' => $gig_slug,
];
$apiEndpoints = new ApiEndpoints();
$headers = $apiEndpoints->header();
$response = Http::withHeaders($headers)
->withBody(json_encode($body), 'application/json')
->post(ApiEndpoints::addFavorites());
if ($response->successful()) {
Session::flash('success', $response->json()['message']);
} else {
Session::flash('error', $response->json()['message']);
}
} catch (\Throwable $e) {
Log::error($e->getMessage());
Session::flash('error', 'Something went wrong, try again with another email pls!');
return redirect()->intended('/login');
}
}
}