42 lines
1.7 KiB
JavaScript
42 lines
1.7 KiB
JavaScript
import { createRequestError } from './request-client.js'
|
|
|
|
const referralResponseError = (message) =>
|
|
createRequestError(message, 'REFERRAL_RESPONSE_INVALID')
|
|
|
|
const normalizeReferralText = (value, field, { required = false } = {}) => {
|
|
if (value === undefined || value === null) {
|
|
if (required) throw referralResponseError(`推广关系响应缺少 ${field}`)
|
|
return ''
|
|
}
|
|
if (typeof value !== 'string') throw referralResponseError(`推广关系响应 ${field} 无效`)
|
|
const normalized = value.trim()
|
|
if (required && !normalized) throw referralResponseError(`推广关系响应缺少 ${field}`)
|
|
return normalized
|
|
}
|
|
|
|
export const normalizeReferralProfile = (value) => {
|
|
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
throw referralResponseError('推广关系响应无效')
|
|
}
|
|
const referralCode = normalizeReferralText(value.referralCode, 'referralCode', { required: true })
|
|
if (!/^[A-Za-z0-9_-]{4,64}$/.test(referralCode)) {
|
|
throw referralResponseError('推广关系响应 referralCode 格式无效')
|
|
}
|
|
if (!Number.isSafeInteger(value.referredUserCount) || value.referredUserCount < 0) {
|
|
throw referralResponseError('推广关系响应 referredUserCount 无效')
|
|
}
|
|
const shareUrl = normalizeReferralText(value.shareUrl, 'shareUrl', { required: true })
|
|
if (!/^https:\/\/[^\s]+$/i.test(shareUrl)) {
|
|
throw referralResponseError('推广关系响应 shareUrl 必须是 HTTPS 链接')
|
|
}
|
|
return {
|
|
enabled: true,
|
|
disabledReason: '',
|
|
referralCode,
|
|
referredUserCount: value.referredUserCount,
|
|
shareTitle: normalizeReferralText(value.shareTitle, 'shareTitle', { required: true }),
|
|
shareDescription: normalizeReferralText(value.shareText, 'shareText', { required: true }),
|
|
shareUrl
|
|
}
|
|
}
|