radfusion/app/Http/Controllers/SocialLoginController.php
2025-01-05 20:07:08 +06:00

92 lines
2.5 KiB
PHP

<?php
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
{
public function redirect(string $driver)
{
return Socialite::driver($driver)
->scopes(['openid', 'profile', 'name', 'email'])
->redirect();
}
public function handleProviderCallback(string $driver)
{
$social = Socialite::driver($driver)->user();
$user = User::where(['email' => strtolower($social->getEmail())])->first();
if ($user == null) {
$user = User::where(['username' => strtolower($social->getNickname())])->first();
}
if ($user) {
Auth::login($user);
$updates = [];
if (blank($user->profile_photo_path)) {
$updates['profile_photo_path'] = $this->fetchAvatar(
$social->getAvatar(),
$social->token,
$user->profilePhotoDisk());
}
if (blank($user->email)) {
$updates['email'] = $social->getEmail();
}
$updates = array_purge($updates);
if (! empty($updates)) {
$user->update($updates);
}
return redirect()->route('staff.worklist.index');
} else {
$provider = ucfirst($driver);
return redirect()
->route('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;
}
}