Skip to content

Commit

Permalink
feat(search*)!: remove collection metadata request from incremental s…
Browse files Browse the repository at this point in the history
…earch (#2494)

BREAKING CHANGE: changes `DaffSearchDriverInterface#incremental` to return a `DaffSearchResultCollection`. changes `DaffSearchIncrementalSuccess#payload` to be a `DaffSearchResultCollection`
  • Loading branch information
griest024 committed Jul 5, 2023
1 parent 33c3c9b commit 56f37a4
Show file tree
Hide file tree
Showing 27 changed files with 161 additions and 133 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ describe('@daffodil/search-category/driver/magento | DaffSearchCategoryMagentoDr
describe('when the call to the Magento API is successful', () => {
it('should return a collection of category search results', done => {
service.incremental('query').subscribe(result => {
expect(result.collection[DAFF_SEARCH_CATEGORY_RESULT_KIND][0].id).toEqual(mockCategory.uid);
expect(result[DAFF_SEARCH_CATEGORY_RESULT_KIND][0].id).toEqual(mockCategory.uid);
done();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import {
} from 'rxjs/operators';

import { DaffMagentoCategoryTransformerService } from '@daffodil/category/driver/magento';
import { daffSearchTransformResultsToCollection } from '@daffodil/search';
import {
DaffSearchResultCollection,
daffSearchTransformResultsToCollection,
} from '@daffodil/search';
import {
DaffSearchCategoryResult,
daffTransformCategoriesToSearchResults,
Expand Down Expand Up @@ -61,7 +64,9 @@ export class DaffSearchCategoryMagentoDriver implements DaffSearchCategoryDriver
);
}

incremental(query: string, options: DaffSearchDriverOptions = {}): Observable<DaffSearchDriverResponse<DaffSearchCategoryResult>> {
return this.search(query, options);
incremental(query: string, options: DaffSearchDriverOptions = {}): Observable<DaffSearchResultCollection<DaffSearchCategoryResult>> {
return this.search(query, options).pipe(
map(({ collection }) => collection),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,7 @@ export function daffSearchProductCompositeEnsureItemsMetaReducer(reducer: Reduce
case DaffSearchActionTypes.SearchIncrementalSuccessAction:
return reducer(state, new DaffSearchIncrementalSuccess({
...action.payload,
collection: {
...action.payload.collection,
[DAFF_SEARCH_PRODUCT_RESULT_KIND]: daffProductCompositeEnsureItems<DaffSearchProductCompositeResult>(state, action.payload.collection[DAFF_SEARCH_PRODUCT_RESULT_KIND] || []),
},
[DAFF_SEARCH_PRODUCT_RESULT_KIND]: daffProductCompositeEnsureItems<DaffSearchProductCompositeResult>(state, action.payload[DAFF_SEARCH_PRODUCT_RESULT_KIND] || []),
}));

default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,7 @@ export function daffSearchProductConfigurableEnsureChildrenMetaReducer(reducer:
case DaffSearchActionTypes.SearchIncrementalSuccessAction:
return reducer(state, new DaffSearchIncrementalSuccess({
...action.payload,
collection: {
...action.payload.collection,
[DAFF_SEARCH_PRODUCT_RESULT_KIND]: daffProductConfigurableEnsureChildren<DaffSearchProductConfigurableResult>(state, action.payload.collection[DAFF_SEARCH_PRODUCT_RESULT_KIND] || []),
},
[DAFF_SEARCH_PRODUCT_RESULT_KIND]: daffProductConfigurableEnsureChildren<DaffSearchProductConfigurableResult>(state, action.payload[DAFF_SEARCH_PRODUCT_RESULT_KIND] || []),
}));

default:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { MagentoProduct } from '@daffodil/product/driver/magento';

export interface MagentoSearchProductIncrementalResponse {
__typename?: string;
products: {
__typename?: string;
items: MagentoProduct[];
total_count: number;
};
}
3 changes: 2 additions & 1 deletion libs/search-product/driver/magento/src/models/public_api.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export { MagentoSearchForProductsResponse } from './get-product-response.interface';
export { MagentoSearchForProductsResponse } from './search-response.interface';
export { MagentoSearchProductIncrementalResponse } from './incremental-response.interface';
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ import {
MagentoSimpleProductFactory,
} from '@daffodil/product/driver/magento/testing';
import { DAFF_SEARCH_PRODUCT_RESULT_KIND } from '@daffodil/search-product';
import { MagentoSearchForProductsResponse } from '@daffodil/search-product/driver/magento';
import {
MagentoSearchForProductsResponse,
daffSearchProductIncrementalQuery,
} from '@daffodil/search-product/driver/magento';

import { DaffSearchProductMagentoDriver } from './product-search.service';
import { productSearch } from './queries/product-search';
Expand Down Expand Up @@ -182,20 +185,15 @@ describe('@daffodil/search-product/driver/magento | DaffSearchProductMagentoDriv
describe('when the call to the Magento API is successful', () => {
it('should return a collection of product search results', done => {
service.incremental('query').subscribe(result => {
expect(result.collection[DAFF_SEARCH_PRODUCT_RESULT_KIND][0].id).toEqual(mockSimpleProduct.sku);
expect((<DaffCollectionMetadata>result.metadata).count).toEqual(mockSearchProductsResponse.products.total_count);
expect(result[DAFF_SEARCH_PRODUCT_RESULT_KIND][0].id).toEqual(mockSimpleProduct.sku);
done();
});

const searchOp = controller.expectOne(addTypenameToDocument(productSearch()));
const filterOp = controller.expectOne(addTypenameToDocument(MagentoProductGetFilterTypes));
const searchOp = controller.expectOne(addTypenameToDocument(daffSearchProductIncrementalQuery()));

searchOp.flush({
data: mockSearchProductsResponse,
});
filterOp.flush({
data: mockGetFilterTypesResponse,
});
});
});

Expand All @@ -209,7 +207,7 @@ describe('@daffodil/search-product/driver/magento | DaffSearchProductMagentoDriv
}),
).subscribe();

const op = controller.expectOne(addTypenameToDocument(productSearch()));
const op = controller.expectOne(addTypenameToDocument(daffSearchProductIncrementalQuery()));

op.graphqlErrors([new GraphQLError(
'Can\'t find any products matching that query.',
Expand Down
73 changes: 24 additions & 49 deletions libs/search-product/driver/magento/src/product-search.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,31 @@ import {
DAFF_PRODUCT_MAGENTO_PRODUCT_TRANSFORM,
DaffMagentoProductTransform,
} from '@daffodil/product/driver/magento';
import { daffSearchTransformResultsToCollection } from '@daffodil/search';
import {
DaffSearchResultCollection,
daffSearchTransformResultsToCollection,
} from '@daffodil/search';
import {
daffTransformProductsToSearchResults,
DAFF_SEARCH_PRODUCT_RESULT_KIND,
DaffSearchProductResult,
} from '@daffodil/search-product';
import {
DaffSearchProductDriverInterface,
DaffSearchProductDriverOptions,
DaffSearchProductDriverResponse,
} from '@daffodil/search-product/driver';
import { DaffSearchDriverOptions } from '@daffodil/search/driver';

import { transformSearchProductMagentoError } from './errors/transform';
import { MagentoSearchForProductsResponse } from './models/get-product-response.interface';
import { productSearch } from './queries/product-search';
import {
MagentoSearchForProductsResponse,
MagentoSearchProductIncrementalResponse,
} from './models/public_api';
import {
daffSearchProductIncrementalQuery,
productSearch,
} from './queries/public_api';

/**
* A service for searching products in Magento.
Expand Down Expand Up @@ -135,52 +146,16 @@ export class DaffSearchProductMagentoDriver implements DaffSearchProductDriverIn
);
}

incremental(query: string, options: DaffSearchProductDriverOptions = {}): Observable<DaffSearchProductDriverResponse> {
const queryVariables = this.getVariables(options);

return combineLatest([
this.apollo.query<MagentoSearchForProductsResponse>({
query: productSearch(this.extraPreviewFragments),
variables: {
...queryVariables,
search: query,
},
}),
this.apollo.query<MagentoProductGetFilterTypesResponse>({
query: MagentoProductGetFilterTypes,
}),
]).pipe(
map(([products, filters]) => ({
products: products.data.products.items,
filters: magentoProductAddMetadataTypesToAggregates(
filters.data.__type.inputFields,
products.data.products.aggregations,
),
sortFields: products.data.products.sort_fields,
pageInfo: products.data.products.page_info,
count: products.data.products.total_count,
})),
map(({ products, filters, sortFields, pageInfo, count }) => ({
products: daffSearchTransformResultsToCollection(daffTransformProductsToSearchResults(
this.magentoProductsTransformers.transformManyMagentoProducts(products, this.config.baseMediaUrl),
)),
metadata: magentoProductCollectionMetadataTransform(
filters,
pageInfo,
sortFields,
products,
count,
options.appliedSortOption,
options.appliedSortDirection,
),
})),
map(({ products, metadata }) => ({
collection: products,
metadata: {
...metadata,
filters: daffApplyRequestsToFilters(options.filterRequests || [], metadata.filters),
},
})),
incremental(query: string, options: DaffSearchDriverOptions = {}): Observable<DaffSearchResultCollection<DaffSearchProductResult>> {
return this.apollo.query<MagentoSearchProductIncrementalResponse>({
query: daffSearchProductIncrementalQuery(this.extraPreviewFragments),
variables: {
search: query,
},
}).pipe(
map(({ data }) => daffSearchTransformResultsToCollection(daffTransformProductsToSearchResults(
this.magentoProductsTransformers.transformManyMagentoProducts(data.products.items, this.config.baseMediaUrl),
))),
catchError(err => throwError(() => transformSearchProductMagentoError(err))),
);
}
Expand Down
1 change: 1 addition & 0 deletions libs/search-product/driver/magento/src/public_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ export { DaffSearchProductMagentoFederatedDriverModule } from './federated-drive
export type { DaffSearchProductMagentoCoreModule } from './core.module';

export * from './models/public_api';
export * from './queries/public_api';
export * from './product-search.service';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './product-result';
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { gql } from 'apollo-angular';
import { DocumentNode } from 'graphql';

import {
daffBuildFragmentNameSpread,
daffBuildFragmentDefinition,
} from '@daffodil/core/graphql';
import { magentoProductFragment } from '@daffodil/product/driver/magento';

export const DAFF_SEARCH_PRODUCT_MAGENTO_INCREMENTAL_QUERY_NAME = 'MagentoIncrementalSearchForProducts';

export const daffSearchProductIncrementalQuery = (extraProductFragments: DocumentNode[] = []) => gql`
query ${DAFF_SEARCH_PRODUCT_MAGENTO_INCREMENTAL_QUERY_NAME}(
$search: String,
$pageSize: Int,
) {
products(search: $search, pageSize: $pageSize) {
items {
...product
${daffBuildFragmentNameSpread(...extraProductFragments)}
}
total_count
}
}
${magentoProductFragment}
${daffBuildFragmentDefinition(...extraProductFragments)}
`;
3 changes: 3 additions & 0 deletions libs/search-product/driver/magento/src/queries/public_api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './product-incremental';
export * from './product-search';
export * from './fragments/public_api';
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { Observable } from 'rxjs';

import { DaffSearchResultCollection } from '@daffodil/search';
import {
DaffSearchProductResult,
DAFF_SEARCH_PRODUCT_RESULT_KIND,
} from '@daffodil/search-product';
import { DaffSearchDriverKindedInterface } from '@daffodil/search/driver';
import {
DaffSearchDriverKindedInterface,
DaffSearchDriverOptions,
} from '@daffodil/search/driver';

import { DaffSearchProductDriverOptions } from './options.interface';
import { DaffSearchProductDriverResponse } from './response.interface';
Expand All @@ -20,5 +24,5 @@ export interface DaffSearchProductDriverInterface<
readonly kind: typeof DAFF_SEARCH_PRODUCT_RESULT_KIND;

search(query: string, options?: DaffSearchProductDriverOptions): Observable<DaffSearchProductDriverResponse<T>>;
incremental(query: string, options?: DaffSearchProductDriverOptions): Observable<DaffSearchProductDriverResponse<T>>;
incremental(query: string, options?: DaffSearchDriverOptions): Observable<DaffSearchResultCollection<T>>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import {
} from '@daffodil/search';
import { DaffSearchProductResult } from '@daffodil/search-product';
import { DaffSearchProductResultFactory } from '@daffodil/search-product/testing';
import { DaffSearchLoadSuccess } from '@daffodil/search/state';
import {
DaffSearchIncrementalSuccess,
DaffSearchLoadSuccess,
} from '@daffodil/search/state';

import { daffSearchProductEntitiesReducer as reducer } from './entities.reducer';

Expand Down Expand Up @@ -44,7 +47,7 @@ describe('@daffodil/search-product-product/state | daffSearchProductEntitiesRedu
});

describe('when SearchLoadSuccessAction is triggered', () => {
let result;
let result: EntityState<DaffSearchProductResult>;

beforeEach(() => {
const searchResultLoadSuccess = new DaffSearchLoadSuccess({
Expand All @@ -59,4 +62,18 @@ describe('@daffodil/search-product-product/state | daffSearchProductEntitiesRedu
expect(result.entities[searchResultId]).toEqual(search);
});
});

describe('when SearchIncrementalSuccessAction is triggered', () => {
let result: EntityState<DaffSearchProductResult>;

beforeEach(() => {
const searchResultIncrementalSuccess = new DaffSearchIncrementalSuccess(daffSearchTransformResultsToCollection([search]));

result = reducer(initialState, searchResultIncrementalSuccess);
});

it('should set search from action.payload', () => {
expect(result.entities[searchResultId]).toEqual(search);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,17 @@ export function daffSearchProductEntitiesReducer<T extends DaffSearchProductResu

switch (action.type) {
case DaffSearchActionTypes.SearchLoadSuccessAction:
case DaffSearchActionTypes.SearchIncrementalSuccessAction:
return adapter.upsertMany(
action.payload.collection[DAFF_SEARCH_PRODUCT_RESULT_KIND] || [],
state,
);

case DaffSearchActionTypes.SearchIncrementalSuccessAction:
return adapter.upsertMany(
action.payload[DAFF_SEARCH_PRODUCT_RESULT_KIND] || [],
state,
);

default:
return state;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@ class TestDriver1 implements DaffSearchDriverKindedInterface {
});
}
incremental(query: string) {
return of({
collection: {},
metadata: {},
});
return of({});
}
}

Expand All @@ -43,10 +40,7 @@ class TestDriver2 implements DaffSearchDriverKindedInterface {
});
}
incremental(query: string) {
return of({
collection: {},
metadata: {},
});
return of({});
}
}

Expand Down
Loading

0 comments on commit 56f37a4

Please sign in to comment.