55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { isObject } from '../utils/object';
|
|
|
|
/**
|
|
* 将 Directus 返回的 Homepage 数据转换为 HomepageView 视图模型
|
|
*
|
|
* @param raw: 原始的 Homepage 数据
|
|
* @returns 转换后的 HomepageView 对象
|
|
*
|
|
* @example
|
|
* const view = toHomepageView(rawHomepage);
|
|
*/
|
|
export function toHomepageView(raw: Homepage): HomepageView {
|
|
const carousel = (raw.carousel ?? [])
|
|
.filter(isObject<HomepageFile>)
|
|
.map((item) => item.directus_files_id)
|
|
.filter(isObject<DirectusFile>)
|
|
.map((file) => file.id);
|
|
|
|
const products = (raw.recommend_products ?? [])
|
|
.filter(isObject<Product>)
|
|
.map((item) => {
|
|
const trans = item.translations?.[0];
|
|
|
|
const cover = isObject<DirectusFile>(item.cover) ? item.cover.id : '';
|
|
|
|
return {
|
|
id: item.id.toString(),
|
|
name: trans?.name ?? '',
|
|
summary: trans?.summary ?? '',
|
|
cover: cover,
|
|
} satisfies HomepageProductView;
|
|
});
|
|
|
|
const solutions = (raw.recommend_solutions ?? [])
|
|
.filter(isObject<Solution>)
|
|
.map((item) => {
|
|
const trans = item.translations?.[0];
|
|
const cover = isObject<DirectusFile>(item.cover) ? item.cover.id : '';
|
|
|
|
return {
|
|
id: item.id.toString(),
|
|
title: trans?.title ?? '',
|
|
summary: trans?.summary ?? '',
|
|
cover: cover,
|
|
} satisfies HomepageSolutionView;
|
|
});
|
|
|
|
return {
|
|
id: raw.id.toString(),
|
|
carousel: carousel ?? [],
|
|
recommendProducts: products ?? [],
|
|
recommendSolutions: solutions ?? [],
|
|
};
|
|
}
|