Skip to content

Commit

Permalink
feat(providers): locking redis (#9544)
Browse files Browse the repository at this point in the history
  • Loading branch information
carlos-r-l-rodrigues authored Oct 15, 2024
1 parent e77a2ff commit 4a03bdb
Show file tree
Hide file tree
Showing 49 changed files with 1,730 additions and 449 deletions.
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ packages/*
!packages/workflow-engine-inmemory
!packages/fulfillment
!packages/fulfillment-manual
!packages/locking-redis
!packages/index

!packages/framework
Expand Down
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ module.exports = {
"./packages/modules/providers/file-s3/tsconfig.spec.json",
"./packages/modules/providers/fulfillment-manual/tsconfig.spec.json",
"./packages/modules/providers/payment-stripe/tsconfig.spec.json",
"./packages/modules/providers/locking-redis/tsconfig.spec.json",

"./packages/framework/tsconfig.json",
],
Expand Down
1 change: 1 addition & 0 deletions integration-tests/modules/medusa-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ module.exports = {
resolve: "@medusajs/cache-inmemory",
options: { ttl: 0 }, // Cache disabled
},
[Modules.LOCKING]: true,
[Modules.STOCK_LOCATION]: {
resolve: "@medusajs/stock-location-next",
options: {},
Expand Down
46 changes: 28 additions & 18 deletions packages/core/core-flows/src/cart/steps/reserve-inventory.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { IInventoryService } from "@medusajs/framework/types"
import { MathBN, Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk"
import { BigNumberInput } from "@medusajs/types"

export interface ReserveVariantInventoryStepInput {
Expand All @@ -22,34 +21,45 @@ export const reserveInventoryStepId = "reserve-inventory-step"
export const reserveInventoryStep = createStep(
reserveInventoryStepId,
async (data: ReserveVariantInventoryStepInput, { container }) => {
const inventoryService = container.resolve<IInventoryService>(
Modules.INVENTORY
)
const inventoryService = container.resolve(Modules.INVENTORY)

const items = data.items.map((item) => ({
line_item_id: item.id,
inventory_item_id: item.inventory_item_id,
quantity: MathBN.mult(item.required_quantity, item.quantity),
allow_backorder: item.allow_backorder,
location_id: item.location_ids[0],
}))
const locking = container.resolve(Modules.LOCKING)

const reservations = await inventoryService.createReservationItems(items)
const inventoryItemIds: string[] = []

const items = data.items.map((item) => {
inventoryItemIds.push(item.inventory_item_id)

return {
line_item_id: item.id,
inventory_item_id: item.inventory_item_id,
quantity: MathBN.mult(item.required_quantity, item.quantity),
allow_backorder: item.allow_backorder,
location_id: item.location_ids[0],
}
})

const reservations = await locking.execute(inventoryItemIds, async () => {
return await inventoryService.createReservationItems(items)
})

return new StepResponse(reservations, {
reservations: reservations.map((r) => r.id),
inventoryItemIds,
})
},
async (data, { container }) => {
if (!data) {
if (!data?.reservations?.length) {
return
}

const inventoryService = container.resolve<IInventoryService>(
Modules.INVENTORY
)
const inventoryService = container.resolve(Modules.INVENTORY)
const locking = container.resolve(Modules.LOCKING)

await inventoryService.deleteReservationItems(data.reservations)
const inventoryItemIds = data.inventoryItemIds
await locking.execute(inventoryItemIds, async () => {
await inventoryService.deleteReservationItems(data.reservations)
})

return new StepResponse()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { IInventoryService, InventoryTypes } from "@medusajs/framework/types"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { InventoryTypes } from "@medusajs/framework/types"
import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk"

import { Modules } from "@medusajs/framework/utils"

Expand All @@ -10,22 +10,31 @@ export const createReservationsStepId = "create-reservations-step"
export const createReservationsStep = createStep(
createReservationsStepId,
async (data: InventoryTypes.CreateReservationItemInput[], { container }) => {
const service = container.resolve<IInventoryService>(Modules.INVENTORY)
const service = container.resolve(Modules.INVENTORY)
const locking = container.resolve(Modules.LOCKING)

const created = await service.createReservationItems(data)
const inventoryItemIds = data.map((item) => item.inventory_item_id)

return new StepResponse(
created,
created.map((reservation) => reservation.id)
)
const created = await locking.execute(inventoryItemIds, async () => {
return await service.createReservationItems(data)
})

return new StepResponse(created, {
reservations: created.map((reservation) => reservation.id),
inventoryItemIds: inventoryItemIds,
})
},
async (createdIds, { container }) => {
if (!createdIds?.length) {
async (data, { container }) => {
if (!data?.reservations?.length) {
return
}

const service = container.resolve<IInventoryService>(Modules.INVENTORY)
const service = container.resolve(Modules.INVENTORY)
const locking = container.resolve(Modules.LOCKING)

await service.deleteReservationItems(createdIds)
const inventoryItemIds = data.inventoryItemIds
await locking.execute(inventoryItemIds, async () => {
await service.deleteReservationItems(data.reservations)
})
}
)
6 changes: 3 additions & 3 deletions packages/core/modules-sdk/src/loaders/module-loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,11 @@ async function loadModule(
return
}

return await loadInternalModule(
return await loadInternalModule({
container,
resolution,
logger,
migrationOnly,
loaderOnly
)
loaderOnly,
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { ModuleExports } from "@medusajs/types"
import { ModuleService } from "./services/module-service"
import { Module } from "@medusajs/utils"

const moduleExports: ModuleExports = {
service: ModuleService,
}

export * from "./services/module-service"

export default Module("module-with-providers", moduleExports)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { ModuleProviderService } from "./services/provider-service"
import { ModuleProvider } from "@medusajs/utils"

export * from "./services/provider-service"

export default ModuleProvider("provider-1", {
services: [ModuleProviderService],
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export class ModuleProviderService {
static identifier = "provider-1"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { ModuleProvider2Service } from "./services/provider-service"
import { ModuleProvider } from "@medusajs/utils"

export * from "./services/provider-service"

export default ModuleProvider("provider-2", {
services: [ModuleProvider2Service],
})
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class ModuleProvider2Service {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { InternalModuleDeclaration } from "@medusajs/types"

export class ModuleService {
constructor(
public container: Record<any, any>,
public moduleOptions: Record<any, any>,
public moduleDeclaration: InternalModuleDeclaration
) {}
}
Loading

0 comments on commit 4a03bdb

Please sign in to comment.