feat: migrate app routes and business modules

This commit is contained in:
2026-08-12 18:22:59 +08:00
parent 555aa00043
commit cc706378c2
247 changed files with 28623 additions and 14988 deletions
+32
View File
@@ -0,0 +1,32 @@
import { assertPlainPayload } from './request-normalizers.js'
export const FEEDBACK_TYPE_OPTIONS = Object.freeze([
Object.freeze({ value: 'bug', label: '功能问题' }),
Object.freeze({ value: 'advice', label: '使用建议' }),
Object.freeze({ value: 'complaint', label: '投诉反馈' }),
Object.freeze({ value: 'other', label: '其他' })
])
const feedbackTypes = new Set(FEEDBACK_TYPE_OPTIONS.map(({ value }) => value))
export const normalizeFeedbackPayload = (payload) => {
const allowedFields = new Set(['feedbackType', 'feedbackContent', 'contactInfo'])
assertPlainPayload(payload, allowedFields, '反馈请求')
if (typeof payload.feedbackContent !== 'string' || !payload.feedbackContent.trim()) {
throw new TypeError('反馈内容必须是非空字符串')
}
const normalizedPayload = { feedbackContent: payload.feedbackContent.trim() }
for (const optionalField of ['feedbackType', 'contactInfo']) {
if (!Object.prototype.hasOwnProperty.call(payload, optionalField)) continue
if (typeof payload[optionalField] !== 'string') {
throw new TypeError(`反馈字段 ${optionalField} 必须是字符串`)
}
const normalizedText = payload[optionalField].trim()
if (!normalizedText) continue
if (optionalField === 'feedbackType' && !feedbackTypes.has(normalizedText)) {
throw new TypeError('feedbackType 必须为 advice、bug、complaint 或 other')
}
normalizedPayload[optionalField] = normalizedText
}
return normalizedPayload
}