hotfix(medusa): Optimize swap repository findOne and find (#301)

This commit is contained in:
Oliver Windall Juhl
2021-07-02 14:43:06 +02:00
committed by GitHub
parent 19dcaf8fb3
commit 8838b506c8
3 changed files with 73 additions and 17 deletions
+49 -1
View File
@@ -1,5 +1,53 @@
import { EntityRepository, Repository } from "typeorm"
import { Swap } from "../models/swap"
import { flatten, groupBy, map, merge } from "lodash"
@EntityRepository(Swap)
export class SwapRepository extends Repository<Swap> {}
export class SwapRepository extends Repository<Swap> {
public async findWithRelations(
relations: Array<keyof Swap> = [],
optionsWithoutRelations: Omit<FindManyOptions<Swap>, "relations"> = {}
): Promise<Swap[]> {
const entities = await this.find(optionsWithoutRelations)
const entitiesIds = entities.map(({ id }) => id)
const groupedRelations = {}
for (const rel of relations) {
const [topLevel] = rel.split(".")
if (groupedRelations[topLevel]) {
groupedRelations[topLevel].push(rel)
} else {
groupedRelations[topLevel] = [rel]
}
}
const entitiesIdsWithRelations = await Promise.all(
Object.entries(groupedRelations).map(([_, rels]) => {
return this.findByIds(entitiesIds, {
select: ["id"],
relations: rels as string[],
})
})
).then(flatten)
const entitiesAndRelations = entitiesIdsWithRelations.concat(entities)
const entitiesAndRelationsById = groupBy(entitiesAndRelations, "id")
return map(entities, e => merge({}, ...entitiesAndRelationsById[e.id]))
}
public async findOneWithRelations(
relations: Array<keyof Swap> = [],
optionsWithoutRelations: Omit<FindManyOptions<Swap>, "relations"> = {}
): Promise<Swap> {
// Limit 1
optionsWithoutRelations.take = 1
const result = await this.findWithRelations(
relations,
optionsWithoutRelations
)
return result[0]
}
}
+16 -14
View File
@@ -164,7 +164,7 @@ describe("SwapService", () => {
}
const swapRepo = MockRepository({
findOne: () => Promise.resolve(existing),
findOneWithRelations: () => Promise.resolve(existing),
})
const lineItemService = {
@@ -186,10 +186,9 @@ describe("SwapService", () => {
it("finds swap and calls return create cart", async () => {
await swapService.createCart(IdMap.getId("swap-1"))
expect(swapRepo.findOne).toHaveBeenCalledTimes(1)
expect(swapRepo.findOne).toHaveBeenCalledWith({
where: { id: IdMap.getId("swap-1") },
relations: [
expect(swapRepo.findOneWithRelations).toHaveBeenCalledTimes(1)
expect(swapRepo.findOneWithRelations).toHaveBeenCalledWith(
[
"order",
"order.items",
"order.swaps",
@@ -200,7 +199,10 @@ describe("SwapService", () => {
"return_order.items",
"return_order.shipping_method",
],
})
{
where: { id: IdMap.getId("swap-1") },
}
)
expect(cartService.create).toHaveBeenCalledTimes(1)
expect(cartService.create).toHaveBeenCalledWith({
@@ -239,7 +241,7 @@ describe("SwapService", () => {
it("fails if cart already created", async () => {
const swapRepo = MockRepository({
findOne: () =>
findOneWithRelations: () =>
Promise.resolve({
...existing,
order_id: IdMap.getId("test"),
@@ -368,7 +370,7 @@ describe("SwapService", () => {
}
const swapRepo = MockRepository({
findOne: () => Promise.resolve(existing),
findOneWithRelations: () => Promise.resolve(existing),
})
const swapService = new SwapService({
manager: MockManager,
@@ -411,7 +413,7 @@ describe("SwapService", () => {
}
const swapRepo = MockRepository({
findOne: q =>
findOneWithRelations: (rels, q) =>
Promise.resolve(q.where.id === IdMap.getId("empty") ? {} : existing),
})
const swapService = new SwapService({
@@ -487,7 +489,7 @@ describe("SwapService", () => {
}
const swapRepo = MockRepository({
findOne: () => Promise.resolve({ ...existing }),
findOneWithRelations: () => Promise.resolve({ ...existing }),
})
const swapService = new SwapService({
manager: MockManager,
@@ -607,7 +609,7 @@ describe("SwapService", () => {
}
const swapRepo = MockRepository({
findOne: () => Promise.resolve(existing),
findOneWithRelations: () => Promise.resolve(existing),
})
const swapService = new SwapService({
@@ -704,7 +706,7 @@ describe("SwapService", () => {
}
const swapRepo = MockRepository({
findOne: () => Promise.resolve(existing),
findOneWithRelations: () => Promise.resolve(existing),
})
const swapService = new SwapService({
@@ -769,7 +771,7 @@ describe("SwapService", () => {
})
const swapRepo = MockRepository({
findOne: q => {
findOneWithRelations: (rels, q) => {
switch (q.where.id) {
case "refund":
return Promise.resolve(existing(-1, false))
@@ -880,7 +882,7 @@ describe("SwapService", () => {
}
const swapRepo = MockRepository({
findOne: q => {
findOneWithRelations: (rels, q) => {
switch (q.where.id) {
case "requested":
return Promise.resolve({
+8 -2
View File
@@ -103,7 +103,10 @@ class SwapService extends BaseService {
const query = this.buildQuery_({ id: validatedId }, config)
const swap = await swapRepo.findOne(query)
const rels = query.relations
delete query.relations
const swap = await swapRepo.findOneWithRelations(rels, query)
if (!swap) {
throw new MedusaError(MedusaError.Types.NOT_FOUND, "Swap was not found")
}
@@ -143,7 +146,10 @@ class SwapService extends BaseService {
) {
const swapRepo = this.manager_.getCustomRepository(this.swapRepository_)
const query = this.buildQuery_(selector, config)
return swapRepo.find(query)
let rels = query.relations
delete query.relations
return swapRepo.findWithRelations(rels, query)
}
/**