lms/app/Http/Controllers/Auth/GoogleAuthController.php
2025-12-15 12:26:23 +01:00

80 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers\Auth;
use App\Enums\UserType;
use App\Models\User;
use App\Services\AuthService;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
class GoogleAuthController extends Controller
{
public AuthService $authService;
public function __construct()
{
$this->authService = new AuthService();
}
/**
* Show the google sighup/login form.
*/
public function show(Request $request)
{
session()->put('from', $request->from);
return Socialite::driver('google')->redirect();
}
/**
* Back to the specific route after login.
*/
public function callback()
{
$from = session()->get('from');
try {
$user = Socialite::driver('google')->user();
$registered = User::where('google_id', $user->id)->orWhere('email', $user->email)->first();
if ($registered) {
// Update existing user's tokens
$this->authService->updateGoogleTokens($registered, $user);
Auth::login($registered, true);
} else {
$registered = $this->authService->googleAuthRegister($user);
event(new Registered($registered));
Auth::login($registered, true);
}
if ($registered->role === UserType::STUDENT->value) {
if ($from && $from == 'api') {
session()->forget('from');
return redirect()->intended(config('app.frontend_url') . '/student');
} else {
return redirect()->intended(route('student.index', ['tab' => 'courses'], absolute: false));
}
} else {
if ($from && $from == 'api') {
session()->forget('from');
return redirect()->intended(config('app.frontend_url') . '/dashboard');
} else {
return redirect()->intended(route('dashboard', absolute: false));
}
}
} catch (\Throwable $th) {
if ($from && $from == 'api') {
session()->forget('from');
return redirect()->intended(config('app.frontend_url') . '/login');
} else {
return redirect()->route('login')->with('error', $th->getMessage());
}
}
}
}