diff --git a/src/mailer.js b/src/mailer.js index 1bb5b5ab4..5567cc55a 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -226,16 +226,15 @@ function sendInvite(user, invitor) { }); } -function userAdded(user) { +function userAdded(emailTo, user) { + assert.strictEqual(typeof emailTo, 'string'); assert.strictEqual(typeof user, 'object'); - debug('Sending mail for userAdded'); + debug(`userAdded: Sending mail for added users ${user.fallbackEmail} to ${emailTo}`); getMailConfig(function (error, mailConfig) { if (error) return debug('Error getting mail details:', error); - var adminEmails = _.difference(mailConfig.adminEmails, [ user.email ]); - var templateData = { user: user, cloudronName: mailConfig.cloudronName, @@ -250,7 +249,7 @@ function userAdded(user) { var mailOptions = { from: mailConfig.notificationFrom, - to: adminEmails.join(', '), + to: emailTo, subject: util.format('[%s] User %s added', mailConfig.cloudronName, user.fallbackEmail), text: render('user_added.ejs', templateDataText), html: render('user_added.ejs', templateDataHTML) diff --git a/src/notifications.js b/src/notifications.js index 762421503..fd8b61ec7 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -6,15 +6,23 @@ exports = module.exports = { add: add, get: get, ack: ack, - listPaged: listPaged + listPaged: listPaged, + + // specialized notifications + userAdded: userAdded }; var assert = require('assert'), + async = require('async'), DatabaseError = require('./databaseerror.js'), debug = require('debug')('box:notifications'), + mailer = require('./mailer.js'), notificationdb = require('./notificationdb.js'), + users = require('./users.js'), util = require('util'); +const NOOP_CALLBACK = function (error) { if (error) debug(error); }; + function NotificationsError(reason, errorOrMessage) { assert.strictEqual(typeof reason, 'string'); assert(errorOrMessage instanceof Error || typeof errorOrMessage === 'string' || typeof errorOrMessage === 'undefined'); @@ -37,17 +45,14 @@ util.inherits(NotificationsError, Error); NotificationsError.INTERNAL_ERROR = 'Internal Error'; NotificationsError.NOT_FOUND = 'Not Found'; -function au - -function add(userId, title, message, action, sendEmail, callback) { +function add(userId, title, message, action, callback) { assert.strictEqual(typeof userId, 'string'); assert.strictEqual(typeof title, 'string'); assert.strictEqual(typeof message, 'string'); assert.strictEqual(typeof action, 'string'); - assert.strictEqual(typeof sendEmail, 'boolean'); assert.strictEqual(typeof userId, 'function'); - debug('add: ', userId, title, action, 'email: ', sendEmail); + debug('add: ', userId, title, action); notificationdb.add({ userId: userId, @@ -105,3 +110,19 @@ function listPaged(userId, acknowledged, page, perPage, callback) { callback(null, result.filter(function (r) { return r.acknowledged === acknowledged; })); }); } + +function userAdded(user, callback) { + assert.strictEqual(typeof user, 'object'); + assert(typeof callback === 'undefined' || typeof callback === 'function'); + + callback = callback || NOOP_CALLBACK; + + users.getAllAdmins(function (error, result) { + if (error) return callback(new NotificationsError(NotificationsError.INTERNAL_ERROR, error)); + + async.each(result, function (admin, callback) { + mailer.userAdded(admin.email, user); + add(admin.id, 'User added', `User ${user.fallbackEmail} was added`, '', callback); + }, callback); + }); +} diff --git a/src/users.js b/src/users.js index 4e6a4ad55..fa26e666f 100644 --- a/src/users.js +++ b/src/users.js @@ -42,6 +42,7 @@ var apps = require('./apps.js'), groups = require('./groups.js'), GroupsError = groups.GroupsError, hat = require('./hat.js'), + notifications = require('./notifications.js'), mailer = require('./mailer.js'), qrcode = require('qrcode'), safe = require('safetydance'), @@ -206,7 +207,7 @@ function create(username, password, email, displayName, options, auditSource, ca eventlog.add(eventlog.ACTION_USER_ADD, auditSource, { userId: user.id, email: user.email, user: removePrivateFields(user), invitor: invitor }); - if (!isOwner) mailer.userAdded(user); + if (!isOwner) notifications.userAdded(user); }); }); });