"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var assert_1 = require("oak-domain/lib/utils/assert"); var oak_external_sdk_1 = require("oak-external-sdk"); var url_1 = require("oak-domain/lib/utils/url"); var uuid_1 = require("oak-domain/lib/utils/uuid"); var sms_1 = require("../utils/sms"); var message_1 = require("./message"); var domain_1 = require("../utils/domain"); function sendNotification(notification, context) { return tslib_1.__awaiter(this, void 0, void 0, function () { var data, templateId, channel, messageSystemId, data1, id, _a, messageSystem, _b, system, message, _c, router, userId, type, _d, applications, config, _e, app, config_1, _f, appId, appSecret, instance, page, pathname, url, StateDict, _g, _h, _j, err_1, _k, _l, _m, app, _o, config_2, applicationId, _p, appId, appSecret, _q, domain, instance, _r, openId, wechatMpAppId, page, pathname, url, url, _s, _t, _u, err_2, _v, _w, _x, _y, _z, _0, err_3, _1, _2, _3, err2_1, _4, _5, _6; var _7, _8, _9, _10, _11, _12, _13; return tslib_1.__generator(this, function (_14) { switch (_14.label) { case 0: data = notification.data, templateId = notification.templateId, channel = notification.channel, messageSystemId = notification.messageSystemId, data1 = notification.data1, id = notification.id; return [4 /*yield*/, context.select('messageSystem', { data: { id: 1, messageId: 1, message: { id: 1, userId: 1, router: 1, type: 1, }, system: { id: 1, application$system: { $entity: 'application', data: { id: 1, type: 1, config: 1, }, }, } }, filter: { id: messageSystemId, } }, { dontCollect: true })]; case 1: _a = tslib_1.__read.apply(void 0, [_14.sent(), 1]), messageSystem = _a[0]; _b = messageSystem, system = _b.system, message = _b.message; _c = message, router = _c.router, userId = _c.userId, type = _c.type; _d = system, applications = _d.application$system, config = _d.config; _e = channel; switch (_e) { case 'wechatMp': return [3 /*break*/, 2]; case 'wechatPublic': return [3 /*break*/, 10]; } return [3 /*break*/, 19]; case 2: app = applications.find(function (ele) { return ele.type === 'wechatMp'; }); config_1 = app.config; _f = config_1, appId = _f.appId, appSecret = _f.appSecret; instance = oak_external_sdk_1.WechatSDK.getInstance(appId, 'wechatMp', appSecret); page = void 0; if (router) { pathname = router.pathname; url = pathname.startsWith('/') ? "pages".concat(pathname, "/index") : "pages/".concat(pathname, "/index"); page = (0, url_1.composeUrl)(url, Object.assign({}, router.props, router.state)); } StateDict = { 'development': 'developer', 'staging': 'trial', 'production': 'former', }; _14.label = 3; case 3: _14.trys.push([3, 7, , 10]); return [4 /*yield*/, instance.sendSubscribedMessage({ templateId: templateId, data: data, openId: data1.openId, page: page, state: StateDict[process.env.NODE_ENV], })]; case 4: _14.sent(); _h = (_g = context).operate; _j = ['notification']; _7 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 5: return [4 /*yield*/, _h.apply(_g, _j.concat([(_7.id = _14.sent(), _7.action = 'succeed', _7.data = {}, _7.filter = { id: id, }, _7), { dontCollect: true }]))]; case 6: _14.sent(); return [2 /*return*/, 1]; case 7: err_1 = _14.sent(); console.warn('发微信小程序消息失败', err_1); _l = (_k = context).operate; _m = ['notification']; _8 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 8: return [4 /*yield*/, _l.apply(_k, _m.concat([(_8.id = _14.sent(), _8.action = 'fail', _8.data = {}, _8.filter = { id: id, }, _8), { dontCollect: true }]))]; case 9: _14.sent(); return [2 /*return*/, 1]; case 10: app = applications.find(function (ele) { return ele.type === 'wechatPublic'; }); _o = app, config_2 = _o.config, applicationId = _o.id; _p = config_2, appId = _p.appId, appSecret = _p.appSecret; return [4 /*yield*/, context.select('domain', { data: { id: 1, url: 1, apiPath: 1, protocol: 1, port: 1, }, filter: { system: { application$system: { id: applicationId, }, }, }, }, { dontCollect: true })]; case 11: _q = tslib_1.__read.apply(void 0, [_14.sent(), 1]), domain = _q[0]; instance = oak_external_sdk_1.WechatSDK.getInstance(appId, 'wechatPublic', appSecret); _r = data1, openId = _r.openId, wechatMpAppId = _r.wechatMpAppId; page = void 0; // message 用户不需要跳转页面 if (router) { pathname = router.pathname; if (wechatMpAppId) { url = pathname.startsWith('/') ? "pages".concat(pathname, "/index") : "pages/".concat(pathname, "/index"); page = (0, url_1.composeUrl)(url, Object.assign({}, router.props, router.state)); } else { url = (0, domain_1.composeDomainUrl)(domain, pathname); page = (0, url_1.composeUrl)(url, Object.assign({}, router.props, router.state)); } } _14.label = 12; case 12: _14.trys.push([12, 16, , 19]); return [4 /*yield*/, instance.sendTemplateMessage({ openId: openId, templateId: templateId, url: !wechatMpAppId ? page : undefined, data: data, miniProgram: wechatMpAppId ? { appid: wechatMpAppId, pagepath: page, } : undefined, clientMsgId: id, })]; case 13: _14.sent(); _t = (_s = context).operate; _u = ['notification']; _9 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 14: return [4 /*yield*/, _t.apply(_s, _u.concat([(_9.id = _14.sent(), _9.action = 'succeed', _9.data = {}, _9.filter = { id: id, }, _9), { dontCollect: true }]))]; case 15: _14.sent(); return [2 /*return*/, 1]; case 16: err_2 = _14.sent(); console.warn('发微信公众号消息失败', err_2); _w = (_v = context).operate; _x = ['notification']; _10 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 17: return [4 /*yield*/, _w.apply(_v, _x.concat([(_10.id = _14.sent(), _10.action = 'fail', _10.data = {}, _10.filter = { id: id, }, _10), { dontCollect: true }]))]; case 18: _14.sent(); return [2 /*return*/, 1]; case 19: (0, assert_1.assert)(channel === 'sms'); _14.label = 20; case 20: _14.trys.push([20, 24, , 33]); return [4 /*yield*/, (0, sms_1.sendSms)({ origin: 'ali', templateName: type, templateParamSet: data.params, mobile: data1.mobile, }, context)]; case 21: _14.sent(); _z = (_y = context).operate; _0 = ['notification']; _11 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 22: return [4 /*yield*/, _z.apply(_y, _0.concat([(_11.id = _14.sent(), _11.action = 'succeed', _11.data = {}, _11.filter = { id: id, }, _11), { dontCollect: true }]))]; case 23: _14.sent(); return [2 /*return*/, 1]; case 24: err_3 = _14.sent(); console.warn('发tencent sms消息失败', err_3); _14.label = 25; case 25: _14.trys.push([25, 29, , 32]); return [4 /*yield*/, (0, sms_1.sendSms)({ origin: 'tencent', templateName: type, templateParamSet: data.paramsArray, mobile: data1.mobile, }, context)]; case 26: _14.sent(); _2 = (_1 = context).operate; _3 = ['notification']; _12 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 27: return [4 /*yield*/, _2.apply(_1, _3.concat([(_12.id = _14.sent(), _12.action = 'succeed', _12.data = {}, _12.filter = { id: id, }, _12), { dontCollect: true }]))]; case 28: _14.sent(); return [2 /*return*/, 1]; case 29: err2_1 = _14.sent(); console.warn('发aliyun sms消息失败', err2_1); _5 = (_4 = context).operate; _6 = ['notification']; _13 = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 30: return [4 /*yield*/, _5.apply(_4, _6.concat([(_13.id = _14.sent(), _13.action = 'fail', _13.data = {}, _13.filter = { id: id, }, _13), { dontCollect: true }]))]; case 31: _14.sent(); return [2 /*return*/, 1]; case 32: return [3 /*break*/, 33]; case 33: return [2 /*return*/]; } }); }); } function tryCreateSmsNotification(message, context) { return tslib_1.__awaiter(this, void 0, void 0, function () { var smsNotification, messageSystem$message, _a, _b, ms, id, _c, _d, _e, e_1_1; var e_1, _f, _g; return tslib_1.__generator(this, function (_h) { switch (_h.label) { case 0: return [4 /*yield*/, (0, message_1.tryMakeSmsNotification)(message, context)]; case 1: smsNotification = _h.sent(); if (!smsNotification) return [3 /*break*/, 11]; messageSystem$message = message.messageSystem$message; _h.label = 2; case 2: _h.trys.push([2, 8, 9, 10]); _a = tslib_1.__values(messageSystem$message), _b = _a.next(); _h.label = 3; case 3: if (!!_b.done) return [3 /*break*/, 7]; ms = _b.value; id = ms.id; _d = (_c = context).operate; _e = ['notification']; _g = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 4: return [4 /*yield*/, _d.apply(_c, _e.concat([(_g.id = _h.sent(), _g.action = 'create', _g.data = Object.assign(smsNotification, { messageSystemId: id, }), _g), { dontCollect: true }]))]; case 5: _h.sent(); _h.label = 6; case 6: _b = _a.next(); return [3 /*break*/, 3]; case 7: return [3 /*break*/, 10]; case 8: e_1_1 = _h.sent(); e_1 = { error: e_1_1 }; return [3 /*break*/, 10]; case 9: try { if (_b && !_b.done && (_f = _a.return)) _f.call(_a); } finally { if (e_1) throw e_1.error; } return [7 /*endfinally*/]; case 10: return [2 /*return*/, messageSystem$message.length]; case 11: return [2 /*return*/, 0]; } }); }); } var triggers = [ { name: '当创建notification后,业务提交后再进行推送', entity: 'notification', action: 'create', when: 'commit', strict: 'takeEasy', fn: function (_a, context) { var operation = _a.operation; return tslib_1.__awaiter(void 0, void 0, void 0, function () { var data, data_1, data_1_1, d, e_2_1; var e_2, _b; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: data = operation.data; if (!(data instanceof Array)) return [3 /*break*/, 9]; _c.label = 1; case 1: _c.trys.push([1, 6, 7, 8]); data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); _c.label = 2; case 2: if (!!data_1_1.done) return [3 /*break*/, 5]; d = data_1_1.value; return [4 /*yield*/, sendNotification(d, context)]; case 3: _c.sent(); _c.label = 4; case 4: data_1_1 = data_1.next(); return [3 /*break*/, 2]; case 5: return [3 /*break*/, 8]; case 6: e_2_1 = _c.sent(); e_2 = { error: e_2_1 }; return [3 /*break*/, 8]; case 7: try { if (data_1_1 && !data_1_1.done && (_b = data_1.return)) _b.call(data_1); } finally { if (e_2) throw e_2.error; } return [7 /*endfinally*/]; case 8: return [3 /*break*/, 11]; case 9: return [4 /*yield*/, sendNotification(data, context)]; case 10: _c.sent(); _c.label = 11; case 11: return [2 /*return*/, 0]; } }); }); } }, { name: '当notification完成时,根据情况去更新message', entity: 'notification', when: 'after', action: ['fail', 'succeed'], fn: function (_a, context) { var operation = _a.operation; return tslib_1.__awaiter(void 0, void 0, void 0, function () { var filter, messages, _b, message, success, allFailed, smsTried, _c, _d, ms, _e, _f, n, _g, _h, _j, result, _k, _l, _m; var e_3, _o, e_4, _p, _q, _r; return tslib_1.__generator(this, function (_s) { switch (_s.label) { case 0: filter = operation.filter; (0, assert_1.assert)(filter.id); return [4 /*yield*/, context.select('message', { data: { id: 1, weight: 1, iState: 1, type: 1, entity: 1, entityId: 1, userId: 1, messageSystem$message: { $entity: 'messageSystem', data: { id: 1, notification$messageSystem: { $entity: 'notification', data: { id: 1, iState: 1, channel: 1, }, }, }, }, }, filter: { messageSystem$message: { notification$messageSystem: { id: filter.id, } }, /* id: { $in: { entity: 'messageSystem', data: { messageId: 1, }, filter: { id: { $in: { entity: 'notification', data: { messageSystemId: 1, }, filter: { id: filter!.id, } }, } } } } */ } }, { dontCollect: true })]; case 1: messages = _s.sent(); (0, assert_1.assert)(messages.length === 1); _b = tslib_1.__read(messages, 1), message = _b[0]; if (message.iState === 'success') { return [2 /*return*/, 0]; } success = false; allFailed = true; smsTried = false; try { for (_c = tslib_1.__values(message.messageSystem$message), _d = _c.next(); !_d.done; _d = _c.next()) { ms = _d.value; try { for (_e = (e_4 = void 0, tslib_1.__values(ms.notification$messageSystem)), _f = _e.next(); !_f.done; _f = _e.next()) { n = _f.value; if (n.iState === 'success') { success = true; break; } if (n.iState !== 'failure') { allFailed = false; } if (n.channel === 'sms') { smsTried = true; } } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (_f && !_f.done && (_p = _e.return)) _p.call(_e); } finally { if (e_4) throw e_4.error; } } if (success === true) { break; } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_d && !_d.done && (_o = _c.return)) _o.call(_c); } finally { if (e_3) throw e_3.error; } } if (!success) return [3 /*break*/, 4]; _h = (_g = context).operate; _j = ['message']; _q = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 2: // 有一个完成就算完成 return [4 /*yield*/, _h.apply(_g, _j.concat([(_q.id = _s.sent(), _q.action = 'succeed', _q.data = {}, _q.filter = { id: message.id, }, _q), { dontCollect: true }]))]; case 3: // 有一个完成就算完成 _s.sent(); return [2 /*return*/, 1]; case 4: if (!(message.weight === 'medium' && !smsTried && allFailed)) return [3 /*break*/, 6]; return [4 /*yield*/, tryCreateSmsNotification(message, context)]; case 5: result = _s.sent(); return [2 /*return*/, result]; case 6: if (!allFailed) return [3 /*break*/, 9]; _l = (_k = context).operate; _m = ['message']; _r = {}; return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()]; case 7: return [4 /*yield*/, _l.apply(_k, _m.concat([(_r.id = _s.sent(), _r.action = 'fail', _r.data = {}, _r.filter = { id: message.id, }, _r), { dontCollect: true }]))]; case 8: _s.sent(); return [2 /*return*/, 1]; case 9: return [2 /*return*/]; } }); }); } } ]; exports.default = triggers;