feat(medusa, core-flows, fulfillment): calculate SO price endpoint (#10532)

**What**
- endpoint + flow for fetching calculated price for a shipping option

---

CLOSES CMRC-777
This commit is contained in:
Frane Polić
2024-12-12 08:03:56 +00:00
committed by GitHub
parent 52b494b62d
commit 472e92e400
18 changed files with 263 additions and 9 deletions
@@ -0,0 +1,31 @@
import { HttpTypes } from "@medusajs/framework/types"
import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
import { calculateShippingOptionsPricesWorkflow } from "@medusajs/core-flows"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
export const POST = async (
req: MedusaRequest<HttpTypes.StoreCalculateShippingOptionPrice>,
res: MedusaResponse<HttpTypes.StoreShippingOptionResponse>
) => {
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
const { result } = await calculateShippingOptionsPricesWorkflow(
req.scope
).run({
input: {
shipping_options: [{ id: req.params.id, data: req.validatedBody.data }],
cart_id: req.validatedBody.cart_id,
},
})
const { data } = await query.graph({
entity: "shipping_option",
fields: req.remoteQueryConfig.fields,
filters: { id: req.params.id },
})
const shippingOption = data[0]
const priceData = result[0]
res.status(200).json({ shipping_option: { ...shippingOption, ...priceData } })
}
@@ -1,7 +1,15 @@
import { MiddlewareRoute } from "@medusajs/framework/http"
import {
MiddlewareRoute,
validateAndTransformBody,
} from "@medusajs/framework/http"
import { validateAndTransformQuery } from "@medusajs/framework"
import { listTransformQueryConfig } from "./query-config"
import { StoreGetShippingOptions } from "./validators"
import {
StoreCalculateShippingOptionPrice,
StoreGetShippingOptions,
StoreGetShippingOptionsParams,
} from "./validators"
import * as QueryConfig from "./query-config"
export const storeShippingOptionRoutesMiddlewares: MiddlewareRoute[] = [
{
@@ -14,4 +22,15 @@ export const storeShippingOptionRoutesMiddlewares: MiddlewareRoute[] = [
),
],
},
{
method: ["POST"],
matcher: "/store/shipping-options/:id/calculate",
middlewares: [
validateAndTransformQuery(
StoreGetShippingOptionsParams,
QueryConfig.retrieveTransformQueryConfig
),
validateAndTransformBody(StoreCalculateShippingOptionPrice),
],
},
]
@@ -12,3 +12,8 @@ export const listTransformQueryConfig = {
defaultLimit: 20,
isList: true,
}
export const retrieveTransformQueryConfig = {
defaults: defaultStoreShippingOptionsFields,
isList: false,
}
@@ -1,6 +1,8 @@
import { z } from "zod"
import { applyAndAndOrOperators } from "../../utils/common-validators"
import { createFindParams } from "../../utils/validators"
import { createFindParams, createSelectParams } from "../../utils/validators"
export const StoreGetShippingOptionsParams = createSelectParams()
export const StoreGetShippingOptionsFields = z
.object({
@@ -18,3 +20,11 @@ export const StoreGetShippingOptions = createFindParams({
})
.merge(StoreGetShippingOptionsFields)
.merge(applyAndAndOrOperators(StoreGetShippingOptionsFields))
export type StoreCalculateShippingOptionPriceType = z.infer<
typeof StoreCalculateShippingOptionPrice
>
export const StoreCalculateShippingOptionPrice = z.object({
cart_id: z.string(),
data: z.record(z.string(), z.unknown()),
})