diff --git a/app/DAL/Studies/UserStudyListerBase.php b/app/DAL/Studies/UserStudyListerBase.php index e60e6e1..764f448 100644 --- a/app/DAL/Studies/UserStudyListerBase.php +++ b/app/DAL/Studies/UserStudyListerBase.php @@ -17,7 +17,7 @@ protected static function defaultSortQuery(Builder $query): Builder { return $query ->orderBy('study_priority', 'desc') - ->orderBy('received_at', 'asc'); + ->orderBy('received_at'); } protected static function reportPendingQuery(Builder $query): Builder diff --git a/app/Http/Controllers/SocialLoginController.php b/app/Http/Controllers/SocialLoginController.php new file mode 100644 index 0000000..e16cd62 --- /dev/null +++ b/app/Http/Controllers/SocialLoginController.php @@ -0,0 +1,50 @@ +scopes(['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 ($user->profile_photo_path == null) { + $updates['profile_photo_path'] = $social->getAvatar(); + } + if ($user->email == null) { + $updates['email'] = $social->getEmail(); + } + $updates = array_purge($updates); + if (! empty($updates)) { + $user->update($updates); + } + + return redirect()->route('dashboard'); + } else { + $provider = ucfirst($driver); + + return redirect() + ->route('login') + ->withErrors("Email {$social->getEmail()} not found for {$provider} login."); + } + } +} diff --git a/composer.json b/composer.json index f7b1d5a..cafb155 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,7 @@ "laravel/framework": "^11.31", "laravel/jetstream": "^5.3", "laravel/sanctum": "^4.0", + "laravel/socialite": "^5.16", "laravel/tinker": "^2.9", "livewire/livewire": "^3.0", "phpoffice/phpword": "^1.3", diff --git a/routes/web.php b/routes/web.php index 16d034b..3b5e577 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,6 +2,7 @@ use App\Http\Controllers\Guest\ViewSharedStudyController; use App\Http\Controllers\Radiologist\ReportWriteController; +use App\Http\Controllers\SocialLoginController; use App\Http\Controllers\Staff\StudiesController; use App\Http\Controllers\System\SyncOrthancController; use Illuminate\Support\Facades\Route; @@ -40,3 +41,8 @@ }); Route::view('/ck', 'ck'); + +Route::group(['prefix' => 'social', 'as' => 'social.'], function () { + Route::get('{driver}', [SocialLoginController::class, 'redirect'])->name('login'); + Route::get('{driver}/callback', [SocialLoginController::class, 'callback']); +});