feat(core-flows,fulfillment, fulfillment-manual, types): make fulfillment typings more specific (#10677)

**What**
- attempt to add more specific type definitions around fulfillment provider APIs

---

CLOSES CMRC-814
CLOSES CMRC-816
CLOSES CMRC-817
This commit is contained in:
Frane Polić
2025-01-07 08:08:45 +00:00
committed by GitHub
parent 333ed538f5
commit 16b0672f8a
12 changed files with 1358 additions and 68 deletions
@@ -17,6 +17,7 @@ import {
SoftDeleteReturn,
UpdateFulfillmentSetDTO,
UpdateServiceZoneDTO,
ValidateFulfillmentDataContext,
} from "@medusajs/framework/types"
import {
arrayDifference,
@@ -650,7 +651,7 @@ export default class FulfillmentModuleService
fulfillmentData || {},
items.map((i) => i),
order,
fulfillmentRest
fulfillmentRest as unknown as Partial<FulfillmentDTO>
)
await this.fulfillmentService_.update(
{
@@ -710,11 +711,22 @@ export default class FulfillmentModuleService
sharedContext
)
const shippingOption = await this.shippingOptionService_.retrieve(
fulfillment.shipping_option_id!,
{
select: ["id", "name", "data", "metadata"],
},
sharedContext
)
try {
const providerResult =
await this.fulfillmentProviderService_.createReturn(
fulfillment.provider_id!, // TODO: should we add a runtime check on provider_id being provided?,
fulfillment as Record<any, any>
{
...fulfillment,
shipping_option: shippingOption,
} as Record<any, any>
)
await this.fulfillmentService_.update(
{
@@ -2002,7 +2014,7 @@ export default class FulfillmentModuleService
providerId: string,
optionData: Record<string, unknown>,
data: Record<string, unknown>,
context: Record<string, unknown>
context: ValidateFulfillmentDataContext
): Promise<Record<string, unknown>> {
return await this.fulfillmentProviderService_.validateFulfillmentData(
providerId,
@@ -2012,6 +2024,7 @@ export default class FulfillmentModuleService
)
}
// TODO: seems not to be used, what is the purpose of this method?
async validateFulfillmentOption(
providerId: string,
data: Record<string, unknown>
@@ -2058,10 +2071,7 @@ export default class FulfillmentModuleService
}
const promises = shippingOptionsData.map((option) =>
this.fulfillmentProviderService_.canCalculate(
option.provider_id,
option as unknown as Record<string, unknown>
)
this.fulfillmentProviderService_.canCalculate(option.provider_id, option)
)
return await promiseAll(promises)
@@ -1,11 +1,17 @@
import {
CalculateShippingOptionPriceDTO,
Constructor,
CreateFulfillmentResult,
CreateShippingOptionDTO,
DAL,
FulfillmentDTO,
FulfillmentItemDTO,
FulfillmentOption,
FulfillmentOrderDTO,
FulfillmentTypes,
IFulfillmentProvider,
Logger,
ValidateFulfillmentDataContext,
} from "@medusajs/framework/types"
import {
MedusaError,
@@ -91,7 +97,7 @@ export default class FulfillmentProviderService extends ModulesSdkUtils.MedusaIn
providerId: string,
optionData: Record<string, unknown>,
data: Record<string, unknown>,
context: Record<string, unknown>
context: ValidateFulfillmentDataContext
) {
const provider = this.retrieveProviderRegistration(providerId)
return await provider.validateFulfillmentData(optionData, data, context)
@@ -102,7 +108,7 @@ export default class FulfillmentProviderService extends ModulesSdkUtils.MedusaIn
return await provider.validateOption(data)
}
async canCalculate(providerId: string, data: Record<string, unknown>) {
async canCalculate(providerId: string, data: CreateShippingOptionDTO) {
const provider = this.retrieveProviderRegistration(providerId)
return await provider.canCalculate(data)
}
@@ -119,11 +125,11 @@ export default class FulfillmentProviderService extends ModulesSdkUtils.MedusaIn
async createFulfillment(
providerId: string,
data: object,
items: object[],
order: object | undefined,
fulfillment: Record<string, unknown>
): Promise<Record<string, unknown>> {
data: Record<string, unknown>,
items: Partial<Omit<FulfillmentItemDTO, "fulfillment">>[],
order: Partial<FulfillmentOrderDTO> | undefined,
fulfillment: Partial<Omit<FulfillmentDTO, "provider_id" | "data" | "items">>
): Promise<CreateFulfillmentResult> {
const provider = this.retrieveProviderRegistration(providerId)
return await provider.createFulfillment(data, items, order, fulfillment)
}
@@ -1,7 +1,10 @@
import { AbstractFulfillmentProviderService } from "@medusajs/framework/utils"
import {
CalculatedShippingOptionPrice,
CalculateShippingOptionPriceContext,
CreateFulfillmentResult,
FulfillmentOption,
ValidateFulfillmentDataContext,
} from "@medusajs/types"
// TODO rework type and DTO's
@@ -28,7 +31,7 @@ export class ManualFulfillmentService extends AbstractFulfillmentProviderService
async validateFulfillmentData(
optionData: Record<string, unknown>,
data: Record<string, unknown>,
context: Record<string, unknown>
context: ValidateFulfillmentDataContext
): Promise<any> {
return data
}
@@ -36,7 +39,7 @@ export class ManualFulfillmentService extends AbstractFulfillmentProviderService
async calculatePrice(
optionData: Record<string, unknown>,
data: Record<string, unknown>,
context: Record<string, unknown>
context: CalculateShippingOptionPriceContext
): Promise<CalculatedShippingOptionPrice> {
throw new Error("Manual fulfillment does not support price calculation")
}
@@ -49,16 +52,22 @@ export class ManualFulfillmentService extends AbstractFulfillmentProviderService
return true
}
async createFulfillment(): Promise<Record<string, any>> {
async createFulfillment(): Promise<CreateFulfillmentResult> {
// No data is being sent anywhere
return {}
return {
data: {},
labels: [],
}
}
async cancelFulfillment(): Promise<any> {
return {}
}
async createReturnFulfillment(): Promise<any> {
return {}
async createReturnFulfillment(): Promise<CreateFulfillmentResult> {
return {
data: {},
labels: [],
}
}
}