Files
jiapuapp/services/api/family-feed-service.js

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
}
}