Skip to content

Commit 5707740

Browse files
authored
fix(fulfillment): don't cascade shipping option delete to shipping option type (medusajs#13280)
**What** - don't cascade delete shipping option type when shipping option is deleted since types can be shared between options - prevent shipping option type deletion if there are options associated with it
1 parent 6264a62 commit 5707740

File tree

6 files changed

+194
-71
lines changed

6 files changed

+194
-71
lines changed

.changeset/light-cats-lie.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@medusajs/fulfillment": patch
3+
"@medusajs/core-flows": patch
4+
---
5+
6+
fix(core-flows, fulfillment): don't cascade delete shipping option type when shipping option is deleted

packages/core/core-flows/src/shipping-options/workflows/delete-shipping-option-types.ts

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { Modules, ShippingOptionTypeWorkflowEvents } from "@medusajs/framework/utils"
1+
import {
2+
MedusaError,
3+
Modules,
4+
ShippingOptionTypeWorkflowEvents,
5+
} from "@medusajs/framework/utils"
26
import {
37
createHook,
48
createWorkflow,
@@ -7,9 +11,25 @@ import {
711
WorkflowData,
812
WorkflowResponse,
913
} from "@medusajs/framework/workflows-sdk"
14+
import { createStep } from "@medusajs/framework/workflows-sdk"
1015
import { emitEventStep } from "../../common/steps/emit-event"
1116
import { removeRemoteLinkStep } from "../../common/steps/remove-remote-links"
1217
import { deleteShippingOptionTypesStep } from "../steps"
18+
import { useQueryGraphStep } from "../../common"
19+
20+
const validateDeleteShippingOptionTypesStep = createStep(
21+
"validate-delete-shipping-option-types",
22+
(input: { shippingOptions: { id: string }[] }) => {
23+
const shippingOptions = input.shippingOptions
24+
25+
if (shippingOptions.length > 0) {
26+
throw new MedusaError(
27+
MedusaError.Types.INVALID_DATA,
28+
"Cannot delete shipping option type because some shipping options are using it."
29+
)
30+
}
31+
}
32+
)
1333

1434
/**
1535
* The data to delete one or more shipping option types.
@@ -21,7 +41,8 @@ export type DeleteShippingOptionTypesWorkflowInput = {
2141
ids: string[]
2242
}
2343

24-
export const deleteShippingOptionTypesWorkflowId = "delete-shipping-option-types"
44+
export const deleteShippingOptionTypesWorkflowId =
45+
"delete-shipping-option-types"
2546
/**
2647
* This workflow deletes one or more shipping-option types. It's used by the
2748
* [Delete Shipping Option Types Admin API Route](TODO HERE).
@@ -48,11 +69,31 @@ export const deleteShippingOptionTypesWorkflowId = "delete-shipping-option-types
4869
export const deleteShippingOptionTypesWorkflow = createWorkflow(
4970
deleteShippingOptionTypesWorkflowId,
5071
(input: WorkflowData<DeleteShippingOptionTypesWorkflowInput>) => {
51-
const deletedShippingOptionTypes = deleteShippingOptionTypesStep(input.ids)
52-
const shippingOptionTypesDeleted = createHook("shippingOptionTypesDeleted", {
53-
ids: input.ids,
72+
const shippingOptionsQuery = useQueryGraphStep({
73+
entity: "shipping_option",
74+
filters: { shipping_option_type_id: input.ids },
75+
pagination: { take: 1 },
76+
fields: ["id"],
77+
}).config({ name: "get-shipping-options" })
78+
79+
const shippingOptions = transform(
80+
{ shippingOptionsQuery },
81+
({ shippingOptionsQuery }) =>
82+
shippingOptionsQuery.data as { id: string }[]
83+
)
84+
85+
validateDeleteShippingOptionTypesStep({
86+
shippingOptions,
5487
})
5588

89+
const deletedShippingOptionTypes = deleteShippingOptionTypesStep(input.ids)
90+
const shippingOptionTypesDeleted = createHook(
91+
"shippingOptionTypesDeleted",
92+
{
93+
ids: input.ids,
94+
}
95+
)
96+
5697
const typeIdEvents = transform({ input }, ({ input }) => {
5798
return input.ids?.map((id) => {
5899
return { id }

packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/index.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function expectSoftDeleted(
7474
let shippingOption = serviceZone.shipping_options[0]
7575
expect(!!shippingOption.deleted_at).toEqual(softDeleted)
7676
expect(!!shippingOption.shipping_profile.deleted_at).toEqual(false)
77-
expect(!!shippingOption.type.deleted_at).toEqual(softDeleted)
77+
expect(!!shippingOption.type.deleted_at).toEqual(false) // do not cascade delete shipping option type since it is shared between shipping options
7878
expect(shippingOption.fulfillments).toHaveLength(1)
7979
expect(shippingOption.rules).toHaveLength(1)
8080

0 commit comments

Comments
 (0)