diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 027e7f9..7f55913 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -117,8 +117,7 @@ class UserController extends Controller public function update(Request $request, string $id) { $user = User::findOrFail($id); - $oldRoles = $user->roles()->pluck('display_name')->join(', '); - + $validated = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['nullable', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)], @@ -130,6 +129,7 @@ class UserController extends Controller 'password.confirmed' => '密碼確認不符', ]); + // 1. Prepare data and detect changes $userData = [ 'name' => $validated['name'], 'email' => $validated['email'], @@ -140,26 +140,56 @@ class UserController extends Controller $userData['password'] = Hash::make($validated['password']); } - $user->update($userData); + $user->fill($userData); + // Capture dirty attributes for manual logging + $dirty = $user->getDirty(); + $oldAttributes = []; + $newAttributes = []; + + foreach ($dirty as $key => $value) { + $oldAttributes[$key] = $user->getOriginal($key); + $newAttributes[$key] = $value; + } + + // Save without triggering events (prevents duplicate log) + $user->saveQuietly(); + + // 2. Handle Roles + $roleChanges = null; if (isset($validated['roles'])) { + $oldRoles = $user->roles()->pluck('display_name')->join(', '); $user->syncRoles($validated['roles']); - $newRoles = $user->roles()->pluck('display_name')->join(', '); if ($oldRoles !== $newRoles) { - activity() - ->performedOn($user) - ->causedBy(auth()->user()) - ->event('updated') - ->withProperties([ - 'attributes' => ['role_id' => $newRoles], - 'old' => ['role_id' => $oldRoles], - ]) - ->log('updated'); + $roleChanges = [ + 'old' => $oldRoles, + 'new' => $newRoles + ]; } } + // 3. Manually Log activity (Single Consolidated Log) + if (!empty($newAttributes) || $roleChanges) { + $properties = [ + 'attributes' => $newAttributes, + 'old' => $oldAttributes, + ]; + + if ($roleChanges) { + $properties['attributes']['role_id'] = $roleChanges['new']; + $properties['old']['role_id'] = $roleChanges['old']; + } + + activity() + ->performedOn($user) + ->causedBy(auth()->user()) + ->event('updated') + ->withProperties($properties) + ->log('updated'); + } + return redirect()->route('users.index')->with('success', '使用者更新成功'); }