All checks were successful
deploy to server / build-and-deploy (push) Successful in 3m4s
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
/**
|
|
* 将 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((item) => typeof item === 'string');
|
|
|
|
const products = (raw.recommend_products ?? [])
|
|
.filter(isObject<Product>)
|
|
.map((item) => {
|
|
const cover = isObject<DirectusFile>(item.cover)
|
|
? item.cover.id
|
|
: item.cover;
|
|
const trans = item.translations?.[0] ?? { name: '', summary: '' };
|
|
return {
|
|
id: item.id,
|
|
name: trans.name,
|
|
summary: trans.summary,
|
|
cover: cover,
|
|
} satisfies HomepageProductView;
|
|
});
|
|
|
|
const solutions = (raw.recommend_solutions ?? [])
|
|
.filter(isObject<Solution>)
|
|
.map((item) => {
|
|
const cover = isObject<DirectusFile>(item.cover)
|
|
? item.cover.id
|
|
: item.cover;
|
|
const trans = item.translations?.[0] ?? { title: '', summary: '' };
|
|
|
|
return {
|
|
id: item.id,
|
|
title: trans.title,
|
|
summary: trans.summary,
|
|
cover: cover,
|
|
} satisfies HomepageSolutionView;
|
|
});
|
|
|
|
return {
|
|
id: raw.id,
|
|
carousel: carousel ?? [],
|
|
recommendProducts: products ?? [],
|
|
recommendSolutions: solutions ?? [],
|
|
};
|
|
}
|