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,52 @@ 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+ 'attachments ' => ['created_by ' , 'updated_by ' ],
202+ 'comments ' => ['created_by ' , 'updated_by ' ],
203+ 'deletions ' => ['deleted_by ' ],
204+ 'entities ' => ['created_by ' , 'updated_by ' ],
205+ 'images ' => ['created_by ' , 'updated_by ' ],
206+ 'imports ' => ['created_by ' ],
207+ 'joint_permissions ' => ['owner_id ' ],
208+ 'page_revisions ' => ['created_by ' ],
209+ 'sessions ' => ['user_id ' ],
210+ ];
211+
212+ foreach ($ toNullify as $ table => $ columns ) {
213+ foreach ($ columns as $ column ) {
214+ DB ::table ($ table )
215+ ->where ($ column , '= ' , $ user ->id )
216+ ->update ([$ column => null ]);
217+ }
218+ }
219+ }
220+
192221 /**
193222 * @throws NotifyException
194223 */
@@ -206,11 +235,12 @@ protected function ensureDeletable(User $user): void
206235 /**
207236 * Migrate ownership of items in the system from one user to another.
208237 */
209- protected function migrateOwnership (User $ fromUser , User $ toUser ): void
238+ protected function migrateOwnership (User $ fromUser , User | null $ toUser ): void
210239 {
240+ $ newOwnerValue = $ toUser ? $ toUser ->id : null ;
211241 DB ::table ('entities ' )
212242 ->where ('owned_by ' , '= ' , $ fromUser ->id )
213- ->update (['owned_by ' => $ toUser -> id ]);
243+ ->update (['owned_by ' => $ newOwnerValue ]);
214244 }
215245
216246 /**
@@ -248,7 +278,7 @@ protected function isOnlyAdmin(User $user): bool
248278 *
249279 * @throws UserUpdateException
250280 */
251- protected function setUserRoles (User $ user , array $ roles )
281+ protected function setUserRoles (User $ user , array $ roles ): void
252282 {
253283 $ roles = array_filter (array_values ($ roles ));
254284
@@ -261,7 +291,7 @@ protected function setUserRoles(User $user, array $roles)
261291
262292 /**
263293 * Check if the given user is the last admin and their new roles no longer
264- * contains the admin role.
294+ * contain the admin role.
265295 */
266296 protected function demotingLastAdmin (User $ user , array $ newRoles ): bool
267297 {
0 commit comments