From c27337a145944c08a777b6dc560f2402df4688eb Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Wed, 3 Dec 2025 17:30:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E6=A1=A3=E5=BA=93=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=B7=BB=E5=8A=A0=E6=96=87=E6=A1=A3=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - graphQL查询修改:添加type字段查询 - 视图模型字段更新:添加DocumentTypeView视图模型并为DocumentList类型添加type字段 - mapper更新: 添加DocumentType的转换方法 --- server/assets/graphql/documentList.graphql | 7 +++ server/mappers/documentMapper.test.ts | 60 +++++++++++++++++++++- server/mappers/documentMapper.ts | 29 +++++++++++ shared/types/views/document-list-view.ts | 14 +++++ 4 files changed, 109 insertions(+), 1 deletion(-) diff --git a/server/assets/graphql/documentList.graphql b/server/assets/graphql/documentList.graphql index 194fea6..3a64458 100644 --- a/server/assets/graphql/documentList.graphql +++ b/server/assets/graphql/documentList.graphql @@ -10,6 +10,13 @@ query GetDocumentList($locale: String!) { id title } + type { + id + translations(filter: { languages_code: { code: { _eq: $locale } } }) { + id + name + } + } products { id products_id { diff --git a/server/mappers/documentMapper.test.ts b/server/mappers/documentMapper.test.ts index 50b1efc..d62e449 100644 --- a/server/mappers/documentMapper.test.ts +++ b/server/mappers/documentMapper.test.ts @@ -1,6 +1,51 @@ import { describe, test, expect } from 'vitest'; -import { toProductDocumentView, toDocumentListView } from './documentMapper'; +import { + toProductDocumentView, + toDocumentListView, + toDocumentTypeView, +} from './documentMapper'; +/** + * 单元测试: toDocumentTypeView + */ +describe('toDocumentTypeView', () => { + const baseData: DocumentType = { + id: 1, + translations: [{ id: 1, name: 'Type Name' }], + }; + + test('convert raw data to DocumentTypeView correctly', () => { + const rawData: DocumentType = { + ...baseData, + }; + + expect(toDocumentTypeView(rawData)).toEqual({ + id: '1', + name: 'Type Name', + }); + }); + + test('convert raw data with missing translations', () => { + const rawData: DocumentType = { + ...baseData, + translations: [], + }; + + expect(toDocumentTypeView(rawData)).toEqual({ + id: '1', + name: '', + }); + }); + + test('convert null input to default DocumentTypeView', () => { + const rawData: DocumentType | null = null; + + expect(toDocumentTypeView(rawData)).toEqual({ + id: '-1', + name: '', + }); + }); +}); /** * 单元测试: toProductDocumentView */ @@ -65,6 +110,15 @@ describe('toProductDocumentView', () => { describe('toDocumentListView', () => { const baseData: ProductDocument = { id: 1, + type: { + id: 1, + translations: [ + { + id: 1, + name: 'Type A', + }, + ], + }, file: { id: 'rand-om__-uuid-1234', filename_download: 'document.pdf', @@ -94,6 +148,10 @@ describe('toDocumentListView', () => { title: 'Document Title', url: '/api/assets/rand-om__-uuid-1234', size: 2048, + type: { + id: '1', + name: 'Type A', + }, products: [ { id: '1', diff --git a/server/mappers/documentMapper.ts b/server/mappers/documentMapper.ts index 9982dee..42ee54d 100644 --- a/server/mappers/documentMapper.ts +++ b/server/mappers/documentMapper.ts @@ -1,5 +1,31 @@ import { isObject } from '../../server/utils/object'; +/** + * 将 Directus 返回的 DocumentType 数据转换为 DocumentTypeView 视图模型 + * + * @param raw: 原始的 DocumentType 数据 + * @returns 转换后的 DocumentTypeView 对象 + * + * @example + * const view = toDocumentTypeView(rawDocumentType); + */ +export function toDocumentTypeView( + raw: DocumentType | string | null +): DocumentTypeView { + if (typeof raw === 'string' || raw === null) { + return { + id: '-1', + name: '', + } satisfies DocumentTypeView; + } + const trans = raw.translations?.[0]; + + return { + id: raw.id.toString(), + name: trans?.name ?? '', + }; +} + /** * 将 Directus 返回的 Document 数据转换为 ProductDocumentView 视图模型 * @@ -40,6 +66,8 @@ export function toProductDocumentView( export function toDocumentListView(raw: ProductDocument): DocumentListView { const trans = raw.translations?.[0]; + const type = toDocumentTypeView(raw.type ?? null); + const file = isObject(raw.file) ? raw.file : undefined; const fileId = file?.id ?? ''; @@ -73,6 +101,7 @@ export function toDocumentListView(raw: ProductDocument): DocumentListView { title: trans?.title ?? '', url: url, size: file?.filesize ?? 0, + type: type, products: related_products, }; } diff --git a/shared/types/views/document-list-view.ts b/shared/types/views/document-list-view.ts index a3cdefe..bab3047 100644 --- a/shared/types/views/document-list-view.ts +++ b/shared/types/views/document-list-view.ts @@ -1,3 +1,14 @@ +/** + * 文档类型视图模型 + * 用于在文档库中提供类型筛选功能 + */ +export interface DocumentTypeView { + /** 唯一标识符 **/ + id: string; + /** 类型名 **/ + name: string; +} + /** * 文档关联产品类型模型 * 用于在文档库中提供产品筛选功能 @@ -40,6 +51,9 @@ export interface DocumentListView { /** 文档链接 **/ url: string; + /** 文档类型 **/ + type: DocumentTypeView; + /** 相关产品 **/ products: DocumentListProduct[]; }