/** * 将 Directus返回的 Product 数据转换为 ProductListView 视图模型 * * @param raw: 原始的 Product 数据 * @returns 转换后的 ProductListView 对象 * * @example * const view = toProductListView(rawProduct); */ export function toProductListView(raw: Product): ProductListView { const trans = raw.translations?.[0] ?? { name: '', summary: '' }; return { id: raw.id, product_type: typeof raw.product_type === 'string' ? raw.product_type : typeof raw.product_type === 'object' && raw.product_type ? raw.product_type.translations[0].name || '' : '', name: trans.name, summary: trans.summary, cover: raw.cover.toString(), }; } /** * 将 Directus 返回的 ProductSpecGroup 数据转换为 ProductSpecGroupView 视图模型 * * @param raw: 原始的 ProductSpecGroup 数据 * @returns 转换后的 ProductSpecGroupView 对象 * * @example * const view = toProductSpecGroupView(rawSpecGroup); */ export function toProductSpecGroupView( raw: ProductSpecGroup ): ProductSpecGroupView { const trans = raw.translations?.[0] ?? { name: '', }; return { id: raw.id, name: trans.name, specs: raw.specs .filter(isObject) .map((item) => toProductSpecView(item)), }; } /** * 将 Directus 返回的 ProductSpec 数据转换为 ProductSpecView 视图模型 * * @param raw: 原始的 ProductSpec 数据 * @returns 转换后的 ProductSpecView 对象 * * @example * const view = toProductSpecView(rawSpecGroup); */ export function toProductSpecView(raw: ProductSpec): ProductSpecView { const trans = raw.translations?.[0] ?? { key: '', value: '', }; return { id: raw.id, key: trans.key, value: trans.value, }; } /** * 将 Directus 返回的 Product 数据转换为 ProductView 视图模型 * * @param raw: 原始的 Product 数据 * @returns 转换后的 ProductView 对象 * * @example * const view = toProductView(rawProduct); */ export function toProductView(raw: Product): ProductView { const trans = raw.translations?.[0] ?? { name: '', summary: '', description: '', }; const images = (raw.images ?? []) .filter(isObject) .map((item) => item.product_images_id) .filter(isObject) .map((item) => { return { id: item.id, image: item.image.toString(), caption: item.translations?.[0]?.caption || '', }; }); const specs = (raw.specs ?? []) .filter(isObject) .map((item) => toProductSpecGroupView(item)); const faqs = (raw.faqs ?? []) .filter(isObject) .map((item) => item.questions_id) .filter(isObject) .map((item) => toProductQuestionView(item)); const documents = (raw.documents ?? []) .filter(isObject) .map((item) => item.product_documents_id) .filter(isObject) .map((item) => toProductDocumentView(item)); return { id: raw.id, product_type: typeof raw.product_type === 'string' ? raw.product_type : typeof raw.product_type === 'object' && raw.product_type ? raw.product_type.translations[0].name || '' : '', name: trans.name, summary: trans.summary, images: images, description: trans.description, specs: specs, faqs: faqs, documents: documents, }; }