refactor user.updateProfile and write test

v1.18.x
barisusakli 9 years ago
parent 600082adc7
commit dd077117a2

@ -13,147 +13,138 @@ var plugins = require('../plugins');
module.exports = function (User) { module.exports = function (User) {
User.updateProfile = function (uid, data, callback) { User.updateProfile = function (uid, data, callback) {
var fields = ['username', 'email', 'fullname', 'website', 'location', 'groupTitle', 'birthday', 'signature', 'aboutme', 'picture', 'uploadedpicture']; var fields = ['username', 'email', 'fullname', 'website', 'location',
'groupTitle', 'birthday', 'signature', 'aboutme', 'picture', 'uploadedpicture'];
plugins.fireHook('filter:user.updateProfile', {uid: uid, data: data, fields: fields}, function (err, data) { async.waterfall([
if (err) { function (next) {
return callback(err); plugins.fireHook('filter:user.updateProfile', {uid: uid, data: data, fields: fields}, next);
} },
function (data, next) {
fields = data.fields; fields = data.fields;
data = data.data; data = data.data;
function isAboutMeValid(next) { async.series([
if (data.aboutme !== undefined && data.aboutme.length > meta.config.maximumAboutMeLength) { async.apply(isAboutMeValid, data),
next(new Error('[[error:about-me-too-long, ' + meta.config.maximumAboutMeLength + ']]')); async.apply(isSignatureValid, data),
} else { async.apply(isEmailAvailable, data, uid),
next(); async.apply(isUsernameAvailable, data, uid),
} async.apply(isGroupTitleValid, data)
} ], function (err) {
next(err);
function isSignatureValid(next) {
if (data.signature !== undefined && data.signature.length > meta.config.maximumSignatureLength) {
next(new Error('[[error:signature-too-long, ' + meta.config.maximumSignatureLength + ']]'));
} else {
next();
}
}
function isEmailAvailable(next) {
if (!data.email) {
return next();
}
if (!utils.isEmailValid(data.email)) {
return next(new Error('[[error:invalid-email]]'));
}
User.getUserField(uid, 'email', function (err, email) {
if (err) {
return next(err);
}
if(email === data.email) {
return next();
}
User.email.available(data.email, function (err, available) {
if (err) {
return next(err);
}
next(!available ? new Error('[[error:email-taken]]') : null);
});
}); });
} },
function (next) {
function isUsernameAvailable(next) { async.each(fields, function (field, next) {
if (!data.username) { if (!(data[field] !== undefined && typeof data[field] === 'string')) {
return next(); return next();
}
data.username = data.username.trim();
User.getUserFields(uid, ['username', 'userslug'], function (err, userData) {
if (err) {
return next(err);
} }
var userslug = utils.slugify(data.username); data[field] = data[field].trim();
if (data.username.length < meta.config.minimumUsernameLength) { if (field === 'email') {
return next(new Error('[[error:username-too-short]]')); return updateEmail(uid, data.email, next);
} else if (field === 'username') {
return updateUsername(uid, data.username, next);
} else if (field === 'fullname') {
return updateFullname(uid, data.fullname, next);
} else if (field === 'signature') {
data[field] = S(data[field]).stripTags().s;
} }
if (data.username.length > meta.config.maximumUsernameLength) { User.setUserField(uid, field, data[field], next);
return next(new Error('[[error:username-too-long]]')); }, next);
} },
function (next) {
plugins.fireHook('action:user.updateProfile', {data: data, uid: uid});
User.getUserFields(uid, ['email', 'username', 'userslug', 'picture', 'icon:text', 'icon:bgColor'], next);
}
], callback);
};
if (!utils.isUserNameValid(data.username) || !userslug) { function isAboutMeValid(data, callback) {
return next(new Error('[[error:invalid-username]]')); if (data.aboutme !== undefined && data.aboutme.length > meta.config.maximumAboutMeLength) {
} callback(new Error('[[error:about-me-too-long, ' + meta.config.maximumAboutMeLength + ']]'));
} else {
callback();
}
}
if (userslug === userData.userslug) { function isSignatureValid(data, callback) {
return next(); if (data.signature !== undefined && data.signature.length > meta.config.maximumSignatureLength) {
} callback(new Error('[[error:signature-too-long, ' + meta.config.maximumSignatureLength + ']]'));
} else {
callback();
}
}
User.existsBySlug(userslug, function (err, exists) { function isEmailAvailable(data, uid, callback) {
if (err) { if (!data.email) {
return next(err); return callback();
} }
next(exists ? new Error('[[error:username-taken]]') : null); if (!utils.isEmailValid(data.email)) {
}); return callback(new Error('[[error:invalid-email]]'));
}); }
}
function isGroupTitleValid(next) { async.waterfall([
if (data.groupTitle === 'registered-users' || groups.isPrivilegeGroup(data.groupTitle)) { function (next) {
next(new Error('[[error:invalid-group-title]]')); User.getUserField(uid, 'email', next);
} else { },
next(); function (email, next) {
if (email === data.email) {
return callback();
} }
User.email.available(data.email, next);
},
function (available, next) {
next(!available ? new Error('[[error:email-taken]]') : null);
} }
], callback);
}
async.series([ function isUsernameAvailable(data, uid, callback) {
isAboutMeValid, if (!data.username) {
isSignatureValid, return callback();
isEmailAvailable, }
isUsernameAvailable, data.username = data.username.trim();
isGroupTitleValid async.waterfall([
], function (err) { function (next) {
if (err) { User.getUserFields(uid, ['username', 'userslug'], next);
return callback(err); },
} function (userData, next) {
var userslug = utils.slugify(data.username);
async.each(fields, updateField, function (err) {
if (err) {
return callback(err);
}
plugins.fireHook('action:user.updateProfile', {data: data, uid: uid});
User.getUserFields(uid, ['email', 'username', 'userslug', 'picture', 'icon:text', 'icon:bgColor'], callback);
});
});
function updateField(field, next) { if (data.username.length < meta.config.minimumUsernameLength) {
if (!(data[field] !== undefined && typeof data[field] === 'string')) { return next(new Error('[[error:username-too-short]]'));
return next();
} }
data[field] = data[field].trim(); if (data.username.length > meta.config.maximumUsernameLength) {
return next(new Error('[[error:username-too-long]]'));
}
if (field === 'email') { if (!utils.isUserNameValid(data.username) || !userslug) {
return updateEmail(uid, data.email, next); return next(new Error('[[error:invalid-username]]'));
} else if (field === 'username') {
return updateUsername(uid, data.username, next);
} else if (field === 'fullname') {
return updateFullname(uid, data.fullname, next);
} else if (field === 'signature') {
data[field] = S(data[field]).stripTags().s;
} }
User.setUserField(uid, field, data[field], next); if (userslug === userData.userslug) {
return callback();
}
User.existsBySlug(userslug, next);
},
function (exists, next) {
next(exists ? new Error('[[error:username-taken]]') : null);
} }
}); ], callback);
}; }
function isGroupTitleValid(data, callback) {
if (data.groupTitle === 'registered-users' || groups.isPrivilegeGroup(data.groupTitle)) {
callback(new Error('[[error:invalid-group-title]]'));
} else {
callback();
}
}
function updateEmail(uid, newEmail, callback) { function updateEmail(uid, newEmail, callback) {
User.getUserFields(uid, ['email', 'picture', 'uploadedpicture'], function (err, userData) { User.getUserFields(uid, ['email', 'picture', 'uploadedpicture'], function (err, userData) {

@ -292,6 +292,42 @@ describe('User', function () {
}); });
}); });
describe('updateProfile', function () {
var uid;
before(function (done) {
User.create({username: 'updateprofile', email: 'update@me.com'}, function (err, newUid) {
assert.ifError(err);
uid = newUid;
done();
});
});
it('should update a user\'s profile', function (done) {
var data = {
username: 'updatedUserName',
email: 'updatedEmail@me.com',
fullname: 'updatedFullname',
website: 'http://nodebb.org',
location: 'izmir',
groupTitle: 'testGroup',
birthday: '01/01/1980',
signature: 'nodebb is good'
};
User.updateProfile(uid, data, function (err, result) {
assert.ifError(err);
assert(result);
db.getObject('user:' + uid, function (err, userData) {
assert.ifError(err);
Object.keys(data).forEach(function (key) {
assert.equal(data[key], userData[key]);
});
done();
});
});
});
});
after(function (done) { after(function (done) {
db.flushdb(done); db.flushdb(done);
}); });

Loading…
Cancel
Save