264 lines
9.5 KiB
JavaScript
264 lines
9.5 KiB
JavaScript
const Crypto = require('../../utils/crypto');
|
||
const { createToken } = require('../../utils/jwt');
|
||
const { inject } = require('../../common/Provider');
|
||
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 CODE_TYPE = Code.CODE_TYPE;
|
||
const msgCodeSignIn = async function (phone, code) {
|
||
const validCode = await Code.verifyCode({ id: phone, code, type: CODE_TYPE['msgSignIn'] });
|
||
return validCode ? await User.findOne({
|
||
phone,
|
||
}).exec() : null;
|
||
};
|
||
|
||
module.exports = {
|
||
checkExist: async function (req, res) {
|
||
// method GET
|
||
const { phone }= req.query;
|
||
const isExist = await User.exists({ phone });
|
||
if (isExist) res.json({
|
||
code: 0,
|
||
msg: ''
|
||
});
|
||
else res.json({
|
||
code: 1,
|
||
msg: ''
|
||
});
|
||
},
|
||
signIn: inject(function(SysConfig) {
|
||
const { JWT_SECRET, PWD_HASH_SALT } = SysConfig;
|
||
return async (req, res) => {
|
||
let { phone, password, code } = req.body;
|
||
let user;
|
||
if (code) {
|
||
user = await msgCodeSignIn(phone, code);
|
||
} else {
|
||
password = Crypto.hash(password, { salt: PWD_HASH_SALT });
|
||
user = await User.findOne({
|
||
phone,
|
||
password
|
||
}).exec();
|
||
}
|
||
if (user) {
|
||
const token = createToken({
|
||
userId: user.id
|
||
}, JWT_SECRET, {});
|
||
res.json({
|
||
code: 0,
|
||
msg: 'success',
|
||
data: {
|
||
id: user.id,
|
||
nickname: user.nickname,
|
||
phone: user.phone,
|
||
email: user.email,
|
||
token
|
||
}
|
||
});
|
||
} else {
|
||
res.json({
|
||
code: 1,
|
||
error: 'unknow user',
|
||
msg: '账号或密码错误'
|
||
});
|
||
}
|
||
};
|
||
}),
|
||
signUpReqInviter: 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 || !inviter) return res.json({
|
||
code: 1,
|
||
msg: 'Missing required parameters'
|
||
});
|
||
let validInviter = '';
|
||
if (inviter === 'AlUx9h!w0)y9') {
|
||
validInviter = { id: 'AlUx9h!w0)y9' };
|
||
}
|
||
else {
|
||
const invitePhone = '+86-' + parseInt(inviter);
|
||
validInviter = await User.findOne({ phone: invitePhone }).catch(null);
|
||
if (!validInviter) return res.json({
|
||
code: 4,
|
||
msg: '邀请人不存在'
|
||
});
|
||
}
|
||
const isCodeValid = await Code.verifyCode({ id: phone, code, type: CODE_TYPE['signUp'] });
|
||
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),
|
||
});
|
||
});
|
||
} else {
|
||
res.json({
|
||
code: 2,
|
||
msg: 'Invalid code',
|
||
});
|
||
}
|
||
};
|
||
}),
|
||
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',
|
||
});
|
||
}
|
||
};
|
||
}),
|
||
forgetPasswd: inject(function(SysConfig) {
|
||
const { PWD_HASH_SALT } = SysConfig;
|
||
return async (req, res) => {
|
||
const { phone, password, code } = req.body;
|
||
const validCode = await Code.verifyCode({
|
||
id: phone,
|
||
code,
|
||
type: CODE_TYPE['forgetPasswd']
|
||
});
|
||
if (!validCode) {
|
||
res.json({
|
||
code: 1,
|
||
msg: 'Incorrect code'
|
||
});
|
||
}
|
||
const newPasswd = Crypto.hash(password, { salt: PWD_HASH_SALT });
|
||
const query = { phone };
|
||
const update = { password: newPasswd };
|
||
// eslint-disable-next-line no-unused-vars
|
||
const success = await User.findOneAndUpdate(query, update, { new: true }).exec().catch(err => null);
|
||
if (success) {
|
||
res.json({
|
||
code: 0,
|
||
msg: 'Reseted passwd'
|
||
});
|
||
} else {
|
||
res.json({
|
||
code: 500,
|
||
msg: 'unknow error'
|
||
});
|
||
}
|
||
};
|
||
}),
|
||
changePasswd: inject(function (SysConfig) {
|
||
const { PWD_HASH_SALT } = SysConfig;
|
||
return async (req, res) => {
|
||
const { userId } = res.locals.user;
|
||
const { password, newPassword } = req.body;
|
||
const user = User.findById(userId);
|
||
if (!user || user.password !== Crypto.hash(password, { salt: PWD_HASH_SALT }))
|
||
return res.json({
|
||
code: 1,
|
||
msg: '原始密码错误'
|
||
});
|
||
const newHashPasswd = Crypto.hash(newPassword, { salt: PWD_HASH_SALT });
|
||
const update = { password: newHashPasswd };
|
||
const success = await User.findByIdAndUpdate(userId, update, { new: true })
|
||
// eslint-disable-next-line no-unused-vars
|
||
.exec().catch(err => null);
|
||
if (success) {
|
||
res.json({
|
||
code: 0,
|
||
msg: '密码重置成功'
|
||
});
|
||
} else {
|
||
res.json({
|
||
code: 500,
|
||
msg: '系统错误'
|
||
});
|
||
}
|
||
};
|
||
}),
|
||
sendMsgCode: async (req, res) => {
|
||
// 可作为通用的发送验证码接口
|
||
let { phone, type } = req.body;
|
||
// 注意此处的type是字面值不是数值,应该是例如'signIn'等
|
||
const exec = await Code.sendMsgCode(phone, type);
|
||
if (exec && exec.code === 0) {
|
||
res.json({
|
||
code: 0,
|
||
msg: 'Code sended'
|
||
});
|
||
} else {
|
||
res.json({
|
||
code: exec.code ? exec.code : 1,
|
||
error: exec.error ? exec.error : 'failed'
|
||
});
|
||
}
|
||
},
|
||
getLocaleSupport: async (req, res) => {
|
||
const System = global.Provider.getModule('System');
|
||
const locale = await System.getValue('locale');
|
||
if (!locale) return res.json({
|
||
code: 1,
|
||
error: "does't exists"
|
||
});
|
||
return res.json({
|
||
code: 0,
|
||
data: locale
|
||
});
|
||
}
|
||
}; |