From 62ec2153401a6ff11a8ec3798ebe21aaf8b6c539 Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Wed, 10 Dec 2025 13:35:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BA=A7=E5=93=81=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=B7=BB=E5=8A=A0=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 产品状态:从Directus Schema获取Product的Status字段 - 视图字段:添加Status字段用于标示产品状态 - 测试方法:为Status字段添加单元测试 --- server/mappers/productMapper.test.ts | 45 +++++++++++++++++++++------- server/mappers/productMapper.ts | 3 ++ shared/types/views/product-view.ts | 6 ++++ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/server/mappers/productMapper.test.ts b/server/mappers/productMapper.test.ts index 931e8af..d9831ef 100644 --- a/server/mappers/productMapper.test.ts +++ b/server/mappers/productMapper.test.ts @@ -456,21 +456,26 @@ describe('toProductDocumentView', () => { * 单元测试: toProductView */ describe('toProductView', () => { + const baseData: Product = { + id: 1, + status: 'in-production', + translations: [ + { + id: 1, + name: 'Product Name', + summary: 'Product Summary', + description: 'Product Description', + }, + ], + }; test('convert raw data to ProductView correctly', () => { const rawData: Product = { - id: 1, - translations: [ - { - id: 1, - name: 'Product Name', - summary: 'Product Summary', - description: 'Product Description', - }, - ], + ...baseData, }; expect(toProductView(rawData)).toEqual({ id: '1', + status: 'in-production', name: 'Product Name', summary: 'Product Summary', description: 'Product Description', @@ -483,12 +488,13 @@ describe('toProductView', () => { test('convert raw data with missing translations', () => { const rawData: Product = { - id: 1, + ...baseData, translations: [], }; expect(toProductView(rawData)).toEqual({ id: '1', + status: 'in-production', name: '', summary: '', description: '', @@ -498,4 +504,23 @@ describe('toProductView', () => { specs: [], }); }); + + test('conert raw data with missing status', () => { + const rawData: Product = { + ...baseData, + status: undefined, + }; + + expect(toProductView(rawData)).toEqual({ + id: '1', + status: 'discontinued', + name: 'Product Name', + summary: 'Product Summary', + description: 'Product Description', + images: [], + documents: [], + faqs: [], + specs: [], + }); + }); }); diff --git a/server/mappers/productMapper.ts b/server/mappers/productMapper.ts index 453b85a..0111141 100644 --- a/server/mappers/productMapper.ts +++ b/server/mappers/productMapper.ts @@ -219,6 +219,8 @@ export function toProductDocumentView( export function toProductView(raw: Product): ProductView { const trans = raw.translations?.[0]; + const status = raw.status ?? 'discontinued'; + const images = toProductImageView(raw.images ?? []); const specs = toProductSpecGroupView(raw.specs ?? []); @@ -229,6 +231,7 @@ export function toProductView(raw: Product): ProductView { return { id: raw.id.toString(), + status: status, name: trans?.name ?? '', summary: trans?.summary ?? '', images: images, diff --git a/shared/types/views/product-view.ts b/shared/types/views/product-view.ts index 0c2a08a..653e5c1 100644 --- a/shared/types/views/product-view.ts +++ b/shared/types/views/product-view.ts @@ -1,4 +1,7 @@ import type { DocumentTypeView } from './document-list-view'; +import type { Product } from '../directus/my-schema.ts'; + +type ProductStatus = Product['status']; /** * 产品图片视图模型 @@ -90,6 +93,9 @@ export interface ProductView { /** 唯一标识符 **/ id: string; + /** 产品状态 **/ + status: ProductStatus; + /** 产品名称 **/ name: string;