diff --git a/.changeset/nine-owls-cheer.md b/.changeset/nine-owls-cheer.md new file mode 100644 index 0000000000..fab968eac4 --- /dev/null +++ b/.changeset/nine-owls-cheer.md @@ -0,0 +1,6 @@ +--- +"@medusajs/index": patch +"@medusajs/medusa": patch +--- + +chore: transform filter before query.index diff --git a/packages/medusa/src/api/admin/products/route.ts b/packages/medusa/src/api/admin/products/route.ts index 383850f60d..034fbddb59 100644 --- a/packages/medusa/src/api/admin/products/route.ts +++ b/packages/medusa/src/api/admin/products/route.ts @@ -1,23 +1,25 @@ import { createProductsWorkflow } from "@medusajs/core-flows" -import { AdditionalData, HttpTypes } from "@medusajs/framework/types" +import { featureFlagRouter } from "@medusajs/framework" import { AuthenticatedMedusaRequest, MedusaResponse, refetchEntities, refetchEntity, } from "@medusajs/framework/http" -import { remapKeysForProduct, remapProductResponse } from "./helpers" -import IndexEngineFeatureFlag from "../../../loaders/feature-flags/index-engine" -import { featureFlagRouter } from "@medusajs/framework" +import { AdditionalData, HttpTypes } from "@medusajs/framework/types" import { ContainerRegistrationKeys, isPresent } from "@medusajs/framework/utils" +import IndexEngineFeatureFlag from "../../../loaders/feature-flags/index-engine" +import { remapKeysForProduct, remapProductResponse } from "./helpers" export const GET = async ( req: AuthenticatedMedusaRequest, res: MedusaResponse ) => { if (featureFlagRouter.isFeatureEnabled(IndexEngineFeatureFlag.key)) { - // TODO: These filters are not supported by the index engine yet + // Use regular list when no filters are provided + // TODO: Tags and categories are not supported by the index engine yet if ( + Object.keys(req.filterableFields).length === 0 || isPresent(req.filterableFields.tags) || isPresent(req.filterableFields.categories) ) { @@ -58,10 +60,20 @@ async function getProductsWithIndexEngine( ) { const query = req.scope.resolve(ContainerRegistrationKeys.QUERY) + const filters: Record = req.filterableFields + if (isPresent(filters.sales_channel_id)) { + const salesChannelIds = filters.sales_channel_id + + filters["sales_channels"] ??= {} + filters["sales_channels"]["id"] = salesChannelIds + + delete filters.sales_channel_id + } + const { data: products, metadata } = await query.index({ entity: "product", fields: req.queryConfig.fields ?? [], - filters: req.filterableFields, + filters: filters, pagination: req.queryConfig.pagination, }) diff --git a/packages/modules/index/src/utils/query-builder.ts b/packages/modules/index/src/utils/query-builder.ts index 28f0c1b788..20271d4d51 100644 --- a/packages/modules/index/src/utils/query-builder.ts +++ b/packages/modules/index/src/utils/query-builder.ts @@ -1,6 +1,7 @@ import { IndexTypes } from "@medusajs/framework/types" import { GraphQLUtils, + isDefined, isObject, isPresent, isString, @@ -276,13 +277,17 @@ export class QueryBuilder { value = this.transformValueToType(attr, field, value) if (Array.isArray(value)) { + if (value.length === 0) { + return + } + const castType = this.getPostgresCastType(attr, field).cast const inPlaceholders = value.map(() => "?").join(",") builder.whereRaw( `(${aliasMapping[attr]}.data${nested}->>?)${castType} IN (${inPlaceholders})`, [...field, ...value] ) - } else { + } else if (isDefined(value)) { const operator = value === null ? "IS" : "=" if (operator === "=") {