feat(types,fulfillment): ability to delete a canceled fulfillment (#10602)

This commit is contained in:
Riqwan Thamir
2024-12-16 11:17:45 +01:00
committed by GitHub
parent 7c773fc108
commit 90ad2566fd
4 changed files with 103 additions and 2 deletions

View File

@@ -0,0 +1,6 @@
---
"@medusajs/fulfillment": patch
"@medusajs/types": patch
---
feat(types,fulfillment): ability to delete a canceled fulfillment

View File

@@ -2459,6 +2459,18 @@ export interface IFulfillmentModuleService extends IModuleService {
sharedContext?: Context
): Promise<FulfillmentDTO>
/**
* This method deletes fulfillment by IDs after cancelation.
*
* @param {string} id - The ID of the fulfillment.
* @param {Context} sharedContext - A context used to share resources, such as transaction manager, between the application and the module.
* @returns {Promise<void>} Resolves when the fulfillment set is deleted successfully.
*
* @example
* await fulfillmentModuleService.deleteFulfillment("ful_123")
*/
deleteFulfillment(id: string, sharedContext?: Context): Promise<void>
/**
* This method creates a fulfillment and call the provider to create a return.
*

View File

@@ -1,18 +1,18 @@
import { resolve } from "path"
import {
IFulfillmentModuleService,
UpdateFulfillmentDTO,
} from "@medusajs/framework/types"
import { FulfillmentEvents, Modules } from "@medusajs/framework/utils"
import {
MockEventBusService,
moduleIntegrationTestRunner,
} from "@medusajs/test-utils"
import { resolve } from "path"
import {
buildExpectedEventMessageShape,
generateCreateFulfillmentData,
generateCreateShippingOptionsData,
} from "../../__fixtures__"
import { FulfillmentEvents, Modules } from "@medusajs/framework/utils"
jest.setTimeout(100000)
@@ -509,6 +509,67 @@ moduleIntegrationTestRunner<IFulfillmentModuleService>({
)
})
})
describe("on delete", () => {
let fulfillment
beforeEach(async () => {
const shippingProfile = await service.createShippingProfiles({
name: "test",
type: "default",
})
const fulfillmentSet = await service.createFulfillmentSets({
name: "test",
type: "test-type",
})
const serviceZone = await service.createServiceZones({
name: "test",
fulfillment_set_id: fulfillmentSet.id,
})
const shippingOption = await service.createShippingOptions(
generateCreateShippingOptionsData({
provider_id: providerId,
service_zone_id: serviceZone.id,
shipping_profile_id: shippingProfile.id,
})
)
fulfillment = await service.createFulfillment(
generateCreateFulfillmentData({
provider_id: providerId,
shipping_option_id: shippingOption.id,
})
)
jest.clearAllMocks()
})
it("should delete a canceled fulfillment successfully", async () => {
await service.cancelFulfillment(fulfillment.id)
await service.deleteFulfillment(fulfillment.id)
const retrieveError = await service
.retrieveFulfillment(fulfillment.id)
.catch((e) => e)
expect(retrieveError.message).toEqual(
`Fulfillment with id: ${fulfillment.id} was not found`
)
})
it("should fail to delete an uncanceled fulfillment", async () => {
const deleteError = await service
.deleteFulfillment(fulfillment.id)
.catch((e) => e)
expect(deleteError.message).toEqual(
`Fulfillment with id ${fulfillment.id} needs to be canceled first before deleting`
)
})
})
})
})
},

View File

@@ -653,6 +653,28 @@ export default class FulfillmentModuleService
)
}
@InjectManager()
@EmitEvents()
async deleteFulfillment(
id: string,
@MedusaContext() sharedContext: Context = {}
): Promise<void> {
const fulfillment = await this.fulfillmentService_.retrieve(
id,
{},
sharedContext
)
if (!isPresent(fulfillment.canceled_at)) {
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
`Fulfillment with id ${fulfillment.id} needs to be canceled first before deleting`
)
}
await this.fulfillmentService_.delete(id, sharedContext)
}
@InjectManager()
@EmitEvents()
async createReturnFulfillment(