]> BookStack Code Mirror - bookstack/commitdiff
My Account: Added self-delete flow
authorDan Brown <redacted>
Thu, 19 Oct 2023 09:48:27 +0000 (10:48 +0100)
committerDan Brown <redacted>
Thu, 19 Oct 2023 09:48:27 +0000 (10:48 +0100)
app/Users/Controllers/UserAccountController.php
lang/en/preferences.php
resources/views/users/account/delete.blade.php [new file with mode: 0644]
resources/views/users/account/profile.blade.php
resources/views/users/delete.blade.php
routes/web.php

index bdd923d6da10ba06f81cb57aeabed91b755e8511..2ff58ffac3a75815d9ab36864c9c6e8dc676e662 100644 (file)
@@ -191,4 +191,31 @@ class UserAccountController extends Controller
 
         return redirect('/my-account/auth');
     }
+
+    /**
+     * Show the user self-delete page.
+     */
+    public function delete()
+    {
+        $this->setPageTitle(trans('preferences.delete_my_account'));
+
+        return view('users.account.delete', [
+            'category' => 'profile',
+        ]);
+    }
+
+    /**
+     * Remove the current user from the system.
+     */
+    public function destroy(Request $request)
+    {
+        $this->preventAccessInDemoMode();
+
+        $requestNewOwnerId = intval($request->get('new_owner_id')) ?: null;
+        $newOwnerId = userCan('users-manage') ? $requestNewOwnerId : null;
+
+        $this->userRepo->destroy(user(), $newOwnerId);
+
+        return redirect('/');
+    }
 }
index 04261266233c176a2040cd226ef64814d321804c..2b88f9671ffa3cce3b4d7e091ba98561fbe91df5 100644 (file)
@@ -43,4 +43,9 @@ return [
     'profile_avatar_desc' => 'Select an image which will be used to represent yourself to others in the system. Ideally this image should be square and about 256px in width and height.',
     'profile_admin_options' => 'Administrator Options',
     'profile_admin_options_desc' => 'Additional administrator-level options, like those to manage role assignments, can be found for your user account in the "Settings > Users" area of the application.',
+
+    'delete_account' => 'Delete Account',
+    'delete_my_account' => 'Delete My Account',
+    'delete_my_account_desc' => 'This will fully delete your user account from the system. You will not be able to recover this account or revert this action. Content you\'ve created, such as created pages and uploaded images, will remain.',
+    'delete_my_account_warning' => 'Are you sure you want to delete your account?',
 ];
diff --git a/resources/views/users/account/delete.blade.php b/resources/views/users/account/delete.blade.php
new file mode 100644 (file)
index 0000000..75698d9
--- /dev/null
@@ -0,0 +1,43 @@
+@extends('users.account.layout')
+
+@section('main')
+
+    <div class="card content-wrap auto-height">
+        <form action="{{ url("/my-account") }}" method="POST">
+            {{ csrf_field() }}
+            {{ method_field('delete') }}
+
+
+            <h1 class="list-heading">{{ trans('preferences.delete_my_account') }}</h1>
+
+            <p>{{ trans('preferences.delete_my_account_desc') }}</p>
+
+            @if(userCan('users-manage'))
+                <hr class="my-l">
+
+                <div class="grid half gap-xl v-center">
+                    <div>
+                        <label class="setting-list-label">{{ trans('settings.users_migrate_ownership') }}</label>
+                        <p class="small">{{ trans('settings.users_migrate_ownership_desc') }}</p>
+                    </div>
+                    <div>
+                        @include('form.user-select', ['name' => 'new_owner_id', 'user' => null])
+                    </div>
+                </div>
+            @endif
+
+            <hr class="my-l">
+
+            <div class="grid half">
+                <p class="text-neg"><strong>{{ trans('preferences.delete_my_account_warning') }}</strong></p>
+                <div class="text-right">
+                    <a href="{{ url("/my-account/profile") }}"
+                       class="button outline">{{ trans('common.cancel') }}</a>
+                    <button type="submit" class="button">{{ trans('common.confirm') }}</button>
+                </div>
+            </div>
+
+        </form>
+    </div>
+
+@stop
index 785d562e47da31503edd34fb45f816efa849c50e..617c0972302ebaeb24ffe94dfeda2d366bac4c06 100644 (file)
@@ -68,6 +68,7 @@
             </div>
 
             <div class="form-group text-right">
+                <a href="{{ url('/my-account/delete') }}" class="button outline">{{ trans('preferences.delete_account') }}</a>
                 <button class="button">{{ trans('common.save') }}</button>
             </div>
 
index b2f08b6412a64f7a623280fa1c967c670d4c50dc..c927ed243bfde7103bae337be4ab11c32f709813 100644 (file)
@@ -6,33 +6,31 @@
         @include('settings.parts.navbar', ['selected' => 'users'])
 
         <form action="{{ url("/settings/users/{$user->id}") }}" method="POST">
-            {!! csrf_field() !!}
+            {{ csrf_field() }}
+            {{ method_field('delete') }}
 
             <div class="card content-wrap auto-height">
                 <h1 class="list-heading">{{ trans('settings.users_delete') }}</h1>
 
                 <p>{{ trans('settings.users_delete_warning', ['userName' => $user->name]) }}</p>
 
-                @if(userCan('users-manage'))
-                    <hr class="my-l">
-
-                    <div class="grid half gap-xl v-center">
-                        <div>
-                            <label class="setting-list-label">{{ trans('settings.users_migrate_ownership') }}</label>
-                            <p class="small">{{ trans('settings.users_migrate_ownership_desc') }}</p>
-                        </div>
-                        <div>
-                            @include('form.user-select', ['name' => 'new_owner_id', 'user' => null])
-                        </div>
+                <hr class="my-l">
+
+                <div class="grid half gap-xl v-center">
+                    <div>
+                        <label class="setting-list-label">{{ trans('settings.users_migrate_ownership') }}</label>
+                        <p class="small">{{ trans('settings.users_migrate_ownership_desc') }}</p>
                     </div>
-                @endif
+                    <div>
+                        @include('form.user-select', ['name' => 'new_owner_id', 'user' => null])
+                    </div>
+                </div>
 
                 <hr class="my-l">
 
                 <div class="grid half">
                     <p class="text-neg"><strong>{{ trans('settings.users_delete_confirm') }}</strong></p>
                     <div class="text-right">
-                        <input type="hidden" name="_method" value="DELETE">
                         <a href="{{ url("/settings/users/{$user->id}") }}" class="button outline">{{ trans('common.cancel') }}</a>
                         <button type="submit" class="button">{{ trans('common.confirm') }}</button>
                     </div>
index 16c3c3d6aa59be2a8e829f3efca3b8308020f288..69ce5167c3112f23200bb4b963c4ea6f5f5f8725 100644 (file)
@@ -242,6 +242,8 @@ Route::middleware('auth')->group(function () {
     Route::put('/my-account/notifications', [UserControllers\UserAccountController::class, 'updateNotifications']);
     Route::get('/my-account/auth', [UserControllers\UserAccountController::class, 'showAuth']);
     Route::put('/my-account/auth/password', [UserControllers\UserAccountController::class, 'updatePassword']);
+    Route::get('/my-account/delete', [UserControllers\UserAccountController::class, 'delete']);
+    Route::delete('/my-account', [UserControllers\UserAccountController::class, 'destroy']);
     Route::patch('/preferences/change-view/{type}', [UserControllers\UserPreferencesController::class, 'changeView']);
     Route::patch('/preferences/change-sort/{type}', [UserControllers\UserPreferencesController::class, 'changeSort']);
     Route::patch('/preferences/change-expansion/{type}', [UserControllers\UserPreferencesController::class, 'changeExpansion']);