fix(medusa): Custom repository take/skip when called without relations (#2962)

**What**
The actual behavior is that the skip/take is applied in a first query returning the correct number of results. When there is no relations, we are calling findByIds with the previously retrieved ids, but we also pass skip/take which means that no result are returned after the first increment of the skip.

The skip/take should not be applied in that case as it has already been applied.

FIXES CORE-970
This commit is contained in:
Adrien de Peretti
2023-01-09 10:54:25 +01:00
committed by GitHub
parent b280e53bd3
commit e4af968531
4 changed files with 53 additions and 12 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
fix: Custom repository take/skip wrongly applied when there is no relations in the findWihtRelationAndCount

View File

@@ -114,10 +114,14 @@ export class CustomerGroupRepository extends Repository<CustomerGroup> {
}
if (relations.length === 0) {
const toReturn = await this.findByIds(
entitiesIds,
idsOrOptionsWithoutRelations
)
const options = { ...idsOrOptionsWithoutRelations }
// Since we are finding by the ids that have been retrieved above and those ids are already
// applying skip/take. Remove those options to avoid getting no results
delete options.skip
delete options.take
const toReturn = await this.findByIds(entitiesIds, options)
return [toReturn, toReturn.length]
}

View File

@@ -150,9 +150,18 @@ export class ProductVariantRepository extends Repository<ProductVariant> {
}
if (relations.length === 0) {
const options = { ...idsOrOptionsWithoutRelations }
// Since we are finding by the ids that have been retrieved above and those ids are already
// applying skip/take. Remove those options to avoid getting no results
if (typeof options === "object") {
delete (options as FindWithRelationsOptions).skip
delete (options as FindWithRelationsOptions).take
}
const toReturn = await this.findByIds(
entitiesIds,
idsOrOptionsWithoutRelations as FindConditions<ProductVariant>
options as FindConditions<ProductVariant>
)
return [toReturn, count]
}
@@ -198,9 +207,18 @@ export class ProductVariantRepository extends Repository<ProductVariant> {
}
if (relations.length === 0) {
const options = { ...idsOrOptionsWithoutRelations }
// Since we are finding by the ids that have been retrieved above and those ids are already
// applying skip/take. Remove those options to avoid getting no results
if (typeof options === "object") {
delete (options as FindWithRelationsOptions).skip
delete (options as FindWithRelationsOptions).take
}
return await this.findByIds(
entitiesIds,
idsOrOptionsWithoutRelations as FindConditions<ProductVariant>
options as FindConditions<ProductVariant>
)
}

View File

@@ -1,7 +1,17 @@
import { flatten, groupBy, map, merge } from "lodash"
import { Brackets, EntityRepository, FindOperator, In, Repository, } from "typeorm"
import {
Brackets,
EntityRepository,
FindOperator,
In,
Repository,
} from "typeorm"
import { PriceList, Product, SalesChannel } from "../models"
import { ExtendedFindConfig, Selector, WithRequiredProperty, } from "../types/common"
import {
ExtendedFindConfig,
Selector,
WithRequiredProperty,
} from "../types/common"
import { applyOrdering } from "../utils/repository"
export type ProductSelector = Omit<Selector<Product>, "tags"> & {
@@ -228,10 +238,14 @@ export class ProductRepository extends Repository<Product> {
}
if (relations.length === 0) {
const toReturn = await this.findByIds(
entitiesIds,
idsOrOptionsWithoutRelations
)
const options = { ...idsOrOptionsWithoutRelations }
// Since we are finding by the ids that have been retrieved above and those ids are already
// applying skip/take. Remove those options to avoid getting no results
delete options.skip
delete options.take
const toReturn = await this.findByIds(entitiesIds, options)
return [toReturn, toReturn.length]
}