From 80ea100fc531d778a36dc20b89352374a19efcd1 Mon Sep 17 00:00:00 2001 From: David Jay Date: Mon, 6 Feb 2017 15:49:48 -0800 Subject: [PATCH] Making username update services atomic. --- services/users.js | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/services/users.js b/services/users.js index 1f36d969d..bab7b0d20 100644 --- a/services/users.js +++ b/services/users.js @@ -350,14 +350,16 @@ module.exports = class UsersService { return Promise.reject(new Error(`status ${status} is not supported`)); } - return UserModel.findOne({id}) - .then((user) => { - if (user.status === 'APPROVED' && status === 'PENDING') { - return Promise.resolve(); - } else { - return UserModel.update({id}, {$set: {status}}); - } - }); + return UserModel.update({ + id, + status: { + $ne: 'APPROVED' + } + }, { + $set: { + status + } + }); } /** @@ -651,17 +653,18 @@ module.exports = class UsersService { * @return {Promise} */ static editName(id, displayName) { - return UserModel.findOne({id}) - .then((user) => { - return user.canEditName ? - UserModel.update({id}, { - $set: { - displayName: displayName.toLowerCase(), - canEditName: false, - status: 'PENDING' - } - }) - : Promise.reject(new Error('Display name editing disabled for this account.')); - }); + return UserModel.update({ + id, + canEditName: true + }, { + $set: { + displayName: displayName.toLowerCase(), + canEditName: false, + status: 'PENDING' + } + }).then((result) => { + return result.nModified > 0 ? result : + Promise.reject(new Error('You do not have permission to update your username.')); + }); } };