qrcode-framework
Version:
147 lines • 11.5 kB
JavaScript
;
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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