discourse/app/assets/javascripts/admin/services/admin-tools.js.es6

127 lines
3.7 KiB
JavaScript

// A service that can act as a bridge between the front end Discourse application
// and the admin application. Use this if you need front end code to access admin
// modules. Inject it optionally, and if it exists go to town!
import AdminUser from 'admin/models/admin-user';
import { iconHTML } from 'discourse-common/lib/icon-library';
import { ajax } from 'discourse/lib/ajax';
import showModal from 'discourse/lib/show-modal';
import { getOwner } from 'discourse-common/lib/get-owner';
export default Ember.Service.extend({
init() {
this._super();
// TODO: Make `siteSettings` a service that can be injected
this.siteSettings = getOwner(this).lookup('site-settings:main');
},
checkSpammer(userId) {
return AdminUser.find(userId).then(au => this.spammerDetails(au));
},
spammerDetails(adminUser) {
return {
deleteUser: () => this._deleteSpammer(adminUser),
canDelete: adminUser.get('can_be_deleted') && adminUser.get('can_delete_all_posts')
};
},
_showControlModal(type, user, opts) {
opts = opts || {};
let controller = showModal(`admin-${type}-user`, {
admin: true,
modalClass: `${type}-user-modal`
});
if (opts.post) {
controller.set('post', opts.post);
}
return (user.adminUserView ?
Ember.RSVP.resolve(user) :
AdminUser.find(user.get('id'))
).then(loadedUser => {
controller.setProperties({
user: loadedUser,
loadingUser: false,
successCallback: opts.successCallback
});
});
},
showSilenceModal(user, opts) {
this._showControlModal('silence', user, opts);
},
showSuspendModal(user, opts) {
this._showControlModal('suspend', user, opts);
},
showModerationHistory(target) {
let controller = showModal('admin-moderation-history', { admin: true });
controller.loadHistory(target);
},
_deleteSpammer(adminUser) {
// Try loading the email if the site supports it
let tryEmail = this.siteSettings.show_email_on_profile ?
adminUser.checkEmail() :
Ember.RSVP.resolve();
return tryEmail.then(() => {
let message = I18n.messageFormat('flagging.delete_confirm_MF', {
"POSTS": adminUser.get('post_count'),
"TOPICS": adminUser.get('topic_count'),
email: adminUser.get('email') || I18n.t("flagging.hidden_email_address"),
ip_address: adminUser.get('ip_address') || I18n.t("flagging.ip_address_missing")
});
let userId = adminUser.get('id');
return new Ember.RSVP.Promise((resolve, reject) => {
const buttons = [
{
label: I18n.t("composer.cancel"),
class: "d-modal-cancel",
link: true
},
{
label: `${iconHTML('exclamation-triangle')} ` + I18n.t("flagging.yes_delete_spammer"),
class: "btn btn-danger confirm-delete",
callback() {
return ajax(`/admin/users/${userId}.json`, {
type: 'DELETE',
data: {
delete_posts: true,
block_email: true,
block_urls: true,
block_ip: true,
delete_as_spammer: true,
context: window.location.pathname
}
}).then(result => {
if (result.deleted) {
resolve();
} else {
throw 'failed to delete';
}
}).catch(() => {
bootbox.alert(I18n.t("admin.user.delete_failed"));
reject();
});
}
}
];
bootbox.dialog(message, buttons, {classes: "flagging-delete-spammer"});
});
});
}
});