UNPKG

qrcode-framework

Version:

596 lines 42.5 kB
"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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