From a1b6b96e26a28383e36f92168952dfe9dfbae3e7 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Mon, 9 Feb 2026 11:59:20 +0100 Subject: [PATCH] Update account area --- .../Controllers/Admin/AdminPageController.php | 2 + app/Observers/UserActivityObserver.php | 41 ++++++++- ...9_114731_add_deleted_by_to_users_table.php | 28 ++++++ resources/views/admin/dashboard.blade.php | 9 +- resources/views/admin/users/deleted.blade.php | 18 ++++ tests/Unit/Admin/DeletedUsersByColumnTest.php | 91 +++++++++++++++++++ 6 files changed, 186 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2026_02_09_114731_add_deleted_by_to_users_table.php create mode 100644 tests/Unit/Admin/DeletedUsersByColumnTest.php diff --git a/app/Http/Controllers/Admin/AdminPageController.php b/app/Http/Controllers/Admin/AdminPageController.php index 61743b620..138873bd9 100644 --- a/app/Http/Controllers/Admin/AdminPageController.php +++ b/app/Http/Controllers/Admin/AdminPageController.php @@ -69,6 +69,7 @@ class AdminPageController extends BasePageController 'icon_color' => 'text-'.$activity->color_class.'-600 dark:text-'.$activity->color_class.'-400', 'created_at' => $activity->created_at, 'username' => $activity->username, + 'metadata' => $activity->metadata, ]; })->toArray(); }); @@ -92,6 +93,7 @@ class AdminPageController extends BasePageController 'icon_color' => $activity->icon_color, 'created_at' => $activity->created_at->diffForHumans(), 'username' => $activity->username, + 'metadata' => $activity->metadata, ]; }, $activities), ]); diff --git a/app/Observers/UserActivityObserver.php b/app/Observers/UserActivityObserver.php index 20db48180..68411ff49 100644 --- a/app/Observers/UserActivityObserver.php +++ b/app/Observers/UserActivityObserver.php @@ -58,6 +58,31 @@ class UserActivityObserver } } + /** + * Handle the User "deleting" event (before soft delete). + * Sets the deleted_by field to track who deleted the account. + */ + public function deleting(User $user): void + { + $deletedBy = auth()->user()?->username ?? 'System'; + + // Check if user is deleting their own account + if (auth()->check() && auth()->id() === $user->id) { + $deletedBy = 'Self'; + } + + // Update the deleted_by field directly in the database + // We use a direct query to avoid triggering update events + User::withoutEvents(function () use ($user, $deletedBy) { + User::withTrashed() + ->where('id', $user->id) + ->update(['deleted_by' => $deletedBy]); + }); + + // Store the deleted_by value on the model for the deleted event + $user->deleted_by = $deletedBy; + } + /** * Handle the User "deleted" event (soft delete). */ @@ -72,7 +97,7 @@ class UserActivityObserver 'description' => "User deleted: {$user->username}", 'metadata' => [ 'email' => $user->email, - 'deleted_by' => auth()->user()?->username ?? 'System', + 'deleted_by' => $user->deleted_by ?? 'System', ], ]); } @@ -83,6 +108,11 @@ class UserActivityObserver */ public function restored(User $user): void { + // Clear the deleted_by field when user is restored + User::withoutEvents(function () use ($user) { + User::where('id', $user->id)->update(['deleted_by' => null]); + }); + UserActivity::create([ 'user_id' => $user->id, 'username' => $user->username, @@ -99,6 +129,13 @@ class UserActivityObserver */ public function forceDeleted(User $user): void { + $deletedBy = auth()->user()?->username ?? 'System'; + + // Check if user is deleting their own account + if (auth()->check() && auth()->id() === $user->id) { + $deletedBy = 'Self'; + } + // Log permanent deletion UserActivity::create([ 'user_id' => null, // User no longer exists @@ -107,7 +144,7 @@ class UserActivityObserver 'description' => "User permanently deleted: {$user->username}", 'metadata' => [ 'email' => $user->email, - 'deleted_by' => auth()->user()?->username ?? 'System', + 'deleted_by' => $deletedBy, 'permanent' => true, ], ]); diff --git a/database/migrations/2026_02_09_114731_add_deleted_by_to_users_table.php b/database/migrations/2026_02_09_114731_add_deleted_by_to_users_table.php new file mode 100644 index 000000000..b319e2f16 --- /dev/null +++ b/database/migrations/2026_02_09_114731_add_deleted_by_to_users_table.php @@ -0,0 +1,28 @@ +string('deleted_by')->nullable()->after('deleted_at'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('deleted_by'); + }); + } +}; diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index b87f05f88..70a87730d 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -477,7 +477,14 @@
-

{{ $activity->message }}

+

+ {{ $activity->message }} + @if($activity->type === 'deleted' && isset($activity->metadata['deleted_by'])) + + (by {{ $activity->metadata['deleted_by'] }}{{ isset($activity->metadata['permanent']) ? ', permanent' : '' }}) + + @endif +

{{ $activity->created_at->diffForHumans() }}

diff --git a/resources/views/admin/users/deleted.blade.php b/resources/views/admin/users/deleted.blade.php index e78f84a4b..2b5275423 100644 --- a/resources/views/admin/users/deleted.blade.php +++ b/resources/views/admin/users/deleted.blade.php @@ -160,6 +160,7 @@ @endif + Deleted By Actions @@ -196,6 +197,23 @@ {{ $user->deleted_at ? $user->deleted_at->format('Y-m-d H:i') : 'N/A' }} + + @if($user->deleted_by === 'Self') + + Self + + @elseif($user->deleted_by === 'System') + + System + + @elseif($user->deleted_by) + + {{ $user->deleted_by }} + + @else + N/A + @endif +