feat(medusa, types, utils, core-flows, order) request & accept order transfer (#10106)

**What**
- add request order transfer workflow
- add admin endpoint for transferring an order to a customer
- accept order transfer storefront endpoint
- accept transfer workflow
- changes in the order module to introduce new change and action types

---

**Note**
- we return 400 instead 409 currently if there is already an active order edit, I will revisit this in a followup
- endpoint for requesting order transfer from the storefront will be added in a separate PR

---

RESOLVES CMRC-701
RESOLVES CMRC-703
RESOLVES CMRC-704
RESOLVES CMRC-705
This commit is contained in:
Frane Polić
2024-11-19 08:53:22 +00:00
committed by GitHub
parent b1b7a4abf1
commit 36460a3a07
21 changed files with 660 additions and 4 deletions
@@ -0,0 +1,39 @@
import { requestOrderTransferWorkflow } from "@medusajs/core-flows"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "@medusajs/framework/http"
import { HttpTypes } from "@medusajs/framework/types"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/framework/utils"
import { AdminTransferOrderType } from "../../validators"
export const POST = async (
req: AuthenticatedMedusaRequest<AdminTransferOrderType>,
res: MedusaResponse<HttpTypes.AdminOrderResponse>
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = { id: req.params.id }
await requestOrderTransferWorkflow(req.scope).run({
input: {
order_id: req.params.id,
customer_id: req.validatedBody.customer_id,
logged_in_user: req.auth_context.actor_id,
description: req.validatedBody.description,
internal_note: req.validatedBody.internal_note,
},
})
const queryObject = remoteQueryObjectFromString({
entryPoint: "order",
variables,
fields: req.remoteQueryConfig.fields,
})
const [order] = await remoteQuery(queryObject)
res.status(200).json({ order })
}
@@ -14,6 +14,7 @@ import {
AdminOrderChanges,
AdminOrderCreateFulfillment,
AdminOrderCreateShipment,
AdminTransferOrder,
} from "./validators"
export const adminOrderRoutesMiddlewares: MiddlewareRoute[] = [
@@ -144,4 +145,15 @@ export const adminOrderRoutesMiddlewares: MiddlewareRoute[] = [
),
],
},
{
method: ["POST"],
matcher: "/admin/orders/:id/transfer",
middlewares: [
validateAndTransformBody(AdminTransferOrder),
validateAndTransformQuery(
AdminGetOrdersOrderParams,
QueryConfig.retrieveTransformQueryConfig
),
],
},
]
@@ -120,3 +120,10 @@ export type AdminMarkOrderFulfillmentDeliveredType = z.infer<
typeof AdminMarkOrderFulfillmentDelivered
>
export const AdminMarkOrderFulfillmentDelivered = z.object({})
export type AdminTransferOrderType = z.infer<typeof AdminTransferOrder>
export const AdminTransferOrder = z.object({
customer_id: z.string(),
description: z.string().optional(),
internal_note: z.string().optional(),
})
@@ -0,0 +1,29 @@
import { AuthenticatedMedusaRequest, MedusaResponse } from "@medusajs/framework"
import { HttpTypes } from "@medusajs/framework/types"
import {
acceptOrderTransferWorkflow,
getOrderDetailWorkflow,
} from "@medusajs/core-flows"
import { StoreAcceptOrderTransferType } from "../../../validators"
export const POST = async (
req: AuthenticatedMedusaRequest<StoreAcceptOrderTransferType>,
res: MedusaResponse<HttpTypes.StoreOrderResponse>
) => {
await acceptOrderTransferWorkflow(req.scope).run({
input: {
order_id: req.params.id,
token: req.validatedBody.token,
},
})
const { result } = await getOrderDetailWorkflow(req.scope).run({
input: {
fields: req.remoteQueryConfig.fields,
order_id: req.params.id,
},
})
res.status(200).json({ order: result as HttpTypes.StoreOrder })
}
@@ -1,8 +1,15 @@
import { MiddlewareRoute } from "@medusajs/framework/http"
import {
MiddlewareRoute,
validateAndTransformBody,
} from "@medusajs/framework/http"
import { authenticate } from "../../../utils/middlewares/authenticate-middleware"
import { validateAndTransformQuery } from "@medusajs/framework"
import * as QueryConfig from "./query-config"
import { StoreGetOrderParams, StoreGetOrdersParams } from "./validators"
import {
StoreGetOrderParams,
StoreGetOrdersParams,
StoreAcceptOrderTransfer,
} from "./validators"
export const storeOrderRoutesMiddlewares: MiddlewareRoute[] = [
{
@@ -26,4 +33,15 @@ export const storeOrderRoutesMiddlewares: MiddlewareRoute[] = [
),
],
},
{
method: ["POST"],
matcher: "/store/orders/:id/transfer/accept",
middlewares: [
validateAndTransformBody(StoreAcceptOrderTransfer),
validateAndTransformQuery(
StoreGetOrderParams,
QueryConfig.retrieveTransformQueryConfig
),
],
},
]
@@ -18,3 +18,11 @@ export const StoreGetOrdersParams = createFindParams({
.merge(applyAndAndOrOperators(StoreGetOrdersParamsFields))
export type StoreGetOrdersParamsType = z.infer<typeof StoreGetOrdersParams>
export const StoreAcceptOrderTransfer = z.object({
token: z.string().min(1),
})
export type StoreAcceptOrderTransferType = z.infer<
typeof StoreAcceptOrderTransfer
>