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 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ message }}
+
+
+
+
+
+
+
+
+
+
+
+
+
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(() => {
+
![]()