UNPKG

qrcode-framework

Version:

147 lines 11.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const _ = require("lodash"); const transaction_1 = require("sequelize/lib/transaction"); const ErrorCode_1 = require("../common/ErrorCode"); const BaseService_1 = require("../core/BaseService"); const Exchange_1 = require("../model/Exchange"); class ExchangeService extends BaseService_1.default { /** * 创建兑换券 * @param exchanges */ async createExchange(exchanges) { return await global.sequelize.transaction(async (t) => { // 获取一个没有任何link信息的兑换码 const es = await Exchange_1.Exchange.findAll({ limit: exchanges.length, where: { status: Exchange_1.EXCHANGE_STATUS.NEW, }, transaction: t, lock: transaction_1.Transaction.LOCK.UPDATE, }); if (!es || es.length < exchanges.length) { throw new ErrorCode_1.HttpError({ errorCode: ErrorCode_1.ERROR_CODE.EXCHANGE.EMPTY_POOL, message: '兑换码池剩余资源不足', status: 500, }); } const result = await Exchange_1.Exchange.bulkCreate(es.map((e, index) => { return { id: e.id, code: e.code, linkType: exchanges[index].linkType, linkId: exchanges[index].linkId, status: Exchange_1.EXCHANGE_STATUS.VALID, meta: Object.assign({}, e.meta, exchanges[index].meta), }; }), { updateOnDuplicate: ['linkType', 'linkId', 'meta', 'status', 'updatedAt'], transaction: t, }); return result; }); } async genExchanges(num) { const codes = []; for (let i = 0; i < num; i++) { codes.push(this.ctx.helper.randomStr(true, 16, 20)); } const array = _.chunk(codes, 100); const result = await Promise.all(array.map((a) => { return new Promise(async (resolve) => { const exchanges = await Exchange_1.Exchange.bulkCreate(a.map((c) => ({ code: c })), { ignoreDuplicates: true, }); resolve(exchanges); }); })); let failNum = 0; result.forEach((r) => { // 获取每个请求的失败数量 failNum += r.filter((e) => !e.id).length; }); let numbers = [num - failNum]; if (failNum) { numbers = numbers.concat(await this.genExchanges(failNum)); } return numbers; } /** * 将兑换码交付给用户 * @param uid * @param code */ async payExchange(uid, code) { const exchange = await Exchange_1.Exchange.findOne({ where: { code, status: Exchange_1.EXCHANGE_STATUS.VALID, deleted: false, }, }); this.validateExchange(exchange); const user = await this.service.userService.getWithIntegral(uid); return await global.sequelize.transaction(async (t) => { let item = null; if (exchange.linkType === Exchange_1.EXCHANGE_TYPE.DYNAMIC_CODE) { item = await this.service.codeService.addOwner(parseInt(exchange.linkId, 10), user.id, t); } exchange.set({ uid: user.id, status: Exchange_1.EXCHANGE_STATUS.GOT }); await exchange.save({ transaction: t }); return item; }); } async getLinkItem(code) { const exchange = await Exchange_1.Exchange.findOne({ where: { code, status: Exchange_1.EXCHANGE_STATUS.VALID, deleted: false, }, }); this.validateExchange(exchange); let result = null; if (exchange.linkType === Exchange_1.EXCHANGE_TYPE.DYNAMIC_CODE) { result = await this.service.codeService.getDynamicCodeById(parseInt(exchange.linkId, 10)); } if (!result) { throw new ErrorCode_1.HttpError({ errorCode: ErrorCode_1.ERROR_CODE.COMMON.NOT_FOUND, message: '兑换券关联资源不存在', status: 404, }); } return { type: exchange.linkType, item: result, }; } validateExchange(exchange) { if (!exchange) { throw new ErrorCode_1.HttpError({ errorCode: ErrorCode_1.ERROR_CODE.COMMON.NOT_FOUND, message: '兑换码不存在', status: 404, }); } if (exchange.status === Exchange_1.EXCHANGE_STATUS.GOT) { throw new ErrorCode_1.HttpError({ errorCode: ErrorCode_1.ERROR_CODE.EXCHANGE.HAD_GOT, message: '兑换码已被使用', status: 400, }); } if (exchange.status === Exchange_1.EXCHANGE_STATUS.EXPIRED) { throw new ErrorCode_1.HttpError({ errorCode: ErrorCode_1.ERROR_CODE.EXCHANGE.EXPIRED, message: '兑换码已经过期', status: 400, }); } } } exports.default = ExchangeService; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhjaGFuZ2VTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiRXhjaGFuZ2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNEJBQTRCO0FBQzVCLDJEQUFzRDtBQUN0RCxtREFBMEQ7QUFDMUQscURBQThDO0FBRTlDLGdEQUEyRTtBQUUzRSxNQUFxQixlQUFnQixTQUFRLHFCQUFXO0lBRXBEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FJMUI7UUFDRSxPQUFPLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELHFCQUFxQjtZQUNyQixNQUFNLEVBQUUsR0FBRyxNQUFNLG1CQUFRLENBQUMsT0FBTyxDQUFDO2dCQUM5QixLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3ZCLEtBQUssRUFBRTtvQkFDSCxNQUFNLEVBQUUsMEJBQWUsQ0FBQyxHQUFHO2lCQUM5QjtnQkFDRCxXQUFXLEVBQUUsQ0FBQztnQkFDZCxJQUFJLEVBQUUseUJBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTTthQUNoQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDckMsTUFBTSxJQUFJLHFCQUFTLENBQUM7b0JBQ2hCLFNBQVMsRUFBRSxzQkFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVO29CQUN6QyxPQUFPLEVBQUUsWUFBWTtvQkFDckIsTUFBTSxFQUFFLEdBQUc7aUJBQ2QsQ0FBQyxDQUFDO2FBQ047WUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLG1CQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pELE9BQU87b0JBQ0gsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO29CQUNSLElBQUks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