fix: test lock for user create (#8415)

* fix: test lock for user create

* fix: redis hdel with undefined

* feat: add test for undefined key in deleteObjectFields
This commit is contained in:
Barış Soner Uşaklı
2020-06-18 23:16:48 -04:00
committed by GitHub
parent f0526bff9f
commit bef37e27cb
4 changed files with 65 additions and 3 deletions

View File

@@ -154,7 +154,11 @@ module.exports = function (module) {
};
module.deleteObjectFields = async function (key, fields) {
if (!Array.isArray(fields) || !fields.length) {
if (!key || !Array.isArray(fields) || !fields.length) {
return;
}
fields = fields.filter(Boolean);
if (!fields.length) {
return;
}
await module.client.async.hdel(key, fields);

View File

@@ -14,10 +14,30 @@ module.exports = function (User) {
if (data.email !== undefined) {
data.email = String(data.email).trim();
}
const timestamp = data.timestamp || Date.now();
await User.isDataValid(data);
try {
await lock(data.username, '[[error:username-taken]]');
if (data.email) {
await lock(data.email, '[[error:email-taken]]');
}
return await create(data);
} finally {
await db.deleteObjectFields('locks', [data.username, data.email]);
}
};
async function lock(value, error) {
const count = await db.incrObjectField('locks', value);
if (count > 1) {
throw new Error(error);
}
}
async function create(data) {
const timestamp = data.timestamp || Date.now();
let userData = {
username: data.username,
userslug: data.userslug,
@@ -92,7 +112,7 @@ module.exports = function (User) {
}
plugins.fireHook('action:user.create', { user: userData, data: data });
return userData.uid;
};
}
async function storePassword(uid, password) {
if (!password) {