55use BookStack \Access \UserInviteException ;
66use BookStack \Access \UserInviteService ;
77use BookStack \Activity \ActivityType ;
8- use BookStack \Entities \EntityProvider ;
9- use BookStack \Entities \Models \Entity ;
108use BookStack \Exceptions \NotifyException ;
119use BookStack \Exceptions \UserUpdateException ;
1210use BookStack \Facades \Activity ;
@@ -27,7 +25,6 @@ public function __construct(
2725 ) {
2826 }
2927
30-
3128 /**
3229 * Get a user by their email address.
3330 */
@@ -161,15 +158,12 @@ public function update(User $user, array $data, bool $manageUsersAllowed): User
161158 *
162159 * @throws Exception
163160 */
164- public function destroy (User $ user , ?int $ newOwnerId = null )
161+ public function destroy (User $ user , ?int $ newOwnerId = null ): void
165162 {
166163 $ this ->ensureDeletable ($ user );
167164
168- $ user ->socialAccounts ()->delete ();
169- $ user ->apiTokens ()->delete ();
170- $ user ->favourites ()->delete ();
171- $ user ->mfaValues ()->delete ();
172- $ user ->watches ()->delete ();
165+ $ this ->removeUserDependantRelations ($ user );
166+ $ this ->nullifyUserNonDependantRelations ($ user );
173167 $ user ->delete ();
174168
175169 // Delete user profile images
@@ -178,17 +172,53 @@ public function destroy(User $user, ?int $newOwnerId = null)
178172 // Delete related activities
179173 setting ()->deleteUserSettings ($ user ->id );
180174
175+ // Migrate or nullify ownership
176+ $ newOwner = null ;
181177 if (!empty ($ newOwnerId )) {
182178 $ newOwner = User::query ()->find ($ newOwnerId );
183- if (!is_null ($ newOwner )) {
184- $ this ->migrateOwnership ($ user , $ newOwner );
185- }
186- // TODO - Should be be nullifying ownership instead?
187179 }
180+ $ this ->migrateOwnership ($ user , $ newOwner );
188181
189182 Activity::add (ActivityType::USER_DELETE , $ user );
190183 }
191184
185+ protected function removeUserDependantRelations (User $ user ): void
186+ {
187+ $ user ->apiTokens ()->delete ();
188+ $ user ->socialAccounts ()->delete ();
189+ $ user ->favourites ()->delete ();
190+ $ user ->mfaValues ()->delete ();
191+ $ user ->watches ()->delete ();
192+
193+ $ tables = ['email_confirmations ' , 'user_invites ' , 'views ' ];
194+ foreach ($ tables as $ table ) {
195+ DB ::table ($ table )->where ('user_id ' , '= ' , $ user ->id )->delete ();
196+ }
197+ }
198+ protected function nullifyUserNonDependantRelations (User $ user ): void
199+ {
200+ $ toNullify = [
201+ 'activities ' => ['user_id ' ],
202+ 'attachments ' => ['created_by ' , 'updated_by ' ],
203+ 'comments ' => ['created_by ' , 'updated_by ' ],
204+ 'deletions ' => ['deleted_by ' ],
205+ 'entities ' => ['created_by ' , 'updated_by ' ],
206+ 'images ' => ['created_by ' , 'updated_by ' ],
207+ 'imports ' => ['created_by ' ],
208+ 'joint_permissions ' => ['owner_id ' ],
209+ 'page_revisions ' => ['created_by ' ],
210+ 'sessions ' => ['user_id ' ],
211+ ];
212+
213+ foreach ($ toNullify as $ table => $ columns ) {
214+ foreach ($ columns as $ column ) {
215+ DB ::table ($ table )
216+ ->where ($ column , '= ' , $ user ->id )
217+ ->update ([$ column => null ]);
218+ }
219+ }
220+ }
221+
192222 /**
193223 * @throws NotifyException
194224 */
@@ -206,11 +236,12 @@ protected function ensureDeletable(User $user): void
206236 /**
207237 * Migrate ownership of items in the system from one user to another.
208238 */
209- protected function migrateOwnership (User $ fromUser , User $ toUser ): void
239+ protected function migrateOwnership (User $ fromUser , User | null $ toUser ): void
210240 {
241+ $ newOwnerValue = $ toUser ? $ toUser ->id : null ;
211242 DB ::table ('entities ' )
212243 ->where ('owned_by ' , '= ' , $ fromUser ->id )
213- ->update (['owned_by ' => $ toUser -> id ]);
244+ ->update (['owned_by ' => $ newOwnerValue ]);
214245 }
215246
216247 /**
@@ -248,7 +279,7 @@ protected function isOnlyAdmin(User $user): bool
248279 *
249280 * @throws UserUpdateException
250281 */
251- protected function setUserRoles (User $ user , array $ roles )
282+ protected function setUserRoles (User $ user , array $ roles ): void
252283 {
253284 $ roles = array_filter (array_values ($ roles ));
254285
@@ -261,7 +292,7 @@ protected function setUserRoles(User $user, array $roles)
261292
262293 /**
263294 * Check if the given user is the last admin and their new roles no longer
264- * contains the admin role.
295+ * contain the admin role.
265296 */
266297 protected function demotingLastAdmin (User $ user , array $ newRoles ): bool
267298 {
0 commit comments