diff --git a/.changeset/gentle-baboons-camp.md b/.changeset/gentle-baboons-camp.md new file mode 100644 index 0000000000..20d233f3c4 --- /dev/null +++ b/.changeset/gentle-baboons-camp.md @@ -0,0 +1,5 @@ +--- +"@medusajs/framework": patch +--- + +Exclude nested fields when excluding field from endpoint diff --git a/integration-tests/http/__tests__/product/store/product.spec.ts b/integration-tests/http/__tests__/product/store/product.spec.ts index e845aa938e..0697ac67a7 100644 --- a/integration-tests/http/__tests__/product/store/product.spec.ts +++ b/integration-tests/http/__tests__/product/store/product.spec.ts @@ -1,6 +1,7 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IStoreModuleService } from "@medusajs/types" import { ApiKeyType, Modules, ProductStatus } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import qs from "qs" import { adminHeaders, createAdminUser, @@ -8,7 +9,6 @@ import { generateStoreHeaders, } from "../../../../helpers/create-admin-user" import { getProductFixture } from "../../../../helpers/fixtures" -import qs from "qs" jest.setTimeout(30000) @@ -589,6 +589,19 @@ medusaIntegrationTestRunner({ ]) }) + it("should list all products excluding variants", async () => { + let response = await api.get( + `/admin/products?fields=-variants`, + adminHeaders + ) + + expect(response.data.count).toEqual(4) + + for (let product of response.data.products) { + expect(product.variants).toBeUndefined() + } + }) + it("should list all products for a sales channel", async () => { const salesChannel = await createSalesChannel( { name: "sales channel test" }, diff --git a/packages/core/framework/src/http/utils/get-query-config.ts b/packages/core/framework/src/http/utils/get-query-config.ts index 5f690c12a8..c7ba208fb1 100644 --- a/packages/core/framework/src/http/utils/get-query-config.ts +++ b/packages/core/framework/src/http/utils/get-query-config.ts @@ -1,4 +1,3 @@ -import { pick } from "lodash" import { FindConfig, QueryConfig, RequestQueryFields } from "@medusajs/types" import { isDefined, @@ -6,6 +5,7 @@ import { MedusaError, stringToSelectRelationObject, } from "@medusajs/utils" +import { pick } from "lodash" export function pickByConfig( obj: TModel | TModel[], @@ -130,7 +130,16 @@ export function prepareListQuery( if (field.startsWith("+") || field.startsWith(" ")) { allFields.add(field.trim().replace(/^\+/, "")) } else if (field.startsWith("-")) { - allFields.delete(field.replace(/^-/, "")) + const fieldName = field.replace(/^-/, "") + for (const reqField of allFields) { + const reqFieldName = reqField.replace(/^\*/, "") + if ( + reqFieldName === fieldName || + reqFieldName.startsWith(fieldName + ".") + ) { + allFields.delete(reqField) + } + } } else { allFields.add(field) }