import { listPreviewGrowthRecords } from '@/data/preview/records.js' import { hasRemoteConfig } from '@/utils/runtime-config.js' import { normalizeGenealogyPathId } from './genealogy-contract.js' import { normalizeAppGrowthRecord, normalizeAppGrowthRecords, normalizeAppLifeEvent, normalizeAppLifeEvents, normalizeAppMemo, normalizeAppMemos, normalizeAppMeritRecord, normalizeAppMeritRecords, normalizeAppRelativeRecord, normalizeAppRelativeRecords, normalizeGrowthRecordCreatePayload, normalizeLifeEventPayload, normalizeMemoCreatePayload, normalizeMeritRecordCreatePayload, normalizeRelativeRecordCreatePayload, projectPreviewGrowthRecords } from './life-record-contract.js' import { normalizeResourcePathId } from './request-normalizers.js' import { contentAccessHeader, normalizeContentAccessGrant, normalizeContentPasswordPayload } from './protected-content-contract.js' import { createRequestError, requestStrict } from './request-client.js' const requireRemoteLifeRecord = (message, code) => { if (hasRemoteConfig()) return throw createRequestError(message, code) } const writeLifeRecord = (url, method, data, label, requestOptions) => { requireRemoteLifeRecord(`${label}需要真实服务,当前本地预览不会伪造操作成功`, 'REMOTE_WRITE_REQUIRED') return requestStrict({ url, method, data }, { requestController: requestOptions.requestController ?? null }) } const deleteLifeRecord = async (url, label, requestOptions) => { requireRemoteLifeRecord(`${label}需要真实服务,当前本地预览不会伪造删除成功`, 'REMOTE_WRITE_REQUIRED') await requestStrict({ url, method: 'DELETE' }, { requireData: false, requestController: requestOptions.requestController ?? null }) return null } export const lifeRecordApi = { async createRelativeRecord(genealogyId, payload, requestOptions = {}) { requireRemoteLifeRecord('亲友往来创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED') const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records`, method: 'POST', data: normalizeRelativeRecordCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) }, async updateRelativeRecord(genealogyId, relativeId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRelativeId = normalizeResourcePathId(relativeId, '亲友记录标识') requireRemoteLifeRecord('修改亲友记录需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED') const relativeRecord = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records/${normalizedRelativeId}`, method: 'PUT', data: normalizeRelativeRecordCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppRelativeRecord(relativeRecord, normalizedGenealogyId, normalizedRelativeId) }, async deleteRelativeRecord(genealogyId, relativeId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRelativeId = normalizeResourcePathId(relativeId, '亲友记录标识') return deleteLifeRecord( `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records/${normalizedRelativeId}`, '删除亲友记录', requestOptions ) }, async getRelativeRecords(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteLifeRecord('亲友记录需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED') const relativeRecords = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppRelativeRecords(relativeRecords, normalizedGenealogyId) }, async getRelativeRecordDetail(genealogyId, relativeId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRelativeId = normalizeResourcePathId(relativeId, '亲友记录标识') requireRemoteLifeRecord('亲友记录详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED') const relativeRecord = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records/${normalizedRelativeId}`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppRelativeRecord(relativeRecord, normalizedGenealogyId, normalizedRelativeId) }, async createGrowthRecord(genealogyId, payload, requestOptions = {}) { requireRemoteLifeRecord('成长记录创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED') const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records`, method: 'POST', data: normalizeGrowthRecordCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) }, async updateGrowthRecord(genealogyId, recordId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识') requireRemoteLifeRecord('修改成长记录需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED') const growthRecord = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}`, method: 'PUT', data: normalizeGrowthRecordCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppGrowthRecord(growthRecord, normalizedGenealogyId, normalizedRecordId) }, async deleteGrowthRecord(genealogyId, recordId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识') return deleteLifeRecord( `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}`, '删除成长记录', requestOptions ) }, async getGrowthRecords(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) if (!hasRemoteConfig()) { return projectPreviewGrowthRecords( listPreviewGrowthRecords(normalizedGenealogyId), normalizedGenealogyId ) } const growthRecords = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppGrowthRecords(growthRecords, normalizedGenealogyId) }, async getGrowthRecordDetail(genealogyId, recordId, accessToken = '', requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识') requireRemoteLifeRecord('成长记录详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED') const growthRecord = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}`, method: 'GET', header: contentAccessHeader(accessToken) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppGrowthRecord(growthRecord, normalizedGenealogyId, normalizedRecordId) }, async setGrowthRecordPassword(genealogyId, recordId, password, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识') const passwordPayload = normalizeContentPasswordPayload(password) await writeLifeRecord( `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}/content-protection`, 'PUT', passwordPayload, '成长记录内容密码设置', requestOptions ) return null }, async unlockGrowthRecord(genealogyId, recordId, password, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识') const passwordPayload = normalizeContentPasswordPayload(password) const accessGrant = await writeLifeRecord( `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}/content-unlock`, 'POST', passwordPayload, '成长记录内容解锁', requestOptions ) return normalizeContentAccessGrant(accessGrant) }, async disableGrowthRecordPassword(genealogyId, recordId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识') return deleteLifeRecord( `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}/content-protection`, '成长记录内容密码停用', requestOptions ) }, async createLifeEvent(genealogyId, lineagePersonId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedLineagePersonId = normalizeResourcePathId(lineagePersonId, '人物标识') requireRemoteLifeRecord('人生大事创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED') const lifeEvent = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events`, method: 'POST', data: normalizeLifeEventPayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppLifeEvent(lifeEvent, normalizedGenealogyId, normalizedLineagePersonId) }, async updateLifeEvent(genealogyId, lineagePersonId, eventId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedLineagePersonId = normalizeResourcePathId(lineagePersonId, '人物标识') const normalizedEventId = normalizeResourcePathId(eventId, '人生大事标识') const lifeEventChanges = normalizeLifeEventPayload(payload) const lifeEvent = await writeLifeRecord( `/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events/${normalizedEventId}`, 'PUT', lifeEventChanges, '人生大事更新', requestOptions ) return normalizeAppLifeEvent(lifeEvent, normalizedGenealogyId, normalizedLineagePersonId, normalizedEventId) }, async deleteLifeEvent(genealogyId, lineagePersonId, eventId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedLineagePersonId = normalizeResourcePathId(lineagePersonId, '人物标识') const normalizedEventId = normalizeResourcePathId(eventId, '人生大事标识') return deleteLifeRecord( `/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events/${normalizedEventId}`, '人生大事删除', requestOptions ) }, async getLifeEvents(genealogyId, lineagePersonId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedLineagePersonId = normalizeResourcePathId(lineagePersonId, '人物标识') requireRemoteLifeRecord('人生大事需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED') const lifeEvents = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppLifeEvents(lifeEvents, normalizedGenealogyId, normalizedLineagePersonId) }, async createMemo(genealogyId, payload, requestOptions = {}) { requireRemoteLifeRecord('备忘创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED') const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos`, method: 'POST', data: normalizeMemoCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) }, async updateMemo(genealogyId, memoId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMemoId = normalizeResourcePathId(memoId, '备忘标识') requireRemoteLifeRecord('修改备忘需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED') const memo = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos/${normalizedMemoId}`, method: 'PUT', data: normalizeMemoCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppMemo(memo, normalizedGenealogyId, normalizedMemoId) }, async deleteMemo(genealogyId, memoId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMemoId = normalizeResourcePathId(memoId, '备忘标识') return deleteLifeRecord(`/genealogy/app/genealogies/${normalizedGenealogyId}/memos/${normalizedMemoId}`, '删除备忘', requestOptions) }, async getMemos(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteLifeRecord('备忘列表需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED') const memos = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppMemos(memos, normalizedGenealogyId) }, async getMemoDetail(genealogyId, memoId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMemoId = normalizeResourcePathId(memoId, '备忘标识') requireRemoteLifeRecord('备忘详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED') const memo = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos/${normalizedMemoId}`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppMemo(memo, normalizedGenealogyId, normalizedMemoId) }, async createMeritRecord(genealogyId, payload, requestOptions = {}) { requireRemoteLifeRecord('功德记录创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED') const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records`, method: 'POST', data: normalizeMeritRecordCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) }, async updateMeritRecord(genealogyId, meritId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMeritId = normalizeResourcePathId(meritId, '功德记录标识') requireRemoteLifeRecord('修改功德记录需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED') const meritRecord = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records/${normalizedMeritId}`, method: 'PUT', data: normalizeMeritRecordCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppMeritRecord(meritRecord, normalizedGenealogyId, normalizedMeritId) }, async deleteMeritRecord(genealogyId, meritId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMeritId = normalizeResourcePathId(meritId, '功德记录标识') return deleteLifeRecord(`/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records/${normalizedMeritId}`, '删除功德记录', requestOptions) }, async getMeritRecords(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteLifeRecord('功德记录需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED') const meritRecords = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppMeritRecords(meritRecords, normalizedGenealogyId) }, async getMeritRecordDetail(genealogyId, meritId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedMeritId = normalizeResourcePathId(meritId, '功德记录标识') requireRemoteLifeRecord('功德记录详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED') const meritRecord = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records/${normalizedMeritId}`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppMeritRecord(meritRecord, normalizedGenealogyId, normalizedMeritId) } }