import { listPreviewFamilyArticles } from '@/data/preview/family-content.js' import { hasRemoteConfig } from '@/utils/runtime-config.js' import { normalizeAppArticle, normalizeAppArticles, normalizeArticleCategoryOptions, normalizeArticleCreatePayload, normalizePreviewFamilyArticles } from './family-article-contract.js' import { normalizeGenealogyPathId } from './genealogy-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 requireRemoteArticle = (message, code) => { if (hasRemoteConfig()) return throw createRequestError(message, code) } const requestArticleContentProtection = async ({ genealogyId, articleId, method, data, requestOptions }) => { requireRemoteArticle('谱文内容保护需要真实服务,当前本地预览不会伪造结果', 'REMOTE_WRITE_REQUIRED') return requestStrict({ url: `/genealogy/app/genealogies/${genealogyId}/articles/${articleId}/content-protection`, method, ...(data === undefined ? {} : { data }) }, { requireData: false, requestController: requestOptions.requestController ?? null }) } export const familyArticleApi = { async createArticle(genealogyId, payload, requestOptions = {}) { requireRemoteArticle('谱文创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED') const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/articles`, method: 'POST', data: normalizeArticleCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) }, async getArticles(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) if (!hasRemoteConfig()) { return normalizePreviewFamilyArticles( listPreviewFamilyArticles(normalizedGenealogyId), normalizedGenealogyId ) } const articles = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/articles`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppArticles(articles, normalizedGenealogyId) }, async getArticleDetail(genealogyId, articleId, accessToken = '', requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedArticleId = normalizeResourcePathId(articleId, '谱文标识') requireRemoteArticle('谱文详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED') const article = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/articles/${normalizedArticleId}`, method: 'GET', header: contentAccessHeader(accessToken) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppArticle(article, normalizedGenealogyId, normalizedArticleId) }, async updateArticle(genealogyId, articleId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedArticleId = normalizeResourcePathId(articleId, '谱文标识') requireRemoteArticle('修改谱文需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED') const article = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/articles/${normalizedArticleId}`, method: 'PUT', data: normalizeArticleCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppArticle(article, normalizedGenealogyId, normalizedArticleId) }, async deleteArticle(genealogyId, articleId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedArticleId = normalizeResourcePathId(articleId, '谱文标识') requireRemoteArticle('删除谱文需要真实服务,当前本地预览不会伪造删除成功', 'REMOTE_WRITE_REQUIRED') await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/articles/${normalizedArticleId}`, method: 'DELETE' }, { requireData: false, requestController: requestOptions.requestController ?? null }) return null }, async setArticlePassword(genealogyId, articleId, password, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedArticleId = normalizeResourcePathId(articleId, '谱文标识') const passwordPayload = normalizeContentPasswordPayload(password) await requestArticleContentProtection({ genealogyId: normalizedGenealogyId, articleId: normalizedArticleId, method: 'PUT', data: passwordPayload, requestOptions }) return null }, async unlockArticle(genealogyId, articleId, password, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedArticleId = normalizeResourcePathId(articleId, '谱文标识') const passwordPayload = normalizeContentPasswordPayload(password) requireRemoteArticle('谱文内容解锁需要真实服务,当前本地预览不会伪造结果', 'REMOTE_WRITE_REQUIRED') const accessGrant = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/articles/${normalizedArticleId}/content-unlock`, method: 'POST', data: passwordPayload }, { requestController: requestOptions.requestController ?? null }) return normalizeContentAccessGrant(accessGrant) }, async disableArticlePassword(genealogyId, articleId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedArticleId = normalizeResourcePathId(articleId, '谱文标识') await requestArticleContentProtection({ genealogyId: normalizedGenealogyId, articleId: normalizedArticleId, method: 'DELETE', requestOptions }) return null }, async getArticleCategories(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteArticle('谱文分类读取需要真实服务,当前本地预览不会伪造结果', 'REMOTE_READ_REQUIRED') const categories = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/article-categories`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeArticleCategoryOptions(categories) } }