diff --git a/app/Http/Controllers/SocialLoginController.php b/app/Http/Controllers/SocialLoginController.php index fb84a7a..5b38457 100644 --- a/app/Http/Controllers/SocialLoginController.php +++ b/app/Http/Controllers/SocialLoginController.php @@ -3,7 +3,11 @@ namespace App\Http\Controllers; use App\Models\User; +use Exception; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; use Laravel\Socialite\Facades\Socialite; class SocialLoginController extends Controller @@ -11,7 +15,7 @@ class SocialLoginController extends Controller public function redirect(string $driver) { return Socialite::driver($driver) - ->scopes(['name', 'email']) + ->scopes(['openid', 'profile', 'name', 'email']) ->redirect(); } @@ -27,10 +31,11 @@ public function handleProviderCallback(string $driver) Auth::login($user); $updates = []; - if ($user->profile_photo_path == null) { - $updates['profile_photo_path'] = $social->getAvatar(); + if (blank($user->profile_photo_path)) { + $updates['profile_photo_path'] = $this->buildAvatarUrl($social->getAvatar(), $social->token); + $updates['profile_photo_path'] = $this->fetchAvatar($social->getAvatar(), $social->token, $user->profilePhotoDisk()); } - if ($user->email == null) { + if (blank($user->email)) { $updates['email'] = $social->getEmail(); } $updates = array_purge($updates); @@ -38,13 +43,47 @@ public function handleProviderCallback(string $driver) $user->update($updates); } - return redirect()->route('dashboard'); + return redirect()->route('staff.worklist.index'); } else { $provider = ucfirst($driver); return redirect() ->route('login') - ->withErrors("Email {$social->getEmail()} not found for {$provider} login."); + ->withErrors("Email or username not found for {$provider} login."); } } + + public function buildAvatarUrl(?string $avatar_url, ?string $access_token): ?string + { + if (blank($avatar_url)) { + return null; + } + if (filled($access_token)) { + $avatar_url .= "?access_token={$access_token}"; + } + + return $avatar_url; + + } + + public function fetchAvatar(?string $avatar_url, ?string $access_token, string $disk): ?string + { + $url = $this->buildAvatarUrl($avatar_url, $access_token); + if (blank($url)) { + return null; + } + + try { + $response = Http::get($url); + if ($response->successful()) { + $filename = 'avatars/' . Str::uuid() . '.jpg'; + Storage::disk($disk)->put($filename, $response->body()); + + return $filename; + } + } catch (Exception) { + } + + return null; + } }