Skip to content

Commit 05f7015

Browse files
committed
Add ProductInCartFilter
1 parent 9097e3c commit 05f7015

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

packages/client/src/builders/filterBuilder.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,17 @@ export class FilterBuilder {
877877
return this;
878878
}
879879

880+
/**
881+
* Adds a filter to only return products in the user's cart.
882+
* @param negated - If true, negates the filter (default is false).
883+
* @param options - Optional settings for the filter.
884+
* @returns The ProductFilterBuilder instance for chaining.
885+
*/
886+
public addProductInCartFilter(negated: boolean = false, options?: FilterOptions): this {
887+
this.productFilterBuilder.addProductInCartFilter(negated, options);
888+
return this;
889+
}
890+
880891
/**
881892
* Resets all filters and filter builders.
882893
* @returns The FilterBuilder instance for chaining.

packages/client/src/builders/filters/productFilterBuilder.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ProductAndVariantIdFilter, ProductAssortmentFilter, ProductCategoryAssortmentFilter, ProductCategoryHasAncestorFilter, ProductCategoryHasChildFilter, ProductCategoryHasParentFilter, ProductCategoryHasProductsFilter, ProductCategoryIdFilter, ProductCategoryLevelFilter, ProductDataFilter, ProductDisplayNameFilter, ProductHasVariantsFilter, ProductIdFilter, ProductListPriceFilter, ProductRecentlyPurchasedByUserFilter, ProductRecentlyViewedByUserFilter, ProductSalesPriceFilter, ProductAndVariantId, ProductCategoryDataFilter, ProductCategoryDataHasKeyFilter, ProductCategoryDisabledFilter, ProductCategoryRecentlyViewedByUserFilter, ProductDataHasKeyFilter, ProductDisabledFilter, ProductHasCategoriesFilter, ProductRecentlyPurchasedByCompanyFilter, ProductRecentlyPurchasedByUserCompanyFilter, ProductRecentlyPurchasedByUserParentCompanyFilter, ProductRecentlyViewedByCompanyFilter, ProductRecentlyViewedByUserCompanyFilter, ProductRecentlyViewedByUserParentCompanyFilter } from '../../models/data-contracts';
1+
import { ProductAndVariantIdFilter, ProductAssortmentFilter, ProductCategoryAssortmentFilter, ProductCategoryHasAncestorFilter, ProductCategoryHasChildFilter, ProductCategoryHasParentFilter, ProductCategoryHasProductsFilter, ProductCategoryIdFilter, ProductCategoryLevelFilter, ProductDataFilter, ProductDisplayNameFilter, ProductHasVariantsFilter, ProductIdFilter, ProductListPriceFilter, ProductRecentlyPurchasedByUserFilter, ProductRecentlyViewedByUserFilter, ProductSalesPriceFilter, ProductAndVariantId, ProductCategoryDataFilter, ProductCategoryDataHasKeyFilter, ProductCategoryDisabledFilter, ProductCategoryRecentlyViewedByUserFilter, ProductDataHasKeyFilter, ProductDisabledFilter, ProductHasCategoriesFilter, ProductRecentlyPurchasedByCompanyFilter, ProductRecentlyPurchasedByUserCompanyFilter, ProductRecentlyPurchasedByUserParentCompanyFilter, ProductRecentlyViewedByCompanyFilter, ProductRecentlyViewedByUserCompanyFilter, ProductRecentlyViewedByUserParentCompanyFilter, ProductInCartFilter } from '../../models/data-contracts';
22
import { ConditionBuilder } from '../conditionBuilder';
33
import { EntityDataFilterOptions, FilterOptions } from './filters.types.shared';
44
import { FilterSettingsBuilder } from '../filterSettingsBuilder';
@@ -727,4 +727,25 @@ export class ProductFilterBuilder extends FilterBuilderBase<ProductFilterBuilder
727727

728728
return this;
729729
}
730+
731+
/**
732+
* Adds a filter to only return products in the user's cart.
733+
* @param negated - If true, negates the filter (default is false).
734+
* @param options - Optional settings for the filter.
735+
* @returns The ProductFilterBuilder instance for chaining.
736+
*/
737+
public addProductInCartFilter(negated: boolean = false, options?: FilterOptions): this {
738+
const internalSettingsBuilder = new FilterSettingsBuilder();
739+
options?.filterSettings?.(internalSettingsBuilder);
740+
741+
const filter: ProductInCartFilter = {
742+
$type: 'Relewise.Client.Requests.Filters.ProductInCartFilter, Relewise.Client',
743+
negated: negated,
744+
settings: internalSettingsBuilder.build(),
745+
};
746+
747+
this.filters.push(filter);
748+
749+
return this;
750+
}
730751
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { randomUUID } from 'crypto';
12
import { DataValueFactory, PopularProductsBuilder, ProductRecommendationResponse, ProductsViewedAfterViewingProductBuilder, PurchasedWithProductBuilder, Recommender, UserFactory } from '../../src';
23
import { test, expect } from '@jest/globals'
34

@@ -59,6 +60,28 @@ test('ProductsViewedAfterViewingProduct with all conditions', async() => {
5960

6061
const result: ProductRecommendationResponse | undefined = await recommender.recommendPopularProducts(recommendationBuilder.build());
6162

63+
expect(result).not.toBe(undefined);
64+
expect(result!.recommendations?.length).toBeGreaterThan(0);
65+
});
66+
67+
test('Filter on products in cart', async() => {
68+
settings.user = UserFactory.byTemporaryId(randomUUID());
69+
const recommendationBuilder = new PopularProductsBuilder(settings)
70+
.filters(f => f.addProductInCartFilter());
71+
72+
const result: ProductRecommendationResponse | undefined = await recommender.recommendPopularProducts(recommendationBuilder.build());
73+
74+
expect(result).not.toBe(undefined);
75+
expect(result!.recommendations?.length).toEqual(0);
76+
});
77+
78+
test('Filter on products in cart negated', async() => {
79+
settings.user = UserFactory.byTemporaryId(randomUUID());
80+
const recommendationBuilder = new PopularProductsBuilder(settings)
81+
.filters(f => f.addProductInCartFilter(true));
82+
83+
const result: ProductRecommendationResponse | undefined = await recommender.recommendPopularProducts(recommendationBuilder.build());
84+
6285
expect(result).not.toBe(undefined);
6386
expect(result!.recommendations?.length).toBeGreaterThan(0);
6487
});

0 commit comments

Comments
 (0)