Skip to content

Commit 80479fb

Browse files
authored
Merge pull request #74 from Relewise/feat/product-search-constraints
Feat: implements product search constraints
2 parents 63f536b + c526467 commit 80479fb

File tree

5 files changed

+56
-3
lines changed

5 files changed

+56
-3
lines changed

packages/client/src/builders/search/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ export * from './searchTermPredictionBuilder';
1313
export * from './dataObjectValueSelectorBuilder';
1414
export * from './getProductFacet';
1515
export * from './getContentFacet';
16-
export * from './getProductCategoryFacet';
16+
export * from './getProductCategoryFacet';
17+
export * from './searchConstraintBuilder';

packages/client/src/builders/search/productSearchBuilder.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
import { ProductSearchRequest, ProductSearchSettings, RecommendationSettings, RetailMediaQuery, SelectedBrandPropertiesSettings, SelectedProductPropertiesSettings, SelectedVariantPropertiesSettings, VariantSearchSettings } from '../../models/data-contracts';
1+
import { ProductSearchRequest, ProductSearchSettings, RecommendationSettings, ResultMustHaveVariantConstraint, RetailMediaQuery, SelectedBrandPropertiesSettings, SelectedProductPropertiesSettings, SelectedVariantPropertiesSettings, VariantSearchSettings } from '../../models/data-contracts';
22
import { PaginationBuilder } from '../paginationBuilder';
33
import { Settings } from '../settings';
44
import { FacetBuilder } from './facetBuilder';
55
import { ProductSortingBuilder } from './productSortingBuilder';
66
import { SearchBuilder } from './searchBuilder';
7+
import { SearchConstraintBuilder } from './searchConstraintBuilder';
78
import { SearchRequestBuilder } from './searchRequestBuilder';
89

910
export class ProductSearchBuilder extends SearchRequestBuilder implements SearchBuilder {
1011
private facetBuilder: FacetBuilder = new FacetBuilder();
1112
private retailMediaQuery: RetailMediaQuery | null = null;
1213
private paginationBuilder: PaginationBuilder = new PaginationBuilder();
1314
private sortingBuilder: ProductSortingBuilder = new ProductSortingBuilder();
15+
private searchConstraintBuilder: SearchConstraintBuilder = new SearchConstraintBuilder();
1416
private term: string | null | undefined;
1517

1618
private searchSettings: ProductSearchSettings = {
@@ -104,6 +106,14 @@ export class ProductSearchBuilder extends SearchRequestBuilder implements Search
104106
return this;
105107
}
106108

109+
public searchConstraints(searchConstraintbuilder: (searchConstraintBuilder: SearchConstraintBuilder) => void): this {
110+
searchConstraintbuilder(this.searchConstraintBuilder);
111+
112+
this.searchSettings.resultConstraint = this.searchConstraintBuilder.build();
113+
114+
return this;
115+
}
116+
107117
public build(): ProductSearchRequest {
108118
const { take, skip } = this.paginationBuilder.build();
109119
return {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ProductSearchResultConstraint, ResultMustHaveVariantConstraint } from '../../models/data-contracts';
2+
3+
export class SearchConstraintBuilder {
4+
private resultConstraint: ProductSearchResultConstraint | null = null;
5+
6+
public setResultMustHaveVariantConstraint(constaint: { exceptWhenProductHasNoVariants: boolean }): this {
7+
const constraint: ResultMustHaveVariantConstraint = {
8+
$type: 'Relewise.Client.Requests.Search.Settings.ResultMustHaveVariantConstraint, Relewise.Client',
9+
...constaint,
10+
};
11+
12+
this.resultConstraint = constraint;
13+
return this;
14+
}
15+
16+
build(): ResultMustHaveVariantConstraint | null {
17+
// Do to how the data contracts are generated, resultsConstraints on searchSettings expect this specific type
18+
// Once more types are added it will expect the generic type and this cast should be removed and the generic type should be returned
19+
return this.resultConstraint as ResultMustHaveVariantConstraint | null;
20+
}
21+
}

packages/client/tests/integration-tests/productSearch.integration.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,15 @@ test('Facet result', async() => {
8282
}
8383

8484
expect(result?.hits).toBeGreaterThan(0);
85-
});
85+
});
86+
87+
test('ProductSearch with search constraint', async() => {
88+
89+
const request: ProductSearchRequest = baseProductBuilder()
90+
.searchConstraints(constraints => constraints.setResultMustHaveVariantConstraint({ exceptWhenProductHasNoVariants: true }))
91+
.build();
92+
93+
const result = await searcher.searchProducts(request);
94+
95+
expect(result?.hits).toBeGreaterThan(0);
96+
});

packages/client/tests/unit-tests/builders/search/productSearchBuilder.unit.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,14 @@ test('variantSearchSettings', () => {
9494
.build();
9595

9696
expect(subject.settings?.variantSettings?.excludeResultsWithoutVariant).toBe(true);
97+
});
98+
99+
test('resultMustHaveVariantConstraint', () => {
100+
const subject: ProductSearchRequest = baseBuilder()
101+
.searchConstraints(s => s.setResultMustHaveVariantConstraint({
102+
exceptWhenProductHasNoVariants: true,
103+
}))
104+
.build();
105+
106+
expect(subject.settings?.resultConstraint?.exceptWhenProductHasNoVariants).toBe(true);
97107
});

0 commit comments

Comments
 (0)