feat(*): shipping options update API (#6987)

**What**
- Update the `updateShippingOptions` module service API to follow the newest convention
- Add upsert support for shipping options
- update shipping options workflow
- update shipping options api end point and validation
- update shipping options all integration tests

FIXES CORE-1926
This commit is contained in:
Adrien de Peretti authored and GitHub committed 2024-04-07 16:28:59 +00:00
1 parent f65fbff535
commit f132929c7e
20 files changed
+916 -74

No files matched your search

@@ -9,6 +9,7 @@ import { resolve } from "path"
import { FulfillmentProviderService } from "@services"
import { FulfillmentProviderServiceFixtures } from "../../__fixtures__/providers"
import { GeoZoneType } from "@medusajs/utils"
import { UpdateShippingOptionDTO } from "@medusajs/types/src"
jest.setTimeout(100000)
@@ -592,7 +593,7 @@ moduleIntegrationTestRunner({
shippingOptionData
)
const updateData = {
const updateData: UpdateShippingOptionDTO = {
id: shippingOption.id,
name: "updated-test",
price_type: "calculated",
@@ -617,6 +618,7 @@ moduleIntegrationTestRunner({
}
const updatedShippingOption = await service.updateShippingOptions(
updateData.id!,
updateData
)
@@ -690,7 +692,7 @@ moduleIntegrationTestRunner({
shippingOptionData
)
const updateData = {
const updateData: Partial<UpdateShippingOptionDTO> = {
id: shippingOption.id,
name: "updated-test",
price_type: "calculated",
@@ -702,7 +704,7 @@ moduleIntegrationTestRunner({
},
}
await service.updateShippingOptions(updateData)
await service.updateShippingOptions(updateData.id!, updateData)
const updatedShippingOption = await service.retrieveShippingOption(
shippingOption.id,
@@ -837,7 +839,7 @@ moduleIntegrationTestRunner({
},
]
const updatedShippingOption = await service.updateShippingOptions(
const updatedShippingOption = await service.upsertShippingOptions(
updateData
)
@@ -943,7 +945,7 @@ moduleIntegrationTestRunner({
}
const err = await service
.updateShippingOptions(shippingOptionData)
.updateShippingOptions(shippingOptionData.id!, shippingOptionData)
.catch((e) => e)
expect(err).toBeDefined()
@@ -988,7 +990,7 @@ moduleIntegrationTestRunner({
]
const err = await service
.updateShippingOptions(updateData)
.updateShippingOptions(updateData[0].id!, updateData[0])
.catch((e) => e)
expect(err).toBeDefined()
@@ -1035,7 +1037,7 @@ moduleIntegrationTestRunner({
]
const err = await service
.updateShippingOptions(updateData)
.updateShippingOptions(updateData[0].id!, updateData[0])
.catch((e) => e)
expect(err).toBeDefined()
@@ -1,4 +1,3 @@
import { Modules } from "@medusajs/modules-sdk"
import {
Context,
DAL,
@@ -26,6 +25,7 @@ import {
getSetDifference,
isString,
promiseAll,
Modules
} from "@medusajs/utils"
import {
Fulfillment,
@@ -40,6 +40,7 @@ import {
import { isContextValid, validateRules } from "@utils"
import { entityNameToLinkableKeysMap, joinerConfig } from "../joiner-config"
import FulfillmentProviderService from "./fulfillment-provider"
import { UpdateShippingOptionsInput } from "../types/service"
const generateMethodForModels = [
ServiceZone,
@@ -1046,40 +1047,56 @@ export default class FulfillmentModuleService<
}
updateShippingOptions(
data: FulfillmentTypes.UpdateShippingOptionDTO[],
sharedContext?: Context
): Promise<FulfillmentTypes.ShippingOptionDTO[]>
updateShippingOptions(
id: string,
data: FulfillmentTypes.UpdateShippingOptionDTO,
sharedContext?: Context
): Promise<FulfillmentTypes.ShippingOptionDTO>
updateShippingOptions(
selector: FulfillmentTypes.FilterableShippingOptionProps,
data: FulfillmentTypes.UpdateShippingOptionDTO,
sharedContext?: Context
): Promise<FulfillmentTypes.ShippingOptionDTO[]>
@InjectManager("baseRepository_")
async updateShippingOptions(
data:
| FulfillmentTypes.UpdateShippingOptionDTO[]
| FulfillmentTypes.UpdateShippingOptionDTO,
idOrSelector: string | FulfillmentTypes.FilterableShippingOptionProps,
data: FulfillmentTypes.UpdateShippingOptionDTO,
@MedusaContext() sharedContext: Context = {}
): Promise<
FulfillmentTypes.ShippingOptionDTO[] | FulfillmentTypes.ShippingOptionDTO
> {
const normalizedInput: UpdateShippingOptionsInput[] = []
if (isString(idOrSelector)) {
normalizedInput.push({ id: idOrSelector, ...data })
} else {
const shippingOptions = await this.shippingOptionService_.list(
idOrSelector,
{},
sharedContext
)
shippingOptions.forEach((shippingOption) => {
normalizedInput.push({ id: shippingOption.id, ...data })
})
}
const updatedShippingOptions = await this.updateShippingOptions_(
data,
normalizedInput,
sharedContext
)
return await this.baseRepository_.serialize<
const serialized = await this.baseRepository_.serialize<
FulfillmentTypes.ShippingOptionDTO | FulfillmentTypes.ShippingOptionDTO[]
>(updatedShippingOptions, {
populate: true,
})
return isString(idOrSelector) ? serialized[0] : serialized
}
@InjectTransactionManager("baseRepository_")
async updateShippingOptions_(
data:
| FulfillmentTypes.UpdateShippingOptionDTO[]
| FulfillmentTypes.UpdateShippingOptionDTO,
data: UpdateShippingOptionsInput[] | UpdateShippingOptionsInput,
@MedusaContext() sharedContext: Context = {}
): Promise<TShippingOptionEntity | TShippingOptionEntity[]> {
const dataArray = Array.isArray(data) ? data : [data]
@@ -1182,6 +1199,82 @@ export default class FulfillmentModuleService<
: updatedShippingOptions[0]
}
async upsertShippingOptions(
data: FulfillmentTypes.UpsertShippingOptionDTO[],
sharedContext?: Context
): Promise<FulfillmentTypes.ShippingOptionDTO[]>
async upsertShippingOptions(
data: FulfillmentTypes.UpsertShippingOptionDTO,
sharedContext?: Context
): Promise<FulfillmentTypes.ShippingOptionDTO>
@InjectManager("baseRepository_")
async upsertShippingOptions(
data:
| FulfillmentTypes.UpsertShippingOptionDTO[]
| FulfillmentTypes.UpsertShippingOptionDTO,
@MedusaContext() sharedContext: Context = {}
): Promise<
FulfillmentTypes.ShippingOptionDTO[] | FulfillmentTypes.ShippingOptionDTO
> {
const upsertedShippingOptions = await this.upsertShippingOptions_(
data,
sharedContext
)
const allShippingOptions = await this.baseRepository_.serialize<
FulfillmentTypes.ShippingOptionDTO[] | FulfillmentTypes.ShippingOptionDTO
>(upsertedShippingOptions)
return Array.isArray(data) ? allShippingOptions : allShippingOptions[0]
}
@InjectTransactionManager("baseRepository_")
async upsertShippingOptions_(
data:
| FulfillmentTypes.UpsertShippingOptionDTO[]
| FulfillmentTypes.UpsertShippingOptionDTO,
@MedusaContext() sharedContext: Context = {}
): Promise<TShippingOptionEntity[] | TShippingOptionEntity> {
const input = Array.isArray(data) ? data : [data]
const forUpdate = input.filter(
(shippingOption): shippingOption is UpdateShippingOptionsInput =>
!!shippingOption.id
)
const forCreate = input.filter(
(
shippingOption
): shippingOption is FulfillmentTypes.CreateShippingOptionDTO =>
!shippingOption.id
)
let created: TShippingOptionEntity[] = []
let updated: TShippingOptionEntity[] = []
if (forCreate.length) {
const createdShippingOptions = await this.createShippingOptions_(
forCreate,
sharedContext
)
const toPush = Array.isArray(createdShippingOptions)
? createdShippingOptions
: [createdShippingOptions]
created.push(...toPush)
}
if (forUpdate.length) {
const updatedShippingOptions = await this.updateShippingOptions_(
forUpdate,
sharedContext
)
const toPush = Array.isArray(updatedShippingOptions)
? updatedShippingOptions
: [updatedShippingOptions]
updated.push(...toPush)
}
return [...created, ...updated]
}
updateShippingProfiles(
data: FulfillmentTypes.UpdateShippingProfileDTO[],
sharedContext?: Context
@@ -1415,7 +1508,7 @@ export default class FulfillmentModuleService<
protected static validateMissingShippingOptions_(
shippingOptions: ShippingOption[],
shippingOptionsData: FulfillmentTypes.UpdateShippingOptionDTO[]
shippingOptionsData: UpdateShippingOptionsInput[]
) {
const missingShippingOptionIds = arrayDifference(
shippingOptionsData.map((s) => s.id),
@@ -0,0 +1,6 @@
import { FulfillmentTypes } from "@medusajs/types"
export type UpdateShippingOptionsInput = Required<
Pick<FulfillmentTypes.UpdateShippingOptionDTO, "id">
> &
FulfillmentTypes.UpdateShippingOptionDTO