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 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 = {}) { 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) 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, '动态标识') 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, '动态标识') 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, '动态标识') 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('动态点赞状态必须是布尔值') 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 = {}) { 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, '动态') 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, '评论') 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, '回复') 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, '评论标识') await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/feeds/${normalizedFeedId}/comments/${normalizedCommentId}`, method: 'DELETE' }, { requireData: false, requestController: requestOptions.requestController ?? null }) return null } }