import { hasRemoteConfig } from '@/utils/runtime-config.js' import { normalizeGenealogyPathId } from './genealogy-contract.js' import { normalizeGenealogyMemberOptions, normalizeGenealogyMembers, normalizeMemberUpdatePayload } from './genealogy-member-contract.js' import { normalizeResourcePathId } from './request-normalizers.js' import { createRequestError, requestStrict } from './request-client.js' const requireRemoteMembership = (label, operation) => { if (hasRemoteConfig()) return throw createRequestError( `${label}${operation}需要真实服务,当前本地预览不会伪造结果`, operation === '读取' ? 'REMOTE_READ_REQUIRED' : 'REMOTE_WRITE_REQUIRED' ) } const writeMembership = (url, method, data, label, requestOptions) => { requireRemoteMembership(label, '写入') return requestStrict({ url, method, ...(data === undefined ? {} : { data }) }, { requestController: requestOptions.requestController ?? null }) } const deleteMembership = async (url, label, requestOptions) => { requireRemoteMembership(label, '写入') await requestStrict({ url, method: 'DELETE' }, { requireData: false, requestController: requestOptions.requestController ?? null }) return null } export const genealogyMemberApi = { async getMembers(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteMembership('家谱成员', '读取') const members = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/members`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeGenealogyMembers(members, normalizedGenealogyId) }, async getMemberOptions(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteMembership('成员选项', '读取') const memberOptions = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/members/options`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeGenealogyMemberOptions(memberOptions) }, async updateMember(genealogyId, memberId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMemberId = normalizeResourcePathId(memberId, '成员标识') const member = await writeMembership( `/genealogy/app/genealogies/${normalizedGenealogyId}/members/${normalizedMemberId}`, 'PUT', normalizeMemberUpdatePayload(payload), '家谱成员', requestOptions ) return normalizeGenealogyMembers([member], normalizedGenealogyId)[0] }, async unlinkMemberLineagePerson(genealogyId, memberId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMemberId = normalizeResourcePathId(memberId, '成员标识') return deleteMembership( `/genealogy/app/genealogies/${normalizedGenealogyId}/members/${normalizedMemberId}/lineage-person`, '成员世系绑定', requestOptions ) }, async removeMember(genealogyId, memberId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMemberId = normalizeResourcePathId(memberId, '成员标识') return deleteMembership( `/genealogy/app/genealogies/${normalizedGenealogyId}/members/${normalizedMemberId}`, '家谱成员', requestOptions ) }, async leaveGenealogy(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return deleteMembership( `/genealogy/app/genealogies/${normalizedGenealogyId}/members/me`, '退出家谱', requestOptions ) }, async transferGenealogyOwner(genealogyId, targetMemberId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return writeMembership( `/genealogy/app/genealogies/${normalizedGenealogyId}/members/owner-transfer`, 'PUT', { targetMemberId: normalizeResourcePathId(targetMemberId, '目标成员标识') }, '家谱所有者转让', requestOptions ) } }