diff --git a/services/email/banned.html.ejs b/services/email/banned.html.ejs
new file mode 100644
index 000000000..4fd8f191c
--- /dev/null
+++ b/services/email/banned.html.ejs
@@ -0,0 +1 @@
+<%= body.replace(/\n/g, '
') %>
diff --git a/services/email/banned.txt.ejs b/services/email/banned.txt.ejs
new file mode 100644
index 000000000..b36560ec5
--- /dev/null
+++ b/services/email/banned.txt.ejs
@@ -0,0 +1 @@
+<%= body %>
diff --git a/services/users.js b/services/users.js
index 9906ef6c0..e0f7d1599 100644
--- a/services/users.js
+++ b/services/users.js
@@ -398,7 +398,7 @@ module.exports = class UsersService {
// TODO: current updating status behavior is weird.
// once a user has been `APPROVED` its status cannot be
// changed anymore.
- return UserModel.findOneAndUpdate({
+ const user = await UserModel.findOneAndUpdate({
id,
status: {
$ne: 'APPROVED'
@@ -410,6 +410,25 @@ module.exports = class UsersService {
}, {
new: true,
});
+
+ if (status === 'BANNED') {
+ let localProfile = user.profiles.find((profile) => profile.provider === 'local');
+ if (localProfile) {
+ const options =
+ {
+ template: 'banned', // needed to know which template to render!
+ locals: { // specifies the template locals.
+ body: 'In accordance with The Coral Project’s community guidelines, your account has been banned. You are now longer allowed to comment, flag or engage with our community.'
+ },
+ subject: 'Your account has been banned',
+ to: localProfile.id // This only works if the user has registered via e-mail.
+ // We may want a standard way to access a user's e-mail address in the future
+ };
+ await MailerService.sendSimple(options);
+ }
+
+ }
+ return user;
}
/**
diff --git a/test/server/services/users.js b/test/server/services/users.js
index dddd5eda8..b4a15e3ba 100644
--- a/test/server/services/users.js
+++ b/test/server/services/users.js
@@ -1,8 +1,11 @@
const UsersService = require('../../../services/users');
const SettingsService = require('../../../services/settings');
+const MailerService = require('../../../services/mailer');
const chai = require('chai');
chai.use(require('chai-as-promised'));
+const sinon = require('sinon');
+chai.use(require('sinon-chai'));
const expect = chai.expect;
describe('services.UsersService', () => {
@@ -15,7 +18,7 @@ describe('services.UsersService', () => {
mockUsers = await UsersService.createLocalUsers([{
email: 'stampi@gmail.com',
username: 'Stampi',
- password: '1Coral!-'
+ password: '1Coral!-',
}, {
email: 'sockmonster@gmail.com',
username: 'Sockmonster',
@@ -25,6 +28,12 @@ describe('services.UsersService', () => {
username: 'Marvel',
password: '3Coral!3'
}]);
+
+ sinon.spy(MailerService, 'sendSimple');
+ });
+
+ afterEach(() => {
+ MailerService.sendSimple.restore();
});
describe('#findById()', () => {
@@ -149,7 +158,11 @@ describe('services.UsersService', () => {
.then(() => UsersService.findById(mockUsers[0].id))
.then((user) => {
expect(user).to.have.property('status', 'ACTIVE');
+ })
+ .then(() => {
+ expect(MailerService.sendSimple).to.not.have.been.called;
});
+
});
});
@@ -188,6 +201,12 @@ describe('services.UsersService', () => {
.then(() => UsersService.findById(mockUsers[0].id))
.then((user) => {
expect(user).to.have.property('status', 'BANNED');
+ })
+ .then(() => {
+ expect(MailerService.sendSimple).to.have.been.calledWithMatch({
+ template: 'banned',
+ to: mockUsers[0].profiles[0].id
+ });
});
});