Browse Source

feat(core): Add SKU filtering to `products` list in Admin API

Relates to #2519
Michael Bromley 2 years ago
parent
commit
876d1ece80

+ 1 - 0
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -4529,6 +4529,7 @@ export type ProductFilterParameter = {
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;
+  sku?: InputMaybe<StringOperators>;
   slug?: InputMaybe<StringOperators>;
   updatedAt?: InputMaybe<DateOperators>;
 };

+ 1 - 0
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -4344,6 +4344,7 @@ export type ProductFilterParameter = {
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;
+  sku?: InputMaybe<StringOperators>;
   slug?: InputMaybe<StringOperators>;
   updatedAt?: InputMaybe<DateOperators>;
 };

+ 1 - 0
packages/common/src/generated-shop-types.ts

@@ -2559,6 +2559,7 @@ export type ProductVariantListArgs = {
 export type ProductFilterParameter = {
   createdAt?: InputMaybe<DateOperators>;
   description?: InputMaybe<StringOperators>;
+  enabled?: InputMaybe<BooleanOperators>;
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;

+ 1 - 0
packages/common/src/generated-types.ts

@@ -4454,6 +4454,7 @@ export type ProductFilterParameter = {
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;
+  sku?: InputMaybe<StringOperators>;
   slug?: InputMaybe<StringOperators>;
   updatedAt?: InputMaybe<DateOperators>;
 };

+ 1 - 0
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -4344,6 +4344,7 @@ export type ProductFilterParameter = {
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;
+  sku?: InputMaybe<StringOperators>;
   slug?: InputMaybe<StringOperators>;
   updatedAt?: InputMaybe<DateOperators>;
 };

+ 2 - 0
packages/core/e2e/graphql/generated-e2e-shop-types.ts

@@ -2454,6 +2454,7 @@ export type Product = Node & {
   createdAt: Scalars['DateTime']['output'];
   customFields?: Maybe<Scalars['JSON']['output']>;
   description: Scalars['String']['output'];
+  enabled: Scalars['Boolean']['output'];
   facetValues: Array<FacetValue>;
   featuredAsset?: Maybe<Asset>;
   id: Scalars['ID']['output'];
@@ -2477,6 +2478,7 @@ export type ProductVariantListArgs = {
 export type ProductFilterParameter = {
   createdAt?: InputMaybe<DateOperators>;
   description?: InputMaybe<StringOperators>;
+  enabled?: InputMaybe<BooleanOperators>;
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;

+ 18 - 0
packages/core/e2e/product.e2e-spec.ts

@@ -182,6 +182,24 @@ describe('Product resolver', () => {
             expect(result.products.items[0].name).toBe('Cruiser Skateboard');
         });
 
+        it('filters by sku admin', async () => {
+            const result = await adminClient.query<
+                Codegen.GetProductListQuery,
+                Codegen.GetProductListQueryVariables
+            >(GET_PRODUCT_LIST, {
+                options: {
+                    filter: {
+                        sku: {
+                            contains: 'IHD455T1',
+                        },
+                    },
+                },
+            });
+
+            expect(result.products.items.length).toBe(1);
+            expect(result.products.items[0].name).toBe('Hard Drive');
+        });
+
         it('sorts by name shop', async () => {
             const result = await shopClient.query<
                 Codegen.GetProductListQuery,

+ 1 - 0
packages/core/src/api/schema/admin-api/product.api.graphql

@@ -72,6 +72,7 @@ input ProductListOptions
 
 input ProductFilterParameter {
     facetValueId: IDOperators
+    sku: StringOperators
 }
 
 # generated by generateListOptions function

+ 5 - 0
packages/core/src/service/services/product.service.ts

@@ -77,10 +77,15 @@ export class ProductService {
         const effectiveRelations = relations || this.relations;
         const customPropertyMap: { [name: string]: string } = {};
         const hasFacetValueIdFilter = !!(options as ProductListOptions)?.filter?.facetValueId;
+        const hasSkuFilter = !!(options as ProductListOptions)?.filter?.sku;
         if (hasFacetValueIdFilter) {
             effectiveRelations.push('facetValues');
             customPropertyMap.facetValueId = 'facetValues.id';
         }
+        if (hasSkuFilter) {
+            effectiveRelations.push('variants');
+            customPropertyMap.sku = 'variants.sku';
+        }
         return this.listQueryBuilder
             .build(Product, options, {
                 relations: effectiveRelations,

+ 1 - 0
packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts

@@ -4344,6 +4344,7 @@ export type ProductFilterParameter = {
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;
+  sku?: InputMaybe<StringOperators>;
   slug?: InputMaybe<StringOperators>;
   updatedAt?: InputMaybe<DateOperators>;
 };

+ 1 - 0
packages/payments-plugin/e2e/graphql/generated-admin-types.ts

@@ -4344,6 +4344,7 @@ export type ProductFilterParameter = {
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;
+  sku?: InputMaybe<StringOperators>;
   slug?: InputMaybe<StringOperators>;
   updatedAt?: InputMaybe<DateOperators>;
 };

+ 2 - 0
packages/payments-plugin/e2e/graphql/generated-shop-types.ts

@@ -2454,6 +2454,7 @@ export type Product = Node & {
   createdAt: Scalars['DateTime']['output'];
   customFields?: Maybe<Scalars['JSON']['output']>;
   description: Scalars['String']['output'];
+  enabled: Scalars['Boolean']['output'];
   facetValues: Array<FacetValue>;
   featuredAsset?: Maybe<Asset>;
   id: Scalars['ID']['output'];
@@ -2477,6 +2478,7 @@ export type ProductVariantListArgs = {
 export type ProductFilterParameter = {
   createdAt?: InputMaybe<DateOperators>;
   description?: InputMaybe<StringOperators>;
+  enabled?: InputMaybe<BooleanOperators>;
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;

+ 2 - 0
packages/payments-plugin/src/mollie/graphql/generated-shop-types.ts

@@ -2592,6 +2592,7 @@ export type Product = Node & {
   createdAt: Scalars['DateTime']['output'];
   customFields?: Maybe<Scalars['JSON']['output']>;
   description: Scalars['String']['output'];
+  enabled: Scalars['Boolean']['output'];
   facetValues: Array<FacetValue>;
   featuredAsset?: Maybe<Asset>;
   id: Scalars['ID']['output'];
@@ -2615,6 +2616,7 @@ export type ProductVariantListArgs = {
 export type ProductFilterParameter = {
   createdAt?: InputMaybe<DateOperators>;
   description?: InputMaybe<StringOperators>;
+  enabled?: InputMaybe<BooleanOperators>;
   id?: InputMaybe<IdOperators>;
   languageCode?: InputMaybe<StringOperators>;
   name?: InputMaybe<StringOperators>;

File diff suppressed because it is too large
+ 0 - 0
schema-admin.json


File diff suppressed because it is too large
+ 0 - 0
schema-shop.json


Some files were not shown because too many files changed in this diff