Skip to content

Commit

Permalink
feat(navigation): add injectable transforms to magento driver (#2774)
Browse files Browse the repository at this point in the history
  • Loading branch information
griest024 committed Apr 20, 2024
1 parent 01db447 commit 60bd6db
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 18 deletions.
1 change: 1 addition & 0 deletions libs/navigation/driver/magento/src/public_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -82,7 +89,7 @@ describe('Driver | Magento | Navigation | Transformers | DaffMagentoNavigationTr
};

expectedNavigation = {
id: '1',
id: 'injectedTransformId',
url: '/1.html',
name: 'Root Category',
total_products: 10,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { Injectable } from '@angular/core';
import {
Inject,
Injectable,
} from '@angular/core';

import {
DaffNavigationBreadcrumb,
Expand All @@ -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<DaffNavigationTree> {
constructor(
@Inject(MAGENTO_NAVIGATION_TREE_TRANSFORMS) private extraTransforms: Array<MagentoNavigationTreeTransform>,
) {}

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 {
Expand Down
2 changes: 2 additions & 0 deletions libs/navigation/driver/magento/src/transforms/public_api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './token';
export * from './type';
27 changes: 27 additions & 0 deletions libs/navigation/driver/magento/src/transforms/token.ts
Original file line number Diff line number Diff line change
@@ -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<MagentoNavigationTreeTransform>('MAGENTO_NAVIGATION_TREE_TRANSFORMS');
9 changes: 9 additions & 0 deletions libs/navigation/driver/magento/src/transforms/type.ts
Original file line number Diff line number Diff line change
@@ -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<T extends CategoryNode = CategoryNode, V extends DaffNavigationTree = DaffNavigationTree> =
(daffTree: DaffNavigationTree, magentoCategoryNode: T) => V;

0 comments on commit 60bd6db

Please sign in to comment.