From 5135207bf85c06f5058849187b3ac9020f5b2eaa Mon Sep 17 00:00:00 2001 From: Tiga Date: Tue, 13 Oct 2026 23:30:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Esms=E7=9A=84mock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/ewl/msgw/contentSend.js | 10 +++-- src/routes/ewl/msgw/smsErrorState.js | 25 ++++++++++++ .../mockApi/smsContentSendErrorOverride.js | 38 +++++++++++++++++++ src/routes/registerRoutes.js | 2 + 4 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/routes/ewl/msgw/smsErrorState.js create mode 100644 src/routes/mockApi/smsContentSendErrorOverride.js diff --git a/src/routes/ewl/msgw/contentSend.js b/src/routes/ewl/msgw/contentSend.js index 3c6f012..e162b38 100644 --- a/src/routes/ewl/msgw/contentSend.js +++ b/src/routes/ewl/msgw/contentSend.js @@ -1,19 +1,21 @@ // Message Gateway 内容发送接口 Mock:POST /ewl/msgw/v1/messages/content/send // 后端短信已从旧 SMS Hub(/SMSToken + /SMSRequest/Post)切换到该接口,认证复用 EDIP Token。 // 响应严格按真实网关信封:HTTP 200 + status/errorCode,成功时 smsid 为全小写字段、errorCode 为空字符串。 +const { getForcedErrorCode, getForcedErrorMsg } = require('./smsErrorState') + function registerMessageGatewayContentSendRoute({ app }) { app.post('/ewl/msgw/v1/messages/content/send', (req, res) => { const data = req.body?.data || {} const recipients = Array.isArray(data.recipients) ? data.recipients : [] - // 错误注入:MOCK_SMS_FORCE_ERROR_CODE=8923 模拟供应商暂不可用(后端应重试), - // MOCK_SMS_FORCE_ERROR_CODE=8907 模拟号码非法(后端不应重试) - const forcedErrorCode = process.env.MOCK_SMS_FORCE_ERROR_CODE || '' + // 错误注入:优先取运行时开关(/mock-api/sms/content-send-error),回落环境变量。 + // 8923 属供应商暂不可用(后端应重试),8907 属号码非法(后端不应重试) + const forcedErrorCode = getForcedErrorCode() if (forcedErrorCode) { return res.status(200).json({ status: false, errorCode: forcedErrorCode, - message: process.env.MOCK_SMS_FORCE_ERROR_MSG || 'Mock message gateway error', + message: getForcedErrorMsg(), data: null, }) } diff --git a/src/routes/ewl/msgw/smsErrorState.js b/src/routes/ewl/msgw/smsErrorState.js new file mode 100644 index 0000000..7c61583 --- /dev/null +++ b/src/routes/ewl/msgw/smsErrorState.js @@ -0,0 +1,25 @@ +// Message Gateway 内容发送 Mock 的运行时错误码开关。 +// 目的:联调时可在进程内切换 errorCode(如 8923 可重试、8907 不可重试),不必反复重启 Mock 进程。 +// 初值取环境变量 MOCK_SMS_FORCE_ERROR_CODE,之后由 /mock-api/sms/content-send-error 覆盖。 +const state = { + forcedErrorCode: (process.env.MOCK_SMS_FORCE_ERROR_CODE || '').trim(), + forcedErrorMsg: process.env.MOCK_SMS_FORCE_ERROR_MSG || 'Mock message gateway error', +} + +function setForcedErrorCode(errorCode, errorMsg) { + state.forcedErrorCode = errorCode == null ? '' : String(errorCode).trim() + if (errorMsg != null && String(errorMsg).trim() !== '') { + state.forcedErrorMsg = String(errorMsg).trim() + } + return { errorCode: state.forcedErrorCode, errorMsg: state.forcedErrorMsg } +} + +function getForcedErrorCode() { + return state.forcedErrorCode +} + +function getForcedErrorMsg() { + return state.forcedErrorMsg +} + +module.exports = { setForcedErrorCode, getForcedErrorCode, getForcedErrorMsg } diff --git a/src/routes/mockApi/smsContentSendErrorOverride.js b/src/routes/mockApi/smsContentSendErrorOverride.js new file mode 100644 index 0000000..2d6e1d1 --- /dev/null +++ b/src/routes/mockApi/smsContentSendErrorOverride.js @@ -0,0 +1,38 @@ +// Message Gateway 内容发送 Mock 的错误码开关节点(仅联调用)。 +// 用途:进程内切换 errorCode,验后端重试语义(8911-8930 应重试,8901-8910 不应重试),避免反复重启 Mock。 +const { setForcedErrorCode, getForcedErrorCode, getForcedErrorMsg } = require('../ewl/msgw/smsErrorState') + +function registerSmsContentSendErrorOverrideRoute({ app }) { + const route = '/mock-api/sms/content-send-error' + + app.get(route, (req, res) => + res.status(200).json({ + success: true, + message: 'SMS content send error override retrieved successfully.', + data: { errorCode: getForcedErrorCode(), errorMsg: getForcedErrorMsg() }, + }), + ) + + app.post(route, (req, res) => { + const body = req.body && typeof req.body === 'object' ? req.body : {} + const override = setForcedErrorCode(body.errorCode ?? '', body.errorMsg) + + return res.status(200).json({ + success: true, + message: 'SMS content send error override saved successfully.', + data: override, + }) + }) + + app.delete(route, (req, res) => { + const cleared = setForcedErrorCode('', null) + + return res.status(200).json({ + success: true, + message: 'SMS content send error override cleared successfully.', + data: cleared, + }) + }) +} + +module.exports = registerSmsContentSendErrorOverrideRoute diff --git a/src/routes/registerRoutes.js b/src/routes/registerRoutes.js index 97dff90..2ec726e 100644 --- a/src/routes/registerRoutes.js +++ b/src/routes/registerRoutes.js @@ -22,6 +22,7 @@ const registerPrizeRedemptionsSyncRoute = require('./api/v1/prizeRedemptionsSync const registerPromotionRedeemFulfillmentOverridesRoute = require('./mockApi/promotionRedeemFulfillmentOverrides') const registerSmsPortalRoutes = require('./sms/smsPortal') const registerMessageGatewayContentSendRoute = require('./ewl/msgw/contentSend') +const registerSmsContentSendErrorOverrideRoute = require('./mockApi/smsContentSendErrorOverride') function registerRoutes({ app, context, ldapService }) { registerHealthzRoute({ app, ldapService }) @@ -48,6 +49,7 @@ function registerRoutes({ app, context, ldapService }) { registerPromotionRedeemFulfillmentOverridesRoute({ app, context }) registerSmsPortalRoutes({ app }) registerMessageGatewayContentSendRoute({ app }) + registerSmsContentSendErrorOverrideRoute({ app }) } module.exports = { registerRoutes }