Merge branch 'main' into dev

This commit is contained in:
yml2213
2026-09-15 14:17:36 +08:00
216 changed files with 5490 additions and 23718 deletions
+20 -1
View File
@@ -1,7 +1,7 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { resolveRouteErrorLogLevel } from './http.js'
import { buildErrorPayload, createHttpError, resolveRouteErrorLogLevel } from './http.js'
test('expected worker session expiry is debug-level', () => {
assert.equal(
@@ -14,3 +14,22 @@ test('expected worker session expiry is debug-level', () => {
)
assert.equal(resolveRouteErrorLogLevel({ statusCode: 500, errorCode: 'internal_error' }), 'error')
})
test('affiliate_dash errors surface upstream message even when mapped to 502', () => {
const error = createHttpError('乐玩开放平台 AccessKey 或 SecretKey 未配置', {
statusCode: 502,
errorCode: 'affiliate_dash_http_failed',
})
const payload = buildErrorPayload(error, '提交 UID 失败')
assert.equal(payload.msg, '乐玩开放平台 AccessKey 或 SecretKey 未配置')
assert.equal(payload.errorCode, 'affiliate_dash_http_failed')
})
test('generic 5xx still uses fallback message', () => {
const error = createHttpError('secret internal boom', {
statusCode: 500,
errorCode: 'internal_error',
})
const payload = buildErrorPayload(error, '服务内部错误')
assert.equal(payload.msg, '服务内部错误')
})
+9 -5
View File
@@ -29,12 +29,16 @@ export function buildSuccessPayload(data: unknown, msg: string = 'ok') {
export function buildErrorPayload(error: unknown, fallbackMessage: string) {
const classification = classifyRouteError(error)
const message =
classification.statusCode >= 500
const errorMessage = error instanceof Error ? String(error.message || '').trim() : ''
// 依赖方错误(如 affiliate_dash)即使映射为 5xx,也优先透出上游可读原因。
const preferUpstreamMessage =
errorMessage &&
(classification.statusCode < 500 || classification.errorCode.startsWith('affiliate_dash'))
const message = preferUpstreamMessage
? errorMessage
: classification.statusCode >= 500
? fallbackMessage || '服务内部错误'
: error instanceof Error
? error.message
: fallbackMessage
: errorMessage || fallbackMessage
return {
code: 1,
@@ -0,0 +1,22 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { isPlatformOrderIdLookupKeyword } from './platform-order-id.js'
test('识别纯数字平台订单号', () => {
assert.equal(isPlatformOrderIdLookupKeyword('20247230034021572'), true)
assert.equal(isPlatformOrderIdLookupKeyword('123456'), true)
assert.equal(isPlatformOrderIdLookupKeyword('12345'), false)
})
test('识别拼多多带连字符的 order_sn', () => {
assert.equal(isPlatformOrderIdLookupKeyword('260915-091435834962130'), true)
assert.equal(isPlatformOrderIdLookupKeyword('260912-123456789012345'), true)
})
test('拒绝普通关键词', () => {
assert.equal(isPlatformOrderIdLookupKeyword('皮肤店'), false)
assert.equal(isPlatformOrderIdLookupKeyword('安卓怒嚎3钻'), false)
assert.equal(isPlatformOrderIdLookupKeyword('DT881aa66294cc'), false)
assert.equal(isPlatformOrderIdLookupKeyword(''), false)
})
@@ -0,0 +1,8 @@
/**
* Detect platform order IDs that should use indexed equality/prefix lookup.
* Covers pure numeric IDs (快手等) and PDD style `digits-digits` (e.g. 260915-091435834962130).
*/
export function isPlatformOrderIdLookupKeyword(value: unknown): boolean {
const trimmed = String(value || '').trim()
return /^\d{6,}(-\d{6,})?$/.test(trimmed)
}