import { listPreviewFamilyAlbums } from '@/data/preview/family-content.js' import { hasRemoteConfig } from '@/utils/runtime-config.js' import { normalizeAlbumCreatePayload, normalizeAlbumPhotoCreatePayload, normalizeAppAlbum, normalizeAppAlbumPhotos, normalizeAppAlbums, normalizeAppVideo, normalizeAppVideos, normalizeVideoPayload, projectPreviewAlbums } from './family-media-contract.js' import { normalizeGenealogyPathId } from './genealogy-contract.js' import { normalizeResourcePathId } from './request-normalizers.js' import { createRequestError, requestStrict } from './request-client.js' const requireRemoteMedia = (message, code) => { if (hasRemoteConfig()) return throw createRequestError(message, code) } export const familyMediaApi = { async createAlbum(genealogyId, payload, requestOptions = {}) { requireRemoteMedia('相册创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED') const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) return requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/albums`, method: 'POST', data: normalizeAlbumCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) }, async updateAlbum(genealogyId, albumId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedAlbumId = normalizeResourcePathId(albumId, '相册标识') requireRemoteMedia('修改相册需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED') const album = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/albums/${normalizedAlbumId}`, method: 'PUT', data: normalizeAlbumCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppAlbum(album, normalizedGenealogyId) }, async deleteAlbum(genealogyId, albumId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedAlbumId = normalizeResourcePathId(albumId, '相册标识') requireRemoteMedia('删除相册需要真实服务,当前本地预览不会伪造删除成功', 'REMOTE_WRITE_REQUIRED') await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/albums/${normalizedAlbumId}`, method: 'DELETE' }, { requireData: false, requestController: requestOptions.requestController ?? null }) return null }, async createAlbumPhoto(genealogyId, albumId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedAlbumId = normalizeResourcePathId(albumId, '相册标识') requireRemoteMedia('上传相册照片需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED') return requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/albums/${normalizedAlbumId}/photos`, method: 'POST', data: normalizeAlbumPhotoCreatePayload(payload) }, { requestController: requestOptions.requestController ?? null }) }, async deleteAlbumPhoto(genealogyId, albumId, photoId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedAlbumId = normalizeResourcePathId(albumId, '相册标识') const normalizedPhotoId = normalizeResourcePathId(photoId, '照片标识') requireRemoteMedia('删除相册照片需要真实服务,当前本地预览不会伪造删除成功', 'REMOTE_WRITE_REQUIRED') await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/albums/${normalizedAlbumId}/photos/${normalizedPhotoId}`, method: 'DELETE' }, { requireData: false, requestController: requestOptions.requestController ?? null }) return null }, async getAlbums(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) if (!hasRemoteConfig()) { return projectPreviewAlbums( listPreviewFamilyAlbums(normalizedGenealogyId), normalizedGenealogyId ) } const albums = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/albums`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppAlbums(albums, normalizedGenealogyId) }, async getAlbumPhotos(genealogyId, albumId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedAlbumId = normalizeResourcePathId(albumId, '相册标识') requireRemoteMedia('相册照片需要真实读取服务,当前本地预览不会伪造照片列表', 'REMOTE_READ_REQUIRED') const photos = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/albums/${normalizedAlbumId}/photos`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppAlbumPhotos(photos, normalizedGenealogyId, normalizedAlbumId) }, async getVideos(genealogyId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteMedia('家族视频读取需要真实服务,当前本地预览不会伪造结果', 'REMOTE_READ_REQUIRED') const videos = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/videos`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppVideos(videos, normalizedGenealogyId) }, async getVideoDetail(genealogyId, videoId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedVideoId = normalizeResourcePathId(videoId, '视频标识') requireRemoteMedia('家族视频详情读取需要真实服务,当前本地预览不会伪造结果', 'REMOTE_READ_REQUIRED') const video = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/videos/${normalizedVideoId}`, method: 'GET' }, { requestController: requestOptions.requestController ?? null }) return normalizeAppVideo(video, normalizedGenealogyId, normalizedVideoId) }, async createVideo(genealogyId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) requireRemoteMedia('家族视频写入需要真实服务,当前本地预览不会伪造结果', 'REMOTE_WRITE_REQUIRED') const video = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/videos`, method: 'POST', data: normalizeVideoPayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppVideo(video, normalizedGenealogyId) }, async updateVideo(genealogyId, videoId, payload, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedVideoId = normalizeResourcePathId(videoId, '视频标识') requireRemoteMedia('家族视频写入需要真实服务,当前本地预览不会伪造结果', 'REMOTE_WRITE_REQUIRED') const video = await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/videos/${normalizedVideoId}`, method: 'PUT', data: normalizeVideoPayload(payload) }, { requestController: requestOptions.requestController ?? null }) return normalizeAppVideo(video, normalizedGenealogyId, normalizedVideoId) }, async deleteVideo(genealogyId, videoId, requestOptions = {}) { const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId) const normalizedVideoId = normalizeResourcePathId(videoId, '视频标识') requireRemoteMedia('家族视频写入需要真实服务,当前本地预览不会伪造结果', 'REMOTE_WRITE_REQUIRED') await requestStrict({ url: `/genealogy/app/genealogies/${normalizedGenealogyId}/videos/${normalizedVideoId}`, method: 'DELETE' }, { requireData: false, requestController: requestOptions.requestController ?? null }) return null } }