diff --git a/.playwright-mcp/page-2026-03-19T11-19-05-308Z.png b/.playwright-mcp/page-2026-03-19T11-19-05-308Z.png new file mode 100644 index 0000000..071c639 Binary files /dev/null and b/.playwright-mcp/page-2026-03-19T11-19-05-308Z.png differ diff --git a/app/Http/Controllers/Auth/SocialiteController.php b/app/Http/Controllers/Auth/SocialiteController.php index 899a4b6..93c197b 100644 --- a/app/Http/Controllers/Auth/SocialiteController.php +++ b/app/Http/Controllers/Auth/SocialiteController.php @@ -8,6 +8,7 @@ use App\Models\Role; use App\Models\User; use App\Services\ActivityLogger; +use Illuminate\Database\QueryException; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Arr; @@ -100,41 +101,47 @@ private function processCallback(): RedirectResponse Log::info('[Azure SSO] Full Azure user dump', json_decode(json_encode($azureUser), true)); - $user = User::query()->updateOrCreate( - ['username' => $azureUser->getEmail()], - [ - 'name' => $azureUser->getName(), - 'email' => $azureUser->user['mail'] ?? $azureUser->getEmail(), - 'azure_id' => $azureUser->getId(), - 'photo' => $azureUser->getAvatar(), - 'job_title' => Arr::get($azureUser->user, 'jobTitle'), - 'department' => Arr::get($azureUser->user, 'department'), - 'company_name' => Arr::get($azureUser->user, 'companyName'), - 'phone' => Arr::get($azureUser->user, 'mobilePhone', Arr::get($azureUser->user, 'businessPhones.0')), - 'email_verified_at' => now(), - ] - ); + try { + $user = User::query()->updateOrCreate( + ['username' => $azureUser->getEmail()], + [ + 'name' => $azureUser->getName(), + 'email' => $azureUser->user['mail'] ?? $azureUser->getEmail(), + 'azure_id' => $azureUser->getId(), + 'photo' => $azureUser->getAvatar(), + 'job_title' => Arr::get($azureUser->user, 'jobTitle'), + 'department' => Arr::get($azureUser->user, 'department'), + 'company_name' => Arr::get($azureUser->user, 'companyName'), + 'phone' => Arr::get($azureUser->user, 'mobilePhone', Arr::get($azureUser->user, 'businessPhones.0')), + 'email_verified_at' => now(), + ] + ); - Log::info('[Azure SSO] Local user upserted', [ - 'user_id' => $user->id, - 'email' => $user->email, - 'was_recent' => $user->wasRecentlyCreated, - 'role_id' => $user->role_id, - ]); - - if ($user->role_id === null) { - $user->update(['role_id' => Role::where('name', 'user')->first()->id]); - - Log::info('[Azure SSO] Default role assigned', [ + Log::info('[Azure SSO] Local user upserted', [ 'user_id' => $user->id, + 'email' => $user->email, + 'was_recent' => $user->wasRecentlyCreated, 'role_id' => $user->role_id, ]); + + if ($user->role_id === null) { + $user->update(['role_id' => Role::where('name', 'user')->first()->id]); + + Log::info('[Azure SSO] Default role assigned', [ + 'user_id' => $user->id, + 'role_id' => $user->role_id, + ]); + } + + auth()->login($user); + + ActivityLogger::log('login', $user->id, metadata: ['email' => $user->email, 'firm_name' => Arr::get($azureUser->user, 'companyName')]); + } catch (QueryException $e) { + Log::error('[Azure SSO] Database error during user upsert', ['message' => $e->getMessage(), 'email' => $azureUser->getEmail()]); + + return redirect('/')->with('error', 'Something went wrong during sign-in. Please try again or contact support.'); } - auth()->login($user); - - ActivityLogger::log('login', $user->id, metadata: ['email' => $user->email, 'firm_name' => Arr::get($azureUser->user, 'companyName')]); - return redirect('/'); } } diff --git a/resources/js/Components/FlashNotification.vue b/resources/js/Components/FlashNotification.vue new file mode 100644 index 0000000..c93138b --- /dev/null +++ b/resources/js/Components/FlashNotification.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/resources/js/Layouts/AppLayout.vue b/resources/js/Layouts/AppLayout.vue index a9db670..50f0f89 100644 --- a/resources/js/Layouts/AppLayout.vue +++ b/resources/js/Layouts/AppLayout.vue @@ -2,6 +2,7 @@ import { computed } from 'vue' import { usePage } from '@inertiajs/vue3' import PageHeader from '@/Components/PageHeader.vue' +import FlashNotification from '@/Components/FlashNotification.vue' const page = usePage() @@ -13,6 +14,7 @@ const pageTitle = computed(() => {