feat(order): fulfillment workflow (#7385)

FIXES: CORE-2162 CORE-2167 CORE-2041
This commit is contained in:
Carlos R. L. Rodrigues
2024-05-27 12:49:33 +00:00
committed by GitHub
parent 639758ffec
commit 62ef82f497
43 changed files with 1730 additions and 195 deletions
@@ -1,5 +1,8 @@
import { archiveOrderWorkflow } from "@medusajs/core-flows"
import { remoteQueryObjectFromString } from "@medusajs/utils"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
@@ -10,7 +13,7 @@ export const POST = async (
req: AuthenticatedMedusaRequest<AdminArchiveOrderType>,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve("remoteQuery")
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const { id } = req.params
await archiveOrderWorkflow(req.scope).run({
@@ -1,4 +1,7 @@
import { remoteQueryObjectFromString } from "@medusajs/utils"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
@@ -8,7 +11,7 @@ export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve("remoteQuery")
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = { id: req.params.id }
@@ -1,5 +1,8 @@
import { completeOrderWorkflow } from "@medusajs/core-flows"
import { remoteQueryObjectFromString } from "@medusajs/utils"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
@@ -10,7 +13,7 @@ export const POST = async (
req: AuthenticatedMedusaRequest<AdminCompleteOrderType>,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve("remoteQuery")
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const { id } = req.params
await completeOrderWorkflow(req.scope).run({
@@ -1,14 +1,17 @@
import { remoteQueryObjectFromString } from "@medusajs/utils"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../../../types/routing"
} from "../../../../../../../types/routing"
export const POST = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve("remoteQuery")
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = { id: req.params.id }
@@ -0,0 +1,44 @@
import { createOrderShipmentWorkflow } from "@medusajs/core-flows"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../../../../types/routing"
import { AdminOrderCreateShipmentType } from "../../../../validators"
export const POST = async (
req: AuthenticatedMedusaRequest<AdminOrderCreateShipmentType>,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = { id: req.params.id }
const input = {
...req.validatedBody,
order_id: req.params.id,
fulfillment_id: req.params.fulfillment_id,
labels: req.validatedBody.labels ?? [],
}
const { errors } = await createOrderShipmentWorkflow(req.scope).run({
input,
throwOnError: false,
})
if (Array.isArray(errors) && errors[0]) {
throw errors[0].error
}
const queryObject = remoteQueryObjectFromString({
entryPoint: "order",
variables,
fields: req.remoteQueryConfig.fields,
})
const [order] = await remoteQuery(queryObject)
res.status(200).json({ order })
}
@@ -0,0 +1,42 @@
import { createOrderFulfillmentWorkflow } from "@medusajs/core-flows"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../../types/routing"
import { AdminOrderCreateFulfillmentType } from "../../validators"
export const POST = async (
req: AuthenticatedMedusaRequest<AdminOrderCreateFulfillmentType>,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = { id: req.params.id }
const input = {
...req.validatedBody,
order_id: req.params.id,
}
const { errors } = await createOrderFulfillmentWorkflow(req.scope).run({
input,
throwOnError: false,
})
if (Array.isArray(errors) && errors[0]) {
throw errors[0].error
}
const queryObject = remoteQueryObjectFromString({
entryPoint: "order",
variables,
fields: req.remoteQueryConfig.fields,
})
const [order] = await remoteQuery(queryObject)
res.status(200).json({ order })
}
@@ -1,4 +1,7 @@
import { remoteQueryObjectFromString } from "@medusajs/utils"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
@@ -8,7 +11,7 @@ export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve("remoteQuery")
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = { id: req.params.id }
@@ -26,7 +29,7 @@ export const POST = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve("remoteQuery")
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = { id: req.params.id }
@@ -1,25 +0,0 @@
import { remoteQueryObjectFromString } from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../types/routing"
export const POST = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve("remoteQuery")
const variables = { id: req.params.id }
// TODO: Workflow fulfill items, create fulfillments - v1.x - packages/medusa/src/api/routes/admin/orders/create-fulfillment.ts
const queryObject = remoteQueryObjectFromString({
entryPoint: "order",
variables,
fields: req.remoteQueryConfig.fields,
})
const [order] = await remoteQuery(queryObject)
res.status(200).json({ order })
}
@@ -8,6 +8,7 @@ import {
AdminCompleteOrder,
AdminGetOrdersOrderParams,
AdminGetOrdersParams,
AdminOrderCreateFulfillment,
} from "./validators"
export const adminOrderRoutesMiddlewares: MiddlewareRoute[] = [
@@ -74,7 +75,7 @@ export const adminOrderRoutesMiddlewares: MiddlewareRoute[] = [
method: ["POST"],
matcher: "/admin/orders/:id/fulfillments",
middlewares: [
// validateAndTransformBody(),
validateAndTransformBody(AdminOrderCreateFulfillment),
validateAndTransformQuery(
AdminGetOrdersOrderParams,
QueryConfig.retrieveTransformQueryConfig
@@ -46,3 +46,36 @@ export const AdminCompleteOrder = z.object({
order_id: z.string(),
})
export type AdminCompleteOrderType = z.infer<typeof AdminArchiveOrder>
const Item = z.object({
id: z.string(),
quantity: z.number(),
})
export const AdminOrderCreateFulfillment = z.object({
items: z.array(Item),
location_id: z.string().optional(),
no_notification: z.boolean().optional(),
metadata: z.record(z.unknown()).optional(),
})
export type AdminOrderCreateFulfillmentType = z.infer<
typeof AdminOrderCreateFulfillment
>
const Label = z.object({
tracking_number: z.string(),
tracking_url: z.string(),
label_url: z.string(),
})
export const AdminOrderCreateShipment = z.object({
items: z.array(Item),
labels: z.array(Label).optional(),
no_notification: z.boolean().optional(),
metadata: z.record(z.unknown()).optional(),
})
export type AdminOrderCreateShipmentType = z.infer<
typeof AdminOrderCreateShipment
>