From 60bd6db01eb96b3773f73929784e0dc968efd246 Mon Sep 17 00:00:00 2001 From: griest024 Date: Fri, 19 Apr 2024 22:14:32 -0400 Subject: [PATCH] feat(navigation): add injectable transforms to magento driver (#2774) --- .../driver/magento/src/public_api.ts | 1 + .../navigation-transformer.spec.ts | 13 ++++-- .../transformers/navigation-transformer.ts | 43 ++++++++++++------- .../magento/src/transforms/public_api.ts | 2 + .../driver/magento/src/transforms/token.ts | 27 ++++++++++++ .../driver/magento/src/transforms/type.ts | 9 ++++ 6 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 libs/navigation/driver/magento/src/transforms/public_api.ts create mode 100644 libs/navigation/driver/magento/src/transforms/token.ts create mode 100644 libs/navigation/driver/magento/src/transforms/type.ts diff --git a/libs/navigation/driver/magento/src/public_api.ts b/libs/navigation/driver/magento/src/public_api.ts index b2be58e6a7..69a0ee3342 100644 --- a/libs/navigation/driver/magento/src/public_api.ts +++ b/libs/navigation/driver/magento/src/public_api.ts @@ -10,3 +10,4 @@ export { DaffMagentoNavigationService } from './navigation.service'; export { DaffMagentoNavigationTransformerService } from './transformers/navigation-transformer'; export * from './queries/get-category-tree'; export * from './models/public_api'; +export * from './transforms/public_api'; diff --git a/libs/navigation/driver/magento/src/transformers/navigation-transformer.spec.ts b/libs/navigation/driver/magento/src/transformers/navigation-transformer.spec.ts index 8aa7a86b36..d63e09d94d 100644 --- a/libs/navigation/driver/magento/src/transformers/navigation-transformer.spec.ts +++ b/libs/navigation/driver/magento/src/transformers/navigation-transformer.spec.ts @@ -1,11 +1,14 @@ import { TestBed } from '@angular/core/testing'; import { DaffNavigationTree } from '@daffodil/navigation'; -import { CategoryNode } from '@daffodil/navigation/driver/magento'; +import { + CategoryNode, + magentoProvideNavigationTreeTransforms, +} from '@daffodil/navigation/driver/magento'; import { DaffMagentoNavigationTransformerService } from './navigation-transformer'; -describe('Driver | Magento | Navigation | Transformers | DaffMagentoNavigationTransformerService', () => { +describe('@daffodil/navigation/driver/magento | DaffMagentoNavigationTransformerService', () => { let service: DaffMagentoNavigationTransformerService; let categoryNode: CategoryNode; let expectedNavigation: DaffNavigationTree; @@ -14,6 +17,10 @@ describe('Driver | Magento | Navigation | Transformers | DaffMagentoNavigationTr TestBed.configureTestingModule({ providers: [ DaffMagentoNavigationTransformerService, + magentoProvideNavigationTreeTransforms((daffTree, magentoTree) => ({ + ...daffTree, + id: magentoTree.name === 'Root Category' ? 'injectedTransformId' : daffTree.id, + })), ], }); service = TestBed.inject(DaffMagentoNavigationTransformerService); @@ -82,7 +89,7 @@ describe('Driver | Magento | Navigation | Transformers | DaffMagentoNavigationTr }; expectedNavigation = { - id: '1', + id: 'injectedTransformId', url: '/1.html', name: 'Root Category', total_products: 10, diff --git a/libs/navigation/driver/magento/src/transformers/navigation-transformer.ts b/libs/navigation/driver/magento/src/transformers/navigation-transformer.ts index 45d1b0bb78..ccba12604e 100644 --- a/libs/navigation/driver/magento/src/transformers/navigation-transformer.ts +++ b/libs/navigation/driver/magento/src/transformers/navigation-transformer.ts @@ -1,4 +1,7 @@ -import { Injectable } from '@angular/core'; +import { + Inject, + Injectable, +} from '@angular/core'; import { DaffNavigationBreadcrumb, @@ -10,28 +13,38 @@ import { CategoryNode, MagentoBreadcrumb, } from '../models/category-node'; +import { + MagentoNavigationTreeTransform, + MAGENTO_NAVIGATION_TREE_TRANSFORMS, +} from '../transforms/public_api'; @Injectable({ providedIn: 'root', }) export class DaffMagentoNavigationTransformerService implements DaffNavigationTransformerInterface { + constructor( + @Inject(MAGENTO_NAVIGATION_TREE_TRANSFORMS) private extraTransforms: Array, + ) {} transform(node: CategoryNode): DaffNavigationTree { const id = node.uid; - return { - id, - url: `/${node.url_path}${node.url_suffix}`, - name: node.name, - total_products: node.product_count, - children_count: node.children_count, - breadcrumbs: node.breadcrumbs - ?.map(breadcrumb => this.transformBreadcrumb(breadcrumb, node)) - .sort((a, b) => a.level - b.level) || - [], - children: node.children?.filter(child => child.include_in_menu) - .sort((a, b) => a.position - b.position) - .map(child => this.transform(child)) || [], - }; + return this.extraTransforms.reduce( + (daffTree, transform) => transform(daffTree, node), + { + id, + url: `/${node.url_path}${node.url_suffix}`, + name: node.name, + total_products: node.product_count, + children_count: node.children_count, + breadcrumbs: node.breadcrumbs + ?.map(breadcrumb => this.transformBreadcrumb(breadcrumb, node)) + .sort((a, b) => a.level - b.level) || + [], + children: node.children?.filter(child => child.include_in_menu) + .sort((a, b) => a.position - b.position) + .map(child => this.transform(child)) || [], + }, + ); } private transformBreadcrumb(breadcrumb: MagentoBreadcrumb, category: CategoryNode): DaffNavigationBreadcrumb { diff --git a/libs/navigation/driver/magento/src/transforms/public_api.ts b/libs/navigation/driver/magento/src/transforms/public_api.ts new file mode 100644 index 0000000000..452c6b52f9 --- /dev/null +++ b/libs/navigation/driver/magento/src/transforms/public_api.ts @@ -0,0 +1,2 @@ +export * from './token'; +export * from './type'; diff --git a/libs/navigation/driver/magento/src/transforms/token.ts b/libs/navigation/driver/magento/src/transforms/token.ts new file mode 100644 index 0000000000..aef98f9e9b --- /dev/null +++ b/libs/navigation/driver/magento/src/transforms/token.ts @@ -0,0 +1,27 @@ +// workaround https://github.com/graycoreio/daffodil/issues/1667 +import { createMultiInjectionToken } from '@daffodil/core'; +import { DaffNavigationTree } from '@daffodil/navigation'; + +import { MagentoNavigationTreeTransform } from './type'; + +export const { + /** + * A multi-provider injection token for providing navigation tree transform logic in the Magento driver. + * It is run after the standard transforms and passed both the current transformed Daffodil navigation and the Magento navigation. + */ + token: MAGENTO_NAVIGATION_TREE_TRANSFORMS, + /** + * Provides navigation tree transforms for the Magento navigation driver. + * + * See {@link MAGENTO_NAVIGATION_TREE_TRANSFORMS}. + * + * ```ts + * providers: [ + * ...magentoProvideNavigationTreeTransforms( + * myNavigationTreeTransform + * ) + * ] + * ``` + */ + provider: magentoProvideNavigationTreeTransforms, +} = createMultiInjectionToken('MAGENTO_NAVIGATION_TREE_TRANSFORMS'); diff --git a/libs/navigation/driver/magento/src/transforms/type.ts b/libs/navigation/driver/magento/src/transforms/type.ts new file mode 100644 index 0000000000..b8025c3b9f --- /dev/null +++ b/libs/navigation/driver/magento/src/transforms/type.ts @@ -0,0 +1,9 @@ +import { DaffNavigationTree } from '@daffodil/navigation'; + +import { CategoryNode } from '../models/public_api'; + +/** + * A transform for the Magento driver that can add extra fields or otherwise modify the navigation driver response. + */ +export type MagentoNavigationTreeTransform = + (daffTree: DaffNavigationTree, magentoCategoryNode: T) => V;