修改完成待测试
This commit is contained in:
@@ -1,11 +1,16 @@
|
||||
import { createRequestError } from './request-client.js'
|
||||
import {
|
||||
normalizeOptionalNonnegativeInteger,
|
||||
normalizeOptionalNumericId,
|
||||
normalizeResponseText
|
||||
} from './response-normalizers.js'
|
||||
import { normalizeBusinessFileAccess } from './business-file-contract.js'
|
||||
|
||||
const promotionPlacements = new Set(['home_banner', 'home_bottom', 'message_bottom', 'profile_bottom'])
|
||||
const siteArticleTypeLabels = Object.freeze({
|
||||
news: '资讯',
|
||||
notice: '公告'
|
||||
})
|
||||
|
||||
export const normalizePromotionPlacement = (value) => {
|
||||
if (!promotionPlacements.has(value)) throw new TypeError('推广位无效')
|
||||
@@ -50,6 +55,64 @@ export const normalizeAppPromotions = (value, expectedPlacement) => {
|
||||
return promotions
|
||||
}
|
||||
|
||||
export const normalizeSiteArticles = (value) => {
|
||||
if (!Array.isArray(value)) {
|
||||
throw createRequestError('官网文章响应不是列表', 'SITE_ARTICLE_RESPONSE_INVALID')
|
||||
}
|
||||
const articles = value.map((item) => {
|
||||
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
||||
throw createRequestError('官网文章响应包含无效条目', 'SITE_ARTICLE_RESPONSE_INVALID')
|
||||
}
|
||||
const id = normalizeOptionalNumericId(item.articleId, '官网文章标识', 'SITE_ARTICLE_RESPONSE_INVALID')
|
||||
const title = normalizeResponseText(item.articleTitle, 'articleTitle', {
|
||||
code: 'SITE_ARTICLE_RESPONSE_INVALID',
|
||||
subject: '官网文章响应'
|
||||
})
|
||||
if (!id || !title) {
|
||||
throw createRequestError('官网文章响应缺少稳定字段', 'SITE_ARTICLE_RESPONSE_INVALID')
|
||||
}
|
||||
const externalUrl = normalizeResponseText(item.externalUrl, 'externalUrl', {
|
||||
code: 'SITE_ARTICLE_RESPONSE_INVALID',
|
||||
subject: '官网文章响应'
|
||||
})
|
||||
if (externalUrl && !/^https:\/\/[^\s/?#]+(?:[/?#][^\s]*)?$/.test(externalUrl)) {
|
||||
throw createRequestError('官网文章外部链接无效', 'SITE_ARTICLE_RESPONSE_INVALID')
|
||||
}
|
||||
const type = normalizeResponseText(item.articleType, 'articleType', {
|
||||
code: 'SITE_ARTICLE_RESPONSE_INVALID',
|
||||
subject: '官网文章响应'
|
||||
})
|
||||
return {
|
||||
id,
|
||||
title,
|
||||
type,
|
||||
typeLabel: siteArticleTypeLabels[type] || '资讯',
|
||||
summary: normalizeResponseText(item.articleSummary, 'articleSummary', {
|
||||
code: 'SITE_ARTICLE_RESPONSE_INVALID',
|
||||
subject: '官网文章响应'
|
||||
}),
|
||||
content: normalizeResponseText(item.articleContent, 'articleContent', {
|
||||
code: 'SITE_ARTICLE_RESPONSE_INVALID',
|
||||
subject: '官网文章响应'
|
||||
}),
|
||||
publishTime: normalizeResponseText(item.publishTime, 'publishTime', {
|
||||
code: 'SITE_ARTICLE_RESPONSE_INVALID',
|
||||
subject: '官网文章响应'
|
||||
}),
|
||||
externalUrl,
|
||||
sortOrder: normalizeOptionalNonnegativeInteger(
|
||||
item.sortOrder,
|
||||
'官网文章排序值',
|
||||
'SITE_ARTICLE_RESPONSE_INVALID'
|
||||
)
|
||||
}
|
||||
})
|
||||
if (new Set(articles.map((article) => article.id)).size !== articles.length) {
|
||||
throw createRequestError('官网文章响应包含重复标识', 'SITE_ARTICLE_RESPONSE_INVALID')
|
||||
}
|
||||
return articles
|
||||
}
|
||||
|
||||
const normalizeHelpArticleText = (value, field) => {
|
||||
if (typeof value !== 'string' || !value.trim()) {
|
||||
throw createRequestError(`帮助文章缺少 ${field}`, 'HELP_ARTICLE_RESPONSE_INVALID')
|
||||
|
||||
Reference in New Issue
Block a user