oak-general-business/lib/utils/sms/index.js

127 lines
3.9 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sendSms = exports.getOrigin = exports.getSms = exports.registerSms = void 0;
const assert_1 = require("oak-domain/lib/utils/assert");
const SmsDict = {};
/**
* 注入一个其它发送短信类
* @param clazz
*/
function registerSms(clazz) {
const instance = new clazz();
SmsDict[instance.name] = instance;
}
exports.registerSms = registerSms;
function getSms(origin) {
(0, assert_1.assert)(SmsDict.hasOwnProperty(origin));
return SmsDict[origin];
}
exports.getSms = getSms;
function getOrigin() {
return Object.keys(SmsDict);
}
exports.getOrigin = getOrigin;
async function sendSms(options, context) {
const { messageType, origin, templateName, mobile, templateParam } = options;
(0, assert_1.assert)(messageType || (origin && templateName));
if (origin && templateName) {
const [smsTemplate] = await context.select('smsTemplate', {
data: {
id: 1,
origin: 1,
systemId: 1,
templateCode: 1,
},
filter: {
origin,
templateName,
},
}, {});
if (!smsTemplate) {
return {
success: false,
res: `${origin}短信渠道未配置「${templateName}」模板`,
};
}
try {
const instance = getSms(origin);
const result = await instance.sendSms({
mobile,
templateParam,
smsTemplate,
}, context);
return result;
}
catch (err) {
return {
success: false,
res: err?.message,
};
}
}
else {
const systemId = context.getSystemId();
const messageTypeSmsTemplateList = await context.select('messageTypeSmsTemplate', {
data: {
id: 1,
type: 1,
templateId: 1,
template: {
id: 1,
origin: 1,
systemId: 1,
templateCode: 1,
},
},
filter: {
template: {
systemId,
},
type: messageType,
},
}, {});
// todo 多渠道短信的负载均衡,目前按照顺序发
let resList = {};
if (messageTypeSmsTemplateList.length > 0) {
for (const messageTypeSmsTemplate of messageTypeSmsTemplateList) {
try {
const instance = getSms(messageTypeSmsTemplate.template.origin);
const result = await instance.sendSms({
mobile,
templateParam,
smsTemplate: messageTypeSmsTemplate.template,
}, context);
Object.assign(resList, {
[messageTypeSmsTemplate.template.origin]: result.res,
});
if (result.success) {
return {
success: true,
res: resList,
};
}
}
catch (err) {
Object.assign(resList, {
[messageTypeSmsTemplate.template.origin]: err?.message,
});
}
}
return {
success: false,
res: {
message: `所有短信渠道发送「${messageType}」模板均失败`,
errorList: resList,
},
};
}
else {
return {
success: false,
res: `所有短信渠道未配置「${messageType}」模板`,
};
}
}
}
exports.sendSms = sendSms;