chore(framework): slightly improve maybe apply link filter middleware (#12113)

**What**
- Use the resource id filtering when possible instead of relying on programmatic intersection checks over potential hundreds thousands of resources from the link when in fact it is not necessary to fetch everything to check in memory but instead check in the db 
- Also fix normalizeDataForContext middlewares
This commit is contained in:
Adrien de Peretti
2025-04-09 06:03:10 +02:00
committed by GitHub
parent 74381addc3
commit 2a18a75353
3 changed files with 30 additions and 27 deletions
@@ -1,8 +1,4 @@
import {
arrayIntersection,
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import { ContainerRegistrationKeys } from "@medusajs/utils"
import type {
MedusaNextFunction,
MedusaRequest,
@@ -34,35 +30,29 @@ export function maybeApplyLinkFilter({
delete filterableFields[filterableField]
const remoteQuery = req.scope.resolve(
ContainerRegistrationKeys.REMOTE_QUERY
)
const queryObject = remoteQueryObjectFromString({
entryPoint,
fields: [resourceId],
variables: { filters: { [filterableField]: idsToFilterBy } },
})
const resources = await remoteQuery(queryObject)
let existingFilters = filterableFields[filterByField] as
| string[]
| string
| undefined
if (existingFilters) {
if (typeof existingFilters === "string") {
existingFilters = [existingFilters]
}
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
filterableFields[filterByField] = arrayIntersection(
existingFilters,
resources.map((p) => p[resourceId])
)
} else {
filterableFields[filterByField] = resources.map((p) => p[resourceId])
const filters: Record<string, unknown> = {
[filterableField]: idsToFilterBy,
}
if (existingFilters) {
filters[resourceId] = existingFilters
}
const { data: resources } = await query.graph({
entity: entryPoint,
fields: [resourceId],
filters,
})
filterableFields[filterByField] = resources.map((p) => p[resourceId])
req.filterableFields = transformFilterableFields(filterableFields)
return next()