feat: migrate app routes and business modules
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
import { listPreviewFamilyFeeds } from '@/data/preview/family-content.js'
|
||||
import { hasRemoteConfig } from '@/utils/runtime-config.js'
|
||||
import {
|
||||
FEED_COMMENT_LEVEL,
|
||||
normalizeDirectFeedReplies,
|
||||
normalizeFamilyFeed,
|
||||
normalizeFamilyFeedRecommendations,
|
||||
normalizeFamilyFeedRows,
|
||||
normalizeFeedCommentPayload,
|
||||
normalizeFeedComments,
|
||||
normalizeFeedCreatePayload,
|
||||
normalizeFeedResourceId
|
||||
} from './family-feed-contract.js'
|
||||
import { normalizeGenealogyPathId } from './genealogy-contract.js'
|
||||
import { normalizeResourcePathId } from './request-normalizers.js'
|
||||
import { createRequestError, requestStrict } from './request-client.js'
|
||||
|
||||
const requireRemoteFeed = (message, code) => {
|
||||
if (hasRemoteConfig()) return
|
||||
throw createRequestError(message, code)
|
||||
}
|
||||
|
||||
const normalizePageQuery = (pageNum, pageSize, label) => {
|
||||
if (!Number.isSafeInteger(pageNum) || pageNum < 1 || !Number.isSafeInteger(pageSize) || pageSize < 1) {
|
||||
throw new TypeError(`${label}分页参数无效`)
|
||||
}
|
||||
return { pageNum, pageSize }
|
||||
}
|
||||
|
||||
const assertPageResponse = (page, label) => {
|
||||
if (!page || typeof page !== 'object' || !Array.isArray(page.rows) || !Number.isSafeInteger(page.total)) {
|
||||
throw createRequestError(`${label}分页响应无效`, 'PAGE_RESPONSE_INVALID')
|
||||
}
|
||||
}
|
||||
|
||||
export const familyFeedApi = {
|
||||
async createFeedComment(genealogyId, feedId, payload, requestOptions = {}) {
|
||||
requireRemoteFeed('动态评论需要真实服务,当前本地预览不会伪造提交成功', 'REMOTE_WRITE_REQUIRED')
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeFeedResourceId(feedId, '动态标识')
|
||||
return requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}/comments`,
|
||||
method: 'POST',
|
||||
data: normalizeFeedCommentPayload(payload)
|
||||
}, {
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
},
|
||||
|
||||
async getFeedRecommendations(genealogyId, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
if (!hasRemoteConfig()) {
|
||||
return normalizeFamilyFeedRows(
|
||||
listPreviewFamilyFeeds(normalizedGenealogyId),
|
||||
normalizedGenealogyId
|
||||
).map((feed) => ({ ...feed, recommendationReason: '家谱内最新动态' }))
|
||||
}
|
||||
const recommendations = await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feed-recommendations`,
|
||||
method: 'GET'
|
||||
}, {
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
return normalizeFamilyFeedRecommendations(recommendations, normalizedGenealogyId)
|
||||
},
|
||||
|
||||
async getFeedDetail(genealogyId, feedId, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeFeedResourceId(feedId, '动态标识')
|
||||
requireRemoteFeed('动态详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED')
|
||||
const feed = await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}`,
|
||||
method: 'GET'
|
||||
}, {
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
return normalizeFamilyFeed(feed, normalizedGenealogyId, normalizedFeedId)
|
||||
},
|
||||
|
||||
async updateFeed(genealogyId, feedId, payload, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeFeedResourceId(feedId, '动态标识')
|
||||
requireRemoteFeed('修改动态需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED')
|
||||
const feed = await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}`,
|
||||
method: 'PUT',
|
||||
data: normalizeFeedCreatePayload(payload)
|
||||
}, {
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
return normalizeFamilyFeed(feed, normalizedGenealogyId, normalizedFeedId)
|
||||
},
|
||||
|
||||
async deleteFeed(genealogyId, feedId, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeFeedResourceId(feedId, '动态标识')
|
||||
requireRemoteFeed('删除动态需要真实服务,当前本地预览不会伪造删除成功', 'REMOTE_WRITE_REQUIRED')
|
||||
await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}`,
|
||||
method: 'DELETE'
|
||||
}, {
|
||||
requireData: false,
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
return null
|
||||
},
|
||||
|
||||
async setFeedLike(genealogyId, feedId, liked, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeFeedResourceId(feedId, '动态标识')
|
||||
if (typeof liked !== 'boolean') throw new TypeError('动态点赞状态必须是布尔值')
|
||||
requireRemoteFeed('动态点赞需要真实服务,当前本地预览不会伪造操作成功', 'REMOTE_WRITE_REQUIRED')
|
||||
await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}/likes`,
|
||||
method: liked ? 'POST' : 'DELETE'
|
||||
}, {
|
||||
requireData: false,
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
return null
|
||||
},
|
||||
|
||||
async createFeed(genealogyId, payload, requestOptions = {}) {
|
||||
requireRemoteFeed('动态发布需要真实服务,当前本地预览不会伪造发布成功', 'REMOTE_WRITE_REQUIRED')
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const createdFeed = await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds`,
|
||||
method: 'POST',
|
||||
data: normalizeFeedCreatePayload(payload)
|
||||
}, {
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
return normalizeFamilyFeedRows([createdFeed], normalizedGenealogyId)[0]
|
||||
},
|
||||
|
||||
async getFeedPage(genealogyId, { pageNum = 1, pageSize = 20 } = {}, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const pageQuery = normalizePageQuery(pageNum, pageSize, '动态')
|
||||
requireRemoteFeed('家族动态读取需要真实服务,当前本地预览不会伪造结果', 'REMOTE_READ_REQUIRED')
|
||||
const feedPage = await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/page`,
|
||||
method: 'GET',
|
||||
data: pageQuery
|
||||
}, {
|
||||
requireData: false,
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
assertPageResponse(feedPage, '动态')
|
||||
return {
|
||||
rows: normalizeFamilyFeedRows(feedPage.rows, normalizedGenealogyId),
|
||||
total: feedPage.total
|
||||
}
|
||||
},
|
||||
|
||||
async getFeedCommentPage(genealogyId, feedId, { pageNum = 1, pageSize = 20 } = {}, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeResourcePathId(feedId, '动态标识')
|
||||
const pageQuery = normalizePageQuery(pageNum, pageSize, '评论')
|
||||
requireRemoteFeed('动态评论读取需要真实服务,当前本地预览不会伪造结果', 'REMOTE_READ_REQUIRED')
|
||||
const commentPage = await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}/comments/page`,
|
||||
method: 'GET',
|
||||
data: pageQuery
|
||||
}, {
|
||||
requireData: false,
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
assertPageResponse(commentPage, '动态评论')
|
||||
return {
|
||||
rows: normalizeFeedComments(
|
||||
commentPage.rows,
|
||||
normalizedGenealogyId,
|
||||
normalizedFeedId,
|
||||
FEED_COMMENT_LEVEL.ROOT
|
||||
),
|
||||
total: commentPage.total
|
||||
}
|
||||
},
|
||||
|
||||
async getCommentReplyPage(genealogyId, feedId, commentId, { pageNum = 1, pageSize = 20 } = {}, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeResourcePathId(feedId, '动态标识')
|
||||
const normalizedCommentId = normalizeResourcePathId(commentId, '评论标识')
|
||||
const pageQuery = normalizePageQuery(pageNum, pageSize, '回复')
|
||||
requireRemoteFeed('评论回复读取需要真实服务,当前本地预览不会伪造结果', 'REMOTE_READ_REQUIRED')
|
||||
const replyPage = await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}/comments/${normalizedCommentId}/replies/page`,
|
||||
method: 'GET',
|
||||
data: pageQuery
|
||||
}, {
|
||||
requireData: false,
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
assertPageResponse(replyPage, '评论回复')
|
||||
return {
|
||||
rows: normalizeDirectFeedReplies(
|
||||
replyPage.rows,
|
||||
normalizedGenealogyId,
|
||||
normalizedFeedId,
|
||||
normalizedCommentId
|
||||
),
|
||||
total: replyPage.total
|
||||
}
|
||||
},
|
||||
|
||||
async deleteFeedComment(genealogyId, feedId, commentId, requestOptions = {}) {
|
||||
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
|
||||
const normalizedFeedId = normalizeResourcePathId(feedId, '动态标识')
|
||||
const normalizedCommentId = normalizeResourcePathId(commentId, '评论标识')
|
||||
requireRemoteFeed('动态评论写入需要真实服务,当前本地预览不会伪造结果', 'REMOTE_WRITE_REQUIRED')
|
||||
await requestStrict({
|
||||
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}/comments/${normalizedCommentId}`,
|
||||
method: 'DELETE'
|
||||
}, {
|
||||
requireData: false,
|
||||
requestController: requestOptions.requestController ?? null
|
||||
})
|
||||
return null
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user