Files
jiapuapp/services/api/genealogy-capability-service.js

219 lines
9.8 KiB
JavaScript

import { normalizeGenealogyPathId } from './genealogy-contract.js'
import { normalizeResourcePathId } from './request-normalizers.js'
import { createRequestError, requestStrict } from './request-client.js'
import {
normalizePlatformVideoPlacement,
normalizePlatformVideos
} from './family-media-contract.js'
import {
VIDEO_COMMENT_LEVEL,
normalizeCreatedPlatformVideoComment,
normalizeCreatedVideoComment,
normalizePlatformVideoComments,
normalizeVideoCommentPayload,
normalizeVideoComments
} from './video-comment-contract.js'
import {
normalizeMemberPermissionAssignment,
normalizeMemberPermissionPayload,
normalizePermissionCatalog
} from './genealogy-permission-contract.js'
const assertPage = (value, label) => {
if (!value || typeof value !== 'object' || !Array.isArray(value.rows) || !Number.isSafeInteger(value.total)) {
throw createRequestError(`${label}响应无效`, 'PAGE_RESPONSE_INVALID')
}
return value
}
const assertCompleteness = (value) => {
const isCount = (count) => Number.isSafeInteger(count) && count >= 0
if (
!value ||
typeof value !== 'object' ||
!isCount(value.totalCount) ||
value.totalCount === 0 ||
!isCount(value.completedCount) ||
value.completedCount > value.totalCount ||
!Number.isSafeInteger(value.completionRate) ||
value.completionRate < 0 ||
value.completionRate > 100 ||
!Array.isArray(value.missingItems)
) {
throw createRequestError('资料完整度响应无效', 'COMPLETENESS_RESPONSE_INVALID')
}
return value
}
export const genealogyCapabilityApi = {
async getCompleteness(genealogyId, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId)
const completeness = await requestStrict({ url: `/genealogy/app/genealogies/${id}/completeness`, method: 'GET' }, { requestController: requestOptions.requestController ?? null })
return assertCompleteness(completeness)
},
async getRecyclePage(genealogyId, query = {}, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId)
const page = await requestStrict({ url: `/genealogy/app/genealogies/${id}/recycle-bin/page`, method: 'GET', data: query }, {
requireData: false,
requestController: requestOptions.requestController ?? null
})
return assertPage(page, '回收站')
},
async restoreRecycleItem(genealogyId, resourceType, resourceId, requestOptions = {}) {
if (typeof resourceType !== 'string' || !resourceType.trim()) throw new TypeError('资源类型不能为空')
const id = normalizeGenealogyPathId(genealogyId)
const resource = normalizeResourcePathId(resourceId, '资源标识')
return requestStrict({ url: `/genealogy/app/genealogies/${id}/recycle-bin/${encodeURIComponent(resourceType.trim())}/${resource}/restore`, method: 'PUT' }, { requestController: requestOptions.requestController ?? null })
},
async getPermissionCatalog(genealogyId, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId)
const catalog = await requestStrict({
url: `/genealogy/app/genealogies/${id}/permission-catalog`,
method: 'GET'
}, { requestController: requestOptions.requestController ?? null })
return normalizePermissionCatalog(catalog)
},
async getMemberPermissions(genealogyId, memberId, enabledCodes, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId); const member = normalizeResourcePathId(memberId, '成员标识')
const assignment = await requestStrict({ url: `/genealogy/app/genealogies/${id}/members/${member}/permissions`, method: 'GET' }, { requestController: requestOptions.requestController ?? null })
return normalizeMemberPermissionAssignment(assignment, enabledCodes, {
expectedGenealogyId: id,
expectedMemberId: member
})
},
async saveMemberPermissions(genealogyId, memberId, permissionCodes, reason = '', enabledCodes = [], requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId); const member = normalizeResourcePathId(memberId, '成员标识')
const assignment = await requestStrict({
url: `/genealogy/app/genealogies/${id}/members/${member}/permissions`,
method: 'PUT',
data: normalizeMemberPermissionPayload(permissionCodes, reason, enabledCodes)
}, { requestController: requestOptions.requestController ?? null })
return normalizeMemberPermissionAssignment(assignment, enabledCodes, {
expectedGenealogyId: id,
expectedMemberId: member
})
},
async setVideoLike(genealogyId, videoId, liked, requestOptions = {}) {
if (typeof liked !== 'boolean') throw new TypeError('点赞状态无效')
const id = normalizeGenealogyPathId(genealogyId); const video = normalizeResourcePathId(videoId, '视频标识')
return requestStrict({ url: `/genealogy/app/genealogies/${id}/videos/${video}/likes`, method: liked ? 'POST' : 'DELETE' }, {
requireData: false,
requestController: requestOptions.requestController ?? null
})
},
async getVideoComments(genealogyId, videoId, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId); const video = normalizeResourcePathId(videoId, '视频标识')
const page = assertPage(await requestStrict({
url: `/genealogy/app/genealogies/${id}/videos/${video}/comments/page`,
method: 'GET',
data: { pageNum: 1, pageSize: 100 }
}, {
requireData: false,
requestController: requestOptions.requestController ?? null
}), '视频评论')
return normalizeVideoComments(page.rows, video, { expectedGenealogyId: id })
},
async getVideoCommentReplies(genealogyId, videoId, commentId, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId)
const video = normalizeResourcePathId(videoId, '视频标识')
const comment = normalizeResourcePathId(commentId, '父评论标识')
const page = assertPage(await requestStrict({
url: `/genealogy/app/genealogies/${id}/videos/${video}/comments/${comment}/replies/page`,
method: 'GET',
data: { pageNum: 1, pageSize: 100 }
}, {
requireData: false,
requestController: requestOptions.requestController ?? null
}), '视频评论回复')
return normalizeVideoComments(page.rows, video, {
expectedGenealogyId: id,
expectedLevel: VIDEO_COMMENT_LEVEL.REPLY,
expectedParentCommentId: comment
})
},
async createVideoComment(genealogyId, videoId, content, parentCommentId = null, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId); const video = normalizeResourcePathId(videoId, '视频标识')
const payload = normalizeVideoCommentPayload({
commentContent: content,
...(parentCommentId ? { parentCommentId } : {})
})
const comment = await requestStrict({
url: `/genealogy/app/genealogies/${id}/videos/${video}/comments`,
method: 'POST',
data: payload
}, { requestController: requestOptions.requestController ?? null })
return normalizeCreatedVideoComment(comment, video, {
expectedGenealogyId: id,
expectedLevel: parentCommentId ? VIDEO_COMMENT_LEVEL.REPLY : VIDEO_COMMENT_LEVEL.ROOT,
expectedParentCommentId: payload.parentCommentId || ''
})
},
async deleteVideoComment(genealogyId, videoId, commentId, requestOptions = {}) {
const id = normalizeGenealogyPathId(genealogyId); const video = normalizeResourcePathId(videoId, '视频标识'); const comment = normalizeResourcePathId(commentId, '评论标识')
return requestStrict({ url: `/genealogy/app/genealogies/${id}/videos/${video}/comments/${comment}`, method: 'DELETE' }, {
requireData: false,
requestController: requestOptions.requestController ?? null
})
},
async getPlatformVideos(placement, requestOptions = {}) {
const normalizedPlacement = normalizePlatformVideoPlacement(placement)
const videos = await requestStrict({
url: '/genealogy/app/platform-videos',
method: 'GET',
data: { placement: normalizedPlacement }
}, {
requestController: requestOptions.requestController ?? null
})
return normalizePlatformVideos(videos, normalizedPlacement)
},
async setPlatformVideoLike(videoId, liked, requestOptions = {}) {
if (typeof liked !== 'boolean') throw new TypeError('点赞状态无效')
return requestStrict({ url: `/genealogy/app/platform-videos/${normalizeResourcePathId(videoId, '平台视频标识')}/likes`, method: liked ? 'POST' : 'DELETE' }, {
requireData: false,
requestController: requestOptions.requestController ?? null
})
},
async getPlatformVideoComments(videoId, requestOptions = {}) {
const video = normalizeResourcePathId(videoId, '平台视频标识')
const comments = await requestStrict({ url: `/genealogy/app/platform-videos/${video}/comments`, method: 'GET' }, {
requestController: requestOptions.requestController ?? null
})
return normalizePlatformVideoComments(comments, video)
},
async createPlatformVideoComment(videoId, content, requestOptions = {}) {
const video = normalizeResourcePathId(videoId, '平台视频标识')
const payload = normalizeVideoCommentPayload({ commentContent: content })
const comment = await requestStrict({ url: `/genealogy/app/platform-videos/${video}/comments`, method: 'POST', data: payload }, {
requestController: requestOptions.requestController ?? null
})
return normalizeCreatedPlatformVideoComment(comment, video)
},
async deletePlatformVideoComment(videoId, commentId, requestOptions = {}) {
const video = normalizeResourcePathId(videoId, '平台视频标识')
const comment = normalizeResourcePathId(commentId, '平台视频评论标识')
await requestStrict({
url: `/genealogy/app/platform-videos/${video}/comments/${comment}`,
method: 'DELETE'
}, {
requireData: false,
requestController: requestOptions.requestController ?? null
})
return null
}
}