From b458615ed50a7c637e9e77f29f21c7ab300ed5d8 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Wed, 1 Mar 2023 13:22:25 +0100 Subject: [PATCH 1/2] fix(medusa): Delete all payment sessions when cart total is 0 (#3346) * Fix(medusa): On cart total amount at 0 the non initialised payment sessions are not delete * fix test * Create good-crews-pull.md --- .changeset/good-crews-pull.md | 5 +++++ packages/medusa/src/services/__tests__/cart.js | 16 ++++++++-------- packages/medusa/src/services/cart.ts | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 .changeset/good-crews-pull.md diff --git a/.changeset/good-crews-pull.md b/.changeset/good-crews-pull.md new file mode 100644 index 0000000000..da496a6ec4 --- /dev/null +++ b/.changeset/good-crews-pull.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +Fix(medusa): All payment sessions should be removed if cart total reach 0 diff --git a/packages/medusa/src/services/__tests__/cart.js b/packages/medusa/src/services/__tests__/cart.js index 9bab2f7538..2820514c58 100644 --- a/packages/medusa/src/services/__tests__/cart.js +++ b/packages/medusa/src/services/__tests__/cart.js @@ -1688,8 +1688,8 @@ describe("CartService", () => { expect(paymentSessionRepositoryMock.create).toHaveBeenCalledTimes(1) expect(paymentSessionRepositoryMock.save).toHaveBeenCalledTimes(2) // create and update - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledTimes(1) - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledWith({ + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledTimes(1) + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledWith({ provider_id: "not_in_region", }) }) @@ -1697,12 +1697,12 @@ describe("CartService", () => { it("removes if cart total === 0", async () => { await cartService.setPaymentSessions(IdMap.getId("cart-remove")) - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledTimes(2) + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledTimes(2) - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledWith({ + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledWith({ provider_id: provider1Id, }) - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledWith({ + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledWith({ provider_id: provider2Id, }) }) @@ -1710,12 +1710,12 @@ describe("CartService", () => { it("removes if cart total < 0", async () => { await cartService.setPaymentSessions(IdMap.getId("cart-negative")) - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledTimes(2) + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledTimes(2) - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledWith({ + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledWith({ provider_id: provider1Id, }) - expect(paymentSessionRepositoryMock.delete).toHaveBeenCalledWith({ + expect(paymentSessionRepositoryMock.remove).toHaveBeenCalledWith({ provider_id: provider2Id, }) }) diff --git a/packages/medusa/src/services/cart.ts b/packages/medusa/src/services/cart.ts index 9c0dda7648..e06000041f 100644 --- a/packages/medusa/src/services/cart.ts +++ b/packages/medusa/src/services/cart.ts @@ -1821,7 +1821,7 @@ class CartService extends TransactionBaseService { return paymentProviderServiceTx.deleteSession(session) } - return psRepo.delete(session) + return psRepo.remove(session) } // In the case of a cart that has a total <= 0 we can return prematurely. From 4b114cc4191ba20832b66072ec82386b22a3533c Mon Sep 17 00:00:00 2001 From: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Wed, 1 Mar 2023 18:11:30 +0100 Subject: [PATCH 2/2] feat(medusa): Use Bull `jobId` option to identify duplicates (#3351) * feat(medusa): Use Bull jobId option to identify duplicates * Create pink-emus-drum.md --- .changeset/pink-emus-drum.md | 5 +++++ packages/medusa/src/services/event-bus.ts | 19 ++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 .changeset/pink-emus-drum.md diff --git a/.changeset/pink-emus-drum.md b/.changeset/pink-emus-drum.md new file mode 100644 index 0000000000..afa8032684 --- /dev/null +++ b/.changeset/pink-emus-drum.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +feat(medusa): Use Bull `jobId` option to identify duplicates diff --git a/packages/medusa/src/services/event-bus.ts b/packages/medusa/src/services/event-bus.ts index f7894a2f70..d7bbf197af 100644 --- a/packages/medusa/src/services/event-bus.ts +++ b/packages/medusa/src/services/event-bus.ts @@ -1,4 +1,4 @@ -import Bull from "bull" +import Bull, { JobOptions } from "bull" import Redis from "ioredis" import { isDefined } from "medusa-core-utils" import { EntityManager } from "typeorm" @@ -40,14 +40,16 @@ type SubscriberDescriptor = { subscriber: Subscriber } -type EmitOptions = { +export type EmitOptions = { delay?: number attempts: number backoff?: { type: "fixed" | "exponential" delay: number } -} +} & JobOptions + +const COMPLETED_JOB_TTL = 10000 /** * Can keep track of multiple subscribers to different events and run the @@ -225,10 +227,13 @@ export default class EventBusService { data: T, options: Record & EmitOptions = { attempts: 1 } ): Promise { - const opts: { removeOnComplete: boolean } & EmitOptions = { - removeOnComplete: true, - attempts: 1, + const opts: EmitOptions = { + removeOnComplete: { + age: COMPLETED_JOB_TTL, + }, + ...options, } + if (typeof options.attempts === "number") { opts.attempts = options.attempts if (isDefined(options.backoff)) { @@ -295,7 +300,7 @@ export default class EventBusService { this.queue_ .add( { eventName: job.event_name, data: job.data }, - job.options ?? { removeOnComplete: true } + { jobId: job.id, ...job.options } ) .then(async () => { await stagedJobRepo.remove(job)