注册锁

This commit is contained in:
chaosBreaking
2019-10-02 13:35:25 +08:00
parent 9cf8795fa4
commit 298d3da92d
2 changed files with 76 additions and 97 deletions

View File

@@ -5,7 +5,9 @@ const User = require('../user/user.model');
const { createNewUser } = require('../user/user.handler');
const Code = require('../msgCode/msgCode.controller');
const Fund = require('../fund/fund.model');
const Lock = require('../../utils/mutexlock');
const lock = new Lock();
const CODE_TYPE = Code.CODE_TYPE;
const msgCodeSignIn = async function (phone, code) {
const validCode = await Code.verifyCode({ id: phone, code, type: CODE_TYPE['msgSignIn'] });
@@ -13,6 +15,7 @@ const msgCodeSignIn = async function (phone, code) {
phone,
}).exec() : null;
};
const phoneRegCN = /^\+86-[1]([3-9])[0-9]{9}$/;
module.exports = {
checkExist: async function (req, res) {
@@ -46,7 +49,7 @@ module.exports = {
const token = createToken({
userId: user.id
}, JWT_SECRET, {});
res.json({
return res.json({
code: 0,
msg: 'success',
data: {
@@ -58,7 +61,7 @@ module.exports = {
}
});
} else {
res.json({
return res.json({
code: 1,
error: 'unknow user',
msg: '账号或密码错误'
@@ -69,116 +72,71 @@ module.exports = {
signUpReqInviter: inject(function(SysConfig) {
const { JWT_SECRET, PWD_HASH_SALT } = SysConfig;
return async (req, res) => {
return res.json({
code: 404,
msg: '暂停注册'
});
// return res.json({
// code: 404,
// msg: '暂停注册'
// });
let { phone, code, inviter, password } = req.body;
if (!phone || !code || !password || !inviter) return res.json({
code: 1,
msg: 'Missing required parameters'
});
const exist = await User.exists({ phone });
if (exist) return res.json({
code: 1,
msg: ''
phone = String.prototype.trim.call(phone);
const isValidPhone = phone.startsWith('+86-') ? phoneRegCN.test(phone) : true; //国际手机暂不检测
if (!isValidPhone) return res.json({
code: 5,
msg: 'Invalid phone',
});
let validInviter = '';
if (inviter === 'AlUx9h!w0)y9') {
validInviter = { id: 'AlUx9h!w0)y9' };
}
else {
const invitePhone = '+86-' + parseInt(inviter, 36);
validInviter = await User.findOne({ phone: invitePhone }).catch(null);
if (!validInviter) return res.json({
code: 4,
msg: '邀请人不存在'
const isValidCode = await Code.verifyCode({ id: phone, code, type: CODE_TYPE['signUp'] });
if (!isValidCode) {
return res.json({
code: 2,
msg: 'Invalid code',
});
}
const isCodeValid = await Code.verifyCode({ id: phone, code, type: CODE_TYPE['signUp'] });
let validInviter = '';
const invitePhone = '+86-' + parseInt(inviter, 36);
validInviter = await User.findOne({ phone: invitePhone }).catch(null);
if (!validInviter) return res.json({
code: 4,
msg: '邀请人不存在'
});
const exist = await User.exists({ phone });
if (exist || (!exist && !lock.acquire(phone))) return res.json({
code: 1,
msg: '重复注册'
});
password = Crypto.hash(password, { salt: PWD_HASH_SALT });
const newInviteCode = typeof phone === 'string' && parseInt(phone.split('-')[1]).toString(36);
if (isCodeValid) {
await createNewUser({
phone,
inviter: validInviter.id,
password,
inviteCode: newInviteCode
}).then(user => {
User.findByIdAndUpdate(validInviter.id, { $push: { group: user.id } }).catch(err => {
mylog.error('将被邀请人加入到邀请人队列失败 uid', user.id, err && err.errmsg);
});
new Fund({userId: user.id }).save().catch(err => mylog.error('用户资金文档创建失败 uid', user.id, err && err.errmsg));
const token = createToken({
userId: user.id
}, JWT_SECRET, {});
res.json({
code: 0,
msg: 'success',
data: {
//刚注册需要返回的应该只有token其他的没意义
token
}
});
})
.catch(err => {
mylog.error(err);
res.json({
code: 3,
msg: JSON.stringify(err),
});
await createNewUser({
phone,
inviter: validInviter.id,
password,
inviteCode: newInviteCode
}).then(user => {
lock.unlock(phone);
User.findByIdAndUpdate(validInviter.id, { $push: { group: user.id } }).catch(err => {
mylog.error('将被邀请人加入到邀请人队列失败 uid', user.id, err && err.errmsg);
});
} else {
res.json({
code: 2,
msg: 'Invalid code',
new Fund({userId: user.id }).save().catch(err => mylog.error('用户资金文档创建失败 uid', user.id, err && err.errmsg));
const token = createToken({
userId: user.id
}, JWT_SECRET, {});
return res.json({
code: 0,
msg: 'success',
data: { token }
});
}).catch(err => {
mylog.error('[SignUpWI]创建用户失败', err);
return res.json({
code: 3,
msg: JSON.stringify(err),
});
}
};
}),
signUp: inject(function(SysConfig) {
const { JWT_SECRET, PWD_HASH_SALT } = SysConfig;
return async (req, res) => {
let { phone, code, inviter, password } = req.body;
if (!phone || !code || !password) return res.json({
code: 1,
msg: 'Missing required parameters'
});
const isCodeValid = await Code.verifyCode({ id: phone, code, type: CODE_TYPE['signUp'] });
password = Crypto.hash(password, { salt: PWD_HASH_SALT });
if (isCodeValid) {
createNewUser({
phone,
inviter,
password
}).then(user => {
const token = createToken({
userId: user.id
}, JWT_SECRET, {});
res.json({
code: 0,
msg: 'success',
data: {
//刚注册需要返回的应该只有token其他的没意义
token
}
});
})
.catch(err => {
mylog.error(err);
res.json({
code: 3,
msg: JSON.stringify(err),
});
});
} else {
res.json({
code: 2,
msg: 'Invalid code',
});
}
};
}),
signUp: this.signUpReqInviter, // 暂时不用,先用要求邀请人的代替
forgetPasswd: inject(function(SysConfig) {
const { PWD_HASH_SALT } = SysConfig;
return async (req, res) => {