Feat(core-flows, medusa): delete inventory item (#6708)
* initial get-inventory-item * add exception throw test * remove console log * add changeset * remove inventory item * add changeset * fix pr feedback * use links * use modules instead of property names
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import {
|
||||
ContainerRegistrationKeys,
|
||||
remoteQueryObjectFromString,
|
||||
} from "@medusajs/utils"
|
||||
import { ModuleRegistrationName, Modules } from "@medusajs/modules-sdk"
|
||||
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
|
||||
|
||||
import { ILinkModule } from "@medusajs/types"
|
||||
|
||||
export const deatachInventoryItemStepId = "deattach-inventory-items-step"
|
||||
export const deatachInventoryItemStep = createStep(
|
||||
deatachInventoryItemStepId,
|
||||
async (ids: string[], { container }) => {
|
||||
const remoteLink = container.resolve(ContainerRegistrationKeys.REMOTE_LINK)
|
||||
|
||||
const linkModule: ILinkModule = remoteLink.getLinkModule(
|
||||
Modules.PRODUCT,
|
||||
"variant_id",
|
||||
Modules.INVENTORY,
|
||||
"inventory_item_id"
|
||||
)
|
||||
|
||||
const links = (await linkModule.list(
|
||||
{ inventory_item_id: ids },
|
||||
{ select: ["variant_id", "inventory_item_id"] }
|
||||
)) as { inventory_item_id: string; variant_id: string }[]
|
||||
|
||||
await remoteLink.dismiss(
|
||||
links.map(({ inventory_item_id, variant_id }) => ({
|
||||
[Modules.PRODUCT]: {
|
||||
variant_id,
|
||||
},
|
||||
[Modules.INVENTORY]: {
|
||||
inventory_item_id,
|
||||
},
|
||||
}))
|
||||
)
|
||||
|
||||
return new StepResponse(void 0, links)
|
||||
},
|
||||
async (input, { container }) => {
|
||||
if (!input?.length) {
|
||||
return
|
||||
}
|
||||
|
||||
const remoteLink = container.resolve(ContainerRegistrationKeys.REMOTE_LINK)
|
||||
|
||||
const linkDefinitions = input.map(({ inventory_item_id, variant_id }) => ({
|
||||
[Modules.PRODUCT]: {
|
||||
variant_id,
|
||||
},
|
||||
[Modules.INVENTORY]: {
|
||||
inventory_item_id,
|
||||
},
|
||||
}))
|
||||
|
||||
const links = await remoteLink.create(linkDefinitions)
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,24 @@
|
||||
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
|
||||
|
||||
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
|
||||
|
||||
export const deleteInventoryItemStepId = "delete-inventory-item-step"
|
||||
export const deleteInventoryItemStep = createStep(
|
||||
deleteInventoryItemStepId,
|
||||
async (ids: string[], { container }) => {
|
||||
const inventoryService = container.resolve(ModuleRegistrationName.INVENTORY)
|
||||
|
||||
await inventoryService.softDelete(ids)
|
||||
|
||||
return new StepResponse(void 0, ids)
|
||||
},
|
||||
async (prevInventoryItemIds, { container }) => {
|
||||
if (!prevInventoryItemIds?.length) {
|
||||
return
|
||||
}
|
||||
|
||||
const inventoryService = container.resolve(ModuleRegistrationName.INVENTORY)
|
||||
|
||||
await inventoryService.restore(prevInventoryItemIds)
|
||||
}
|
||||
)
|
||||
@@ -1,3 +1,5 @@
|
||||
export * from "./delete-inventory-items"
|
||||
export * from "./deatach-inventory-items"
|
||||
export * from "./attach-inventory-items"
|
||||
export * from "./create-inventory-items"
|
||||
export * from "./validate-singular-inventory-items-for-tags"
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
|
||||
import { deatachInventoryItemStep, deleteInventoryItemStep } from "../steps"
|
||||
|
||||
export const deleteInventoryItemWorkflowId = "delete-inventory-item-workflow"
|
||||
export const deleteInventoryItemWorkflow = createWorkflow(
|
||||
deleteInventoryItemWorkflowId,
|
||||
(input: WorkflowData<string[]>): WorkflowData<string[]> => {
|
||||
deleteInventoryItemStep(input)
|
||||
|
||||
deatachInventoryItemStep(input)
|
||||
return input
|
||||
}
|
||||
)
|
||||
@@ -1,3 +1,4 @@
|
||||
export * from "./delete-inventory-items"
|
||||
export * from "./create-inventory-items"
|
||||
export * from "./create-inventory-levels"
|
||||
export * from "./delete-inventory-levels"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import {
|
||||
BeforeCreate,
|
||||
Cascade,
|
||||
Collection,
|
||||
Entity,
|
||||
Filter,
|
||||
@@ -19,6 +20,7 @@ import {
|
||||
|
||||
import { DAL } from "@medusajs/types"
|
||||
import { InventoryLevel } from "./inventory-level"
|
||||
import { ReservationItem } from "./reservation-item"
|
||||
|
||||
const InventoryItemDeletedAtIndex = createPsqlIndexStatementHelper({
|
||||
tableName: "inventory_item",
|
||||
@@ -106,10 +108,22 @@ export class InventoryItem {
|
||||
|
||||
@OneToMany(
|
||||
() => InventoryLevel,
|
||||
(inventoryLevel) => inventoryLevel.inventory_item
|
||||
(inventoryLevel) => inventoryLevel.inventory_item,
|
||||
{
|
||||
cascade: ["soft-remove" as any],
|
||||
}
|
||||
)
|
||||
location_levels = new Collection<InventoryLevel>(this)
|
||||
|
||||
@OneToMany(
|
||||
() => ReservationItem,
|
||||
(reservationItem) => reservationItem.inventory_item,
|
||||
{
|
||||
cascade: ["soft-remove" as any],
|
||||
}
|
||||
)
|
||||
reservation_items = new Collection<ReservationItem>(this)
|
||||
|
||||
@Formula(
|
||||
(item) =>
|
||||
`(SELECT SUM(reserved_quantity) FROM inventory_level il WHERE il.inventory_item_id = ${item}.id)`,
|
||||
|
||||
@@ -5,6 +5,8 @@ import {
|
||||
} from "@medusajs/utils"
|
||||
import { MedusaRequest, MedusaResponse } from "../../../../types/routing"
|
||||
|
||||
import { deleteInventoryItemWorkflow } from "@medusajs/core-flows"
|
||||
|
||||
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
|
||||
const { id } = req.params
|
||||
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
|
||||
@@ -35,3 +37,23 @@ export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
|
||||
inventory_item,
|
||||
})
|
||||
}
|
||||
|
||||
export const DELETE = async (req: MedusaRequest, res: MedusaResponse) => {
|
||||
const id = req.params.id
|
||||
const deleteInventoryItems = deleteInventoryItemWorkflow(req.scope)
|
||||
|
||||
const { errors } = await deleteInventoryItems.run({
|
||||
input: [id],
|
||||
throwOnError: false,
|
||||
})
|
||||
|
||||
if (Array.isArray(errors) && errors[0]) {
|
||||
throw errors[0].error
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
id,
|
||||
object: "inventory_item",
|
||||
deleted: true,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user