diff --git a/framework/core/js/forum/src/components/UserCard.js b/framework/core/js/forum/src/components/UserCard.js
index 0a2cd28ed..4c44bfc42 100644
--- a/framework/core/js/forum/src/components/UserCard.js
+++ b/framework/core/js/forum/src/components/UserCard.js
@@ -39,7 +39,8 @@ export default class UserCard extends Component {
children: controls,
className: 'UserCard-controls App-primaryControl',
menuClassName: 'Dropdown-menu--right',
- buttonClassName: this.props.controlsButtonClassName
+ buttonClassName: this.props.controlsButtonClassName,
+ icon: 'ellipsis-v'
}) : ''}
diff --git a/framework/core/js/forum/src/utils/UserControls.js b/framework/core/js/forum/src/utils/UserControls.js
index 2f58338e2..f78ccd92b 100644
--- a/framework/core/js/forum/src/utils/UserControls.js
+++ b/framework/core/js/forum/src/utils/UserControls.js
@@ -1,7 +1,7 @@
import Button from 'flarum/components/Button';
import Separator from 'flarum/components/Separator';
import EditUserModal from 'flarum/components/EditUserModal';
-import DeleteUserModal from 'flarum/components/DeleteUserModal';
+import UserPage from 'flarum/components/UserPage';
import ItemList from 'flarum/utils/ItemList';
/**
@@ -80,7 +80,7 @@ export default {
destructiveControls(user) {
const items = new ItemList();
- if (user.canDelete()) {
+ if (user.id() !== '1' && user.canDelete()) {
items.add('delete', Button.component({
icon: 'times',
children: app.trans('core.delete'),
@@ -95,7 +95,15 @@ export default {
* Delete the user.
*/
deleteAction() {
- app.modal.show(new DeleteUserModal({user: this}));
+ if (confirm('Are you sure you want to delete this user? All of the user\'s posts will be deleted.')) {
+ this.delete().then(() => {
+ if (app.current instanceof UserPage && app.current.user === this) {
+ app.history.back();
+ } else {
+ window.location.reload();
+ }
+ });
+ }
},
/**
diff --git a/framework/core/src/Core/Users/Listeners/UserMetadataUpdater.php b/framework/core/src/Core/Users/Listeners/UserMetadataUpdater.php
index 54fd8d40d..5de95c267 100755
--- a/framework/core/src/Core/Users/Listeners/UserMetadataUpdater.php
+++ b/framework/core/src/Core/Users/Listeners/UserMetadataUpdater.php
@@ -37,7 +37,9 @@ class UserMetadataUpdater
*/
public function whenPostWasDeleted(PostWasDeleted $event)
{
- $this->updateCommentsCount($event->post->user, -1);
+ if ($event->post->user->exists) {
+ $this->updateCommentsCount($event->post->user, -1);
+ }
}
/**
diff --git a/framework/core/src/Core/Users/User.php b/framework/core/src/Core/Users/User.php
index 5d8a8b623..57c7f0bfb 100755
--- a/framework/core/src/Core/Users/User.php
+++ b/framework/core/src/Core/Users/User.php
@@ -8,6 +8,7 @@ use Flarum\Events\RegisterUserPreferences;
use Illuminate\Contracts\Hashing\Hasher;
use Flarum\Core\Formatter\FormatterManager;
use Flarum\Events\UserWasDeleted;
+use Flarum\Events\PostWasDeleted;
use Flarum\Events\UserWasRegistered;
use Flarum\Events\UserWasRenamed;
use Flarum\Events\UserEmailWasChanged;
@@ -95,8 +96,31 @@ class User extends Model
{
parent::boot();
+ // Don't allow the root admin to be deleted.
+ static::deleting(function (User $user) {
+ if ($user->id == 1) {
+ throw new DomainException('Cannot delete the root admin');
+ }
+ });
+
static::deleted(function ($user) {
$user->raise(new UserWasDeleted($user));
+
+ // Delete all of the posts by the user. Before we delete them
+ // in a big batch query, we will loop through them and raise a
+ // PostWasDeleted event for each post.
+ $posts = $user->posts()->allTypes();
+
+ foreach ($posts->get() as $post) {
+ $user->raise(new PostWasDeleted($post));
+ }
+
+ $posts->delete();
+
+ $user->read()->detach();
+ $user->groups()->detach();
+ $user->accessTokens()->delete();
+ $user->notifications()->delete();
});
event(new RegisterUserPreferences);
@@ -479,13 +503,23 @@ class User extends Model
}
/**
- * Define the relationship with the user's activity.
+ * Define the relationship with the user's posts.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
- public function activity()
+ public function posts()
{
- return $this->hasMany('Flarum\Core\Activity\Activity');
+ return $this->hasMany('Flarum\Core\Posts\Post');
+ }
+
+ /**
+ * Define the relationship with the user's read discussions.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function read()
+ {
+ return $this->belongsToMany('Flarum\Core\Discussions\Discussion', 'users_discussions');
}
/**