From 6a3409d239f9c29e895dc8eb87cfea1ebc3984d7 Mon Sep 17 00:00:00 2001 From: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Tue, 2 Mar 2021 08:02:24 +0100 Subject: [PATCH 1/4] hotfix(medusa): Efficient product querying (#191) --- packages/medusa/src/repositories/product.ts | 12 ++++++-- packages/medusa/src/services/product.js | 34 ++++++++++----------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/packages/medusa/src/repositories/product.ts b/packages/medusa/src/repositories/product.ts index 46e01c29bb..dd1dc83c8f 100644 --- a/packages/medusa/src/repositories/product.ts +++ b/packages/medusa/src/repositories/product.ts @@ -6,9 +6,17 @@ import { Product } from "../models/product" export class ProductRepository extends Repository { public async findWithRelations( relations: Array = [], - optionsWithoutRelations: Omit, "relations"> = {} + idsOrOptionsWithoutRelations: Omit< + FindManyOptions, + "relations" + > = {} ): Promise { - const entities = await this.find(optionsWithoutRelations) + let entities + if (Array.isArray(idsOrOptionsWithoutRelations)) { + entities = await this.findByIds(idsOrOptionsWithoutRelations) + } else { + entities = await this.find(idsOrOptionsWithoutRelations) + } const entitiesIds = entities.map(({ id }) => id) const groupedRelations = {} diff --git a/packages/medusa/src/services/product.js b/packages/medusa/src/services/product.js index 38b3fb4696..efc7fabde1 100644 --- a/packages/medusa/src/services/product.js +++ b/packages/medusa/src/services/product.js @@ -80,7 +80,7 @@ class ProductService extends BaseService { * @param {Object} listOptions - the query object for find * @return {Promise} the result of the find operation */ - list(selector = {}, config = { relations: [], skip: 0, take: 20 }) { + async list(selector = {}, config = { relations: [], skip: 0, take: 20 }) { const productRepo = this.manager_.getCustomRepository( this.productRepository_ ) @@ -101,7 +101,7 @@ class ProductService extends BaseService { query.select = config.select } - const rels = query.relations + let rels = query.relations delete query.relations if (q) { @@ -110,27 +110,27 @@ class ProductService extends BaseService { delete where.description delete where.title - query.join = { - alias: "product", - leftJoinAndSelect: { - variant: "product.variants", - collection: "product.collection", - }, - } - - query.where = qb => { - qb.where(where) - - qb.andWhere( + const raw = await productRepo + .createQueryBuilder("product") + .leftJoinAndSelect("product.variants", "variant") + .leftJoinAndSelect("product.collection", "collection") + .select(["product.id"]) + .where(where) + .andWhere( new Brackets(qb => { - qb.where(`product.title ILIKE :q`, { q: `%${q}%` }) - .orWhere(`product.description ILIKE :q`, { q: `%${q}%` }) + qb.where(`product.description ILIKE :q`, { q: `%${q}%` }) + .orWhere(`product.title ILIKE :q`, { q: `%${q}%` }) .orWhere(`variant.title ILIKE :q`, { q: `%${q}%` }) .orWhere(`variant.sku ILIKE :q`, { q: `%${q}%` }) .orWhere(`collection.title ILIKE :q`, { q: `%${q}%` }) }) ) - } + .getMany() + + return productRepo.findWithRelations( + rels, + raw.map(i => i.id) + ) } return productRepo.findWithRelations(rels, query) From 9ce935a779aec90ff1ad301c73114ab69ce51b36 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Mon, 8 Mar 2021 13:58:01 +0100 Subject: [PATCH 2/4] fix: enable gift-card creation without order_id --- packages/medusa-plugin-sendgrid/src/services/sendgrid.js | 4 ++++ packages/medusa/src/services/gift-card.js | 7 ------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/medusa-plugin-sendgrid/src/services/sendgrid.js b/packages/medusa-plugin-sendgrid/src/services/sendgrid.js index 0d027700f8..61aeb788e4 100644 --- a/packages/medusa-plugin-sendgrid/src/services/sendgrid.js +++ b/packages/medusa-plugin-sendgrid/src/services/sendgrid.js @@ -381,6 +381,10 @@ class SendGridService extends NotificationService { relations: ["region", "order"], }) + if (!giftCard.order) { + return + } + const taxRate = giftCard.region.tax_rate / 100 return { diff --git a/packages/medusa/src/services/gift-card.js b/packages/medusa/src/services/gift-card.js index a2f13d31bc..ecd62cf045 100644 --- a/packages/medusa/src/services/gift-card.js +++ b/packages/medusa/src/services/gift-card.js @@ -108,13 +108,6 @@ class GiftCardService extends BaseService { ) } - if (!giftCard.order_id) { - throw new MedusaError( - MedusaError.Types.NOT_FOUND, - `Gift card is missing order_id` - ) - } - // Will throw if region does not exist const region = await this.regionService_.retrieve(giftCard.region_id) From 1263d24ca380918345c844c1793f2706a49f85c6 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Mon, 8 Mar 2021 15:31:39 +0100 Subject: [PATCH 3/4] fix: enable gift-card creation without order_id (#195) --- packages/medusa-plugin-sendgrid/src/services/sendgrid.js | 4 ++++ packages/medusa/src/services/gift-card.js | 7 ------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/medusa-plugin-sendgrid/src/services/sendgrid.js b/packages/medusa-plugin-sendgrid/src/services/sendgrid.js index 0d027700f8..61aeb788e4 100644 --- a/packages/medusa-plugin-sendgrid/src/services/sendgrid.js +++ b/packages/medusa-plugin-sendgrid/src/services/sendgrid.js @@ -381,6 +381,10 @@ class SendGridService extends NotificationService { relations: ["region", "order"], }) + if (!giftCard.order) { + return + } + const taxRate = giftCard.region.tax_rate / 100 return { diff --git a/packages/medusa/src/services/gift-card.js b/packages/medusa/src/services/gift-card.js index a2f13d31bc..ecd62cf045 100644 --- a/packages/medusa/src/services/gift-card.js +++ b/packages/medusa/src/services/gift-card.js @@ -108,13 +108,6 @@ class GiftCardService extends BaseService { ) } - if (!giftCard.order_id) { - throw new MedusaError( - MedusaError.Types.NOT_FOUND, - `Gift card is missing order_id` - ) - } - // Will throw if region does not exist const region = await this.regionService_.retrieve(giftCard.region_id) From 521d306b7126a820297d7374b9c16bea465fa643 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Mon, 8 Mar 2021 15:44:37 +0100 Subject: [PATCH 4/4] fix: adds integration test to create endpoint --- .../api/__tests__/admin/gift-cards.js | 79 +++++++++++++++++++ integration-tests/api/__tests__/store/cart.js | 2 +- .../admin/gift-cards/create-gift-card.js | 7 +- 3 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 integration-tests/api/__tests__/admin/gift-cards.js diff --git a/integration-tests/api/__tests__/admin/gift-cards.js b/integration-tests/api/__tests__/admin/gift-cards.js new file mode 100644 index 0000000000..7a5f400728 --- /dev/null +++ b/integration-tests/api/__tests__/admin/gift-cards.js @@ -0,0 +1,79 @@ +const { dropDatabase } = require("pg-god"); +const path = require("path"); +const { Region } = require("@medusajs/medusa"); + +const setupServer = require("../../../helpers/setup-server"); +const { useApi } = require("../../../helpers/use-api"); +const { initDb } = require("../../../helpers/use-db"); +const adminSeeder = require("../../helpers/admin-seeder"); + +jest.setTimeout(30000); + +describe("/admin/gift-cards", () => { + let medusaProcess; + let dbConnection; + + beforeAll(async () => { + const cwd = path.resolve(path.join(__dirname, "..", "..")); + dbConnection = await initDb({ cwd }); + medusaProcess = await setupServer({ cwd }); + }); + + afterAll(async () => { + await dbConnection.close(); + await dropDatabase({ databaseName: "medusa-integration" }); + + medusaProcess.kill(); + }); + + describe("POST /admin/gift-cards", () => { + beforeEach(async () => { + const manager = dbConnection.manager; + try { + await adminSeeder(dbConnection); + await manager.insert(Region, { + id: "region", + name: "Test Region", + currency_code: "usd", + tax_rate: 0, + }); + } catch (err) { + console.log(err); + throw err; + } + }); + + afterEach(async () => { + const manager = dbConnection.manager; + await manager.query(`DELETE FROM "gift_card"`); + await manager.query(`DELETE FROM "region"`); + await manager.query(`DELETE FROM "user"`); + }); + + it("creates a gift card", async () => { + const api = useApi(); + + const response = await api + .post( + "/admin/gift-cards", + { + value: 1000, + region_id: "region", + }, + { + headers: { + Authorization: "Bearer test_token", + }, + } + ) + .catch((err) => { + console.log(err); + }); + + expect(response.status).toEqual(200); + expect(response.data.gift_card.value).toEqual(1000); + expect(response.data.gift_card.balance).toEqual(1000); + expect(response.data.gift_card.region_id).toEqual("region"); + }); + }); +}); diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index e924f26e42..e85a31b066 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -22,7 +22,7 @@ describe("/store/carts", () => { afterAll(async () => { dbConnection.close(); - dropDatabase({ databaseName: "medusa-integration" }); + await dropDatabase({ databaseName: "medusa-integration" }); medusaProcess.kill(); }); diff --git a/packages/medusa/src/api/routes/admin/gift-cards/create-gift-card.js b/packages/medusa/src/api/routes/admin/gift-cards/create-gift-card.js index 19734fef72..4aab253c55 100644 --- a/packages/medusa/src/api/routes/admin/gift-cards/create-gift-card.js +++ b/packages/medusa/src/api/routes/admin/gift-cards/create-gift-card.js @@ -20,9 +20,12 @@ export default async (req, res) => { try { const giftCardService = req.scope.resolve("giftCardService") - await giftCardService.create(value) + const newly = await giftCardService.create({ + ...value, + balance: value.value, + }) - const giftCard = await giftCardService.retrieve(id, { + const giftCard = await giftCardService.retrieve(newly.id, { select: defaultFields, relations: defaultRelations, })