Skip to content

Commit

Permalink
feat(types,fulfillment): ability to delete a canceled fulfillment (#1…
Browse files Browse the repository at this point in the history
  • Loading branch information
riqwan authored Dec 16, 2024
1 parent 7c773fc commit 90ad256
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 2 deletions.
6 changes: 6 additions & 0 deletions .changeset/spotty-moons-clean.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@medusajs/fulfillment": patch
"@medusajs/types": patch
---

feat(types,fulfillment): ability to delete a canceled fulfillment
12 changes: 12 additions & 0 deletions packages/core/types/src/fulfillment/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -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)

Expand Down Expand Up @@ -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`
)
})
})
})
})
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down

0 comments on commit 90ad256

Please sign in to comment.