qrcode-framework
Version:
596 lines • 42.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ErrorCode_1 = require("../common/ErrorCode");
const BaseService_1 = require("../core/BaseService");
const model_1 = require("../model");
class UserService extends BaseService_1.default {
async getWithIntegral(uid) {
const user = await model_1.User.findByPk(uid, {
include: [
{
model: model_1.UserIntegral,
as: 'integral',
required: true,
},
],
});
if (!user) {
throw new ErrorCode_1.HttpError({
message: '用户不存在',
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
});
}
return user;
}
async getWithMabi(uid) {
const user = await model_1.User.findOne({
where: {
id: uid,
deleted: false,
},
include: [
{
model: model_1.UserMabi,
as: 'mabi',
},
],
});
if (!user) {
throw new ErrorCode_1.HttpError({
message: '用户不存在',
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
});
}
if (!user.mabi) {
user.mabi = await model_1.UserMabi.create({
uid,
value: 0,
});
}
return user;
}
async getByWechat(outId) {
const integration = await model_1.UserOutIntegration.findOne({
where: {
type: model_1.USER_OUT_INTEGRATION_TYPE.WECHAT,
outId,
},
});
if (!integration) {
return null;
}
try {
return await model_1.User.findByPk(integration.uid);
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async getByWeibo(outId) {
const integration = await model_1.UserOutIntegration.findOne({
where: {
type: model_1.USER_OUT_INTEGRATION_TYPE.WEIBO,
outId,
},
});
if (!integration) {
return null;
}
try {
return await model_1.User.findByPk(integration.uid);
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async getByQQ(outId) {
const integration = await model_1.UserOutIntegration.findOne({
where: {
type: model_1.USER_OUT_INTEGRATION_TYPE.QQ,
outId,
},
});
if (!integration) {
return null;
}
try {
return await model_1.User.findByPk(integration.uid);
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async getByPhoneNumber(phoneNumber) {
try {
return await model_1.UserView.findOne({
where: {
phoneNumber,
},
});
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async createByOutId(outType, outId) {
if (!outId) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.COMMON.PARAMS_INVALID,
message: '第三方注册缺少唯一性用户ID',
});
}
const registerIntegral = await this.ctx.service.configService.getConfig('REGISTER_INTEGRAL');
const registerMabi = await this.ctx.service.configService.getConfig('REGISTER_MABI');
try {
const inviteCode = await this.ctx.service.inviteCodeService.generateInviteCode();
return await global.sequelize.transaction(async (t) => {
// 创建账号
const user = await model_1.User.create({}, {
transaction: t,
});
// 添加邀请码
await model_1.UserInviteCode.create({
uid: user.id,
inviteCode,
}, {
transaction: t,
});
// 添加第三方关联
await model_1.UserOutIntegration.create({
uid: user.id,
type: outType,
outId,
status: model_1.USER_OUT_INTEGRATION_STATUS.ENABLE,
}, {
transaction: t,
});
// 添加积分记录
await model_1.UserIntegral.create({
uid: user.id,
value: registerIntegral,
}, {
transaction: t,
});
// 添加注册积分记录
await model_1.UserIntegralRecord.create({
uid: user.id,
value: registerIntegral,
latestValue: 0,
type: model_1.INTEGRAL_TYPE.BASE,
description: '注册提供基础积分',
meta: {
uid: user.id,
value: registerIntegral,
type: model_1.INTEGRAL_TYPE.BASE,
des: '注册',
time: Date.now(),
},
}, {
transaction: t,
});
// 添加码币记录
await model_1.UserMabi.create({
uid: user.id,
value: registerMabi,
}, {
transaction: t,
});
// 添加注册码币记录
await model_1.UserMabiRecord.create({
uid: user.id,
value: registerMabi,
latestValue: 0,
type: model_1.MABI_RECORD_TYPE.BASE,
description: '注册提供基础码币',
meta: {
uid: user.id,
value: registerMabi,
type: model_1.MABI_RECORD_TYPE.BASE,
des: '注册',
time: Date.now(),
},
}, {
transaction: t,
});
return user;
});
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async createByPhone(phoneNumber) {
if (!phoneNumber) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.COMMON.PARAMS_INVALID,
message: '手机号注册缺少必要参数',
});
}
const userInfo = await model_1.UserPhone.findOne({
where: {
phone: phoneNumber,
},
});
if (userInfo) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.HAS_EXIST,
message: '手机号已经被使用',
});
}
try {
const inviteCode = await this.ctx.service.inviteCodeService.generateInviteCode();
const registerIntegral = await this.ctx.service.configService.getConfig('REGISTER_INTEGRAL');
const registerMabi = await this.ctx.service.configService.getConfig('REGISTER_MABI');
return await global.sequelize.transaction(async (t) => {
// 创建账号
const user = await model_1.User.create(undefined, {
transaction: t,
});
await model_1.UserPhone.create({
uid: user.id,
phone: phoneNumber,
}, {
transaction: t,
});
// 添加邀请码
await model_1.UserInviteCode.create({
uid: user.id,
inviteCode,
}, {
transaction: t,
});
// 添加积分记录
await model_1.UserIntegral.create({
uid: user.id,
value: registerIntegral,
}, {
transaction: t,
});
// 添加注册积分记录
await model_1.UserIntegralRecord.create({
uid: user.id,
value: registerIntegral,
latestValue: 0,
type: model_1.INTEGRAL_TYPE.BASE,
description: '注册提供基础积分',
meta: {
uid: user.id,
value: registerIntegral,
type: model_1.INTEGRAL_TYPE.BASE,
des: '注册',
time: Date.now(),
},
}, {
transaction: t,
});
// 添加码币记录
await model_1.UserMabi.create({
uid: user.id,
value: registerMabi,
}, {
transaction: t,
});
// 添加注册码币记录
await model_1.UserMabiRecord.create({
uid: user.id,
value: registerMabi,
latestValue: 0,
type: model_1.MABI_RECORD_TYPE.BASE,
description: '注册提供基础码币',
meta: {
uid: user.id,
value: registerMabi,
type: model_1.MABI_RECORD_TYPE.BASE,
des: '注册',
time: Date.now(),
},
}, {
transaction: t,
});
return user;
});
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async getInfo(id) {
try {
const user = model_1.UserView.findByPk(id, {
attributes: ['id', 'name', 'username', 'userPhoto', 'phoneNumber', 'gender'],
include: [
{
model: model_1.UserInviteCode,
as: 'inviteCode',
attributes: ['id', 'inviteCode'],
required: false,
},
{
model: model_1.UserIntegral,
as: 'integral',
attributes: ['id', 'value'],
required: false,
},
{
model: model_1.UserMabi,
as: 'mabi',
attributes: ['id', 'value'],
required: false,
},
],
});
return user;
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async changePhone(id, oldPhone, newPhone) {
const phone = await model_1.UserPhone.findOne({
where: {
phone: newPhone,
},
});
if (phone) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.HAS_EXIST,
message: '手机号已经被使用',
});
}
const user = await model_1.UserView.findByPk(id);
if (!user) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '用户不存在',
});
}
if (user.phoneNumber !== oldPhone) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.PHONE_NUMBER_ERROR,
message: '请使用当前绑定手机号进行验证',
});
}
try {
await model_1.UserPhone.update({
phone: newPhone,
}, {
where: {
uid: id,
},
});
return await model_1.UserView.findByPk(id);
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async editInfo(id, data) {
const user = await model_1.User.findByPk(id);
const { name, userPhoto, gender } = data;
if (!user) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '用户不存在',
});
}
try {
user.set('name', name);
user.set('userPhoto', userPhoto);
if (gender) {
user.set('gender', gender);
}
return await user.save();
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
/**
* 添加邀请人
* @param id
* @param inviteCode
*/
async addInviter(id, inviteCode) {
const user = await model_1.User.findByPk(id, {
include: [
{
model: model_1.UserIntegral,
as: 'integral',
required: false,
},
{
model: model_1.UserInviteCode,
as: 'inviteCode',
required: true,
},
],
});
if (!user) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '用户不存在',
});
}
if (inviteCode === user.inviteCode.inviteCode) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT,
message: '无法添加本用户作为邀请人!',
});
}
const inviteRecord = await model_1.UserInviteRecord.findOne({
where: {
toUid: id,
},
});
if (inviteRecord) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.HAS_INVITE_RECORD,
message: '您已存在被邀请记录,无法添加邀请人!',
});
}
const inviter = await model_1.User.findOne({
include: [
{
model: model_1.UserInviteCode,
as: 'inviteCode',
required: true,
where: {
inviteCode,
},
},
{
model: model_1.UserIntegral,
as: 'integral',
required: false,
},
],
});
if (!inviter) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '邀请人不存在',
});
}
const inviteIntegral = await this.ctx.service.configService.getConfig('INVITE_INTEGRAL');
const byInviteIntegral = await this.ctx.service.configService.getConfig('BY_INVITE_INTEGRAL');
try {
return await global.sequelize.transaction(async (t) => {
await Promise.all([
// 添加邀请记录
inviter.createInviteRecord({
inviteCode,
toUid: user.id,
}, {
transaction: t,
}),
// 邀请人添加积分值
inviter.integral.increment({ value: inviteIntegral }, {
transaction: t,
}),
// 被邀请人添加积分值
user.integral.increment({ value: byInviteIntegral }, {
transaction: t,
}),
// 添加邀请人积分记录
model_1.UserIntegralRecord.create({
uid: inviter.id,
value: inviteIntegral,
latestValue: inviter.integral ? inviter.integral.value : 0,
type: model_1.INTEGRAL_TYPE.INVITE,
description: '邀请别人加入',
meta: {
uid: inviter.id,
toUid: user.id,
value: inviteIntegral,
inviteCode,
type: model_1.INTEGRAL_TYPE.INVITE,
des: '邀请人使用应用',
},
}, {
transaction: t,
}),
// 添加被邀请人的积分记录
model_1.UserIntegralRecord.create({
uid: user.id,
value: byInviteIntegral,
latestValue: user.integral ? user.integral.value : 0,
type: model_1.INTEGRAL_TYPE.BY_INVITE,
description: '被人邀请加入',
meta: {
uid: user.id,
formUid: inviter.id,
value: byInviteIntegral,
inviteCode,
type: model_1.INTEGRAL_TYPE.INVITE,
des: '被人邀请加入应用',
},
}, {
transaction: t,
}),
]);
});
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async getMaterials(id) {
const user = await model_1.User.findByPk(id);
if (!user) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '用户不存在',
});
}
try {
return await user.getMaterials();
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async getIntegralRecords(uid, pageSize, pageNumber) {
const size = pageSize || 10;
const number = pageNumber || 1;
const user = await model_1.User.findByPk(uid);
if (!user) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '用户不存在',
});
}
try {
return await model_1.UserIntegralRecord.findAndCountAll({
limit: size || 10,
offset: Math.max((number - 1), 0) * size,
order: [['id', 'DESC']],
where: {
uid,
},
});
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
async getMabiRecords(uid, pageSize, pageNumber) {
const size = pageSize || 10;
const number = pageNumber || 1;
const user = await model_1.User.findByPk(uid);
if (!user) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '用户不存在',
});
}
try {
return await model_1.UserMabiRecord.findAndCountAll({
limit: size || 10,
offset: Math.max((number - 1), 0) * size,
order: [['id', 'DESC']],
where: {
uid,
},
});
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
}
exports.default = UserService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXNlclNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJVc2VyU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1EQUEwRDtBQUMxRCxxREFBOEM7QUFDOUMsb0NBVWtCO0FBRWxCLE1BQXFCLFdBQVksU0FBUSxxQkFBVztJQUN6QyxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQVc7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxPQUFPLEVBQUU7Z0JBQ0w7b0JBQ0ksS0FBSyxFQUFFLG9CQUFZO29CQUNuQixFQUFFLEVBQUUsVUFBVTtvQkFDZCxRQUFRLEVBQUUsSUFBSTtpQkFDakI7YUFDSjtTQUNKLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxNQUFNLElBQUkscUJBQVMsQ0FBQztnQkFDaEIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLFNBQVMsRUFBRSxzQkFBVSxDQUFDLElBQUksQ0FBQyxTQUFTO2FBQ3ZDLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBVztRQUNoQyxNQUFNLElBQUksR0FBRyxNQUFNLFlBQUksQ0FBQyxPQUFPLENBQUM7WUFDNUIsS0FBSyxFQUFFO2dCQUNILEVBQUUsRUFBRSxHQUFHO2dCQUNQLE9BQU8sRUFBRSxLQUFLO2FBQ2pCO1lBQ0QsT0FBTyxFQUFFO2dCQUNMO29CQUNJLEtBQUssRUFBRSxnQkFBUTtvQkFDZixFQUFFLEVBQUUsTUFBTTtpQkFDYjthQUNKO1NBQ0osQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE1BQU0sSUFBSSxxQkFBUyxDQUFDO2dCQUNoQixPQUFPLEVBQUUsT0FBTztnQkFDaEIsU0FBUyxFQUFFLHNCQUFVLENBQUMsSUFBSSxDQUFDLFNBQVM7YUFDdkMsQ0FBQyxD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