198 lines
7.7 KiB
JavaScript
198 lines
7.7 KiB
JavaScript
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
|
|
}
|
|
}
|