fix(medusa,js-sdk,types): Add basic draft order operations to js-sdk (#11514)

**What**
- Exposes `sdk.admin.draftOrder.create/update/retrieve/list` functions from the js-sdk
- Implements the necessary types in the types package.
- Adds missing endpoints to admin API.
This commit is contained in:
Kasper Fabricius Kristensen
2025-02-20 16:05:21 +00:00
committed by GitHub
parent 120e6f9ba6
commit 3b4997840e
17 changed files with 613 additions and 53 deletions
@@ -1,25 +1,56 @@
import { MedusaError } from "@medusajs/framework/utils"
import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
import { refetchOrder } from "../helpers"
import { defaultAdminOrderFields } from "../query-config"
import {
getOrderDetailWorkflow,
updateOrderWorkflow,
} from "@medusajs/core-flows"
import {
AuthenticatedMedusaRequest,
MedusaRequest,
MedusaResponse,
} from "@medusajs/framework/http"
import { HttpTypes } from "@medusajs/framework/types"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
import { AdminUpdateDraftOrderType } from "../validators"
export const GET = async (
req: MedusaRequest,
res: MedusaResponse<HttpTypes.AdminDraftOrderResponse>
) => {
const draftOrder = await refetchOrder(
req.params.id,
req.scope,
defaultAdminOrderFields
)
const workflow = getOrderDetailWorkflow(req.scope)
const { result } = await workflow.run({
input: {
fields: req.queryConfig.fields,
order_id: req.params.id,
version: req.validatedQuery.version as number,
filters: {
is_draft_order: true,
},
},
})
if (!draftOrder) {
throw new MedusaError(
MedusaError.Types.NOT_FOUND,
`Draft order with id: ${req.params.id} was not found`
)
}
res.status(200).json({ draft_order: draftOrder })
res.status(200).json({ draft_order: result as HttpTypes.AdminDraftOrder })
}
export const POST = async (
req: AuthenticatedMedusaRequest<AdminUpdateDraftOrderType>,
res: MedusaResponse<HttpTypes.AdminDraftOrderResponse>
) => {
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
await updateOrderWorkflow(req.scope).run({
input: {
...req.validatedBody,
user_id: req.auth_context.actor_id,
id: req.params.id,
},
})
const result = await query.graph({
entity: "order",
filters: { id: req.params.id },
fields: req.queryConfig.fields,
})
res
.status(200)
.json({ draft_order: result.data[0] as HttpTypes.AdminDraftOrder })
}
@@ -1,11 +1,14 @@
import {
validateAndTransformBody,
validateAndTransformQuery,
} from "@medusajs/framework"
import { MiddlewareRoute } from "@medusajs/framework/http"
import { validateAndTransformBody } from "@medusajs/framework"
import { validateAndTransformQuery } from "@medusajs/framework"
import * as QueryConfig from "./query-config"
import {
AdminCreateDraftOrder,
AdminGetOrderParams,
AdminGetOrdersParams,
AdminGetDraftOrderParams,
AdminGetDraftOrdersParams,
AdminUpdateDraftOrder,
} from "./validators"
export const adminDraftOrderRoutesMiddlewares: MiddlewareRoute[] = [
@@ -14,7 +17,7 @@ export const adminDraftOrderRoutesMiddlewares: MiddlewareRoute[] = [
matcher: "/admin/draft-orders",
middlewares: [
validateAndTransformQuery(
AdminGetOrdersParams,
AdminGetDraftOrdersParams,
QueryConfig.listTransformQueryConfig
),
],
@@ -24,7 +27,7 @@ export const adminDraftOrderRoutesMiddlewares: MiddlewareRoute[] = [
matcher: "/admin/draft-orders/:id",
middlewares: [
validateAndTransformQuery(
AdminGetOrderParams,
AdminGetDraftOrderParams,
QueryConfig.retrieveTransformQueryConfig
),
],
@@ -35,7 +38,18 @@ export const adminDraftOrderRoutesMiddlewares: MiddlewareRoute[] = [
middlewares: [
validateAndTransformBody(AdminCreateDraftOrder),
validateAndTransformQuery(
AdminGetOrderParams,
AdminGetDraftOrderParams,
QueryConfig.retrieveTransformQueryConfig
),
],
},
{
method: ["POST"],
matcher: "/admin/draft-orders/:id",
middlewares: [
validateAndTransformBody(AdminUpdateDraftOrder),
validateAndTransformQuery(
AdminGetDraftOrderParams,
QueryConfig.retrieveTransformQueryConfig
),
],
@@ -1,7 +1,10 @@
export const defaultAdminListOrderFields = [
"id",
"display_id",
"status",
"version",
"email",
"region_id",
"*items",
"summary",
"metadata",
@@ -11,8 +14,11 @@ export const defaultAdminListOrderFields = [
export const defaultAdminOrderFields = [
"id",
"display_id",
"status",
"version",
"email",
"region_id",
"*items",
"*items.tax_lines",
"*items.adjustments",
@@ -1,4 +1,7 @@
import { createOrderWorkflow } from "@medusajs/core-flows"
import {
createOrderWorkflow,
getOrdersListWorkflow,
} from "@medusajs/core-flows"
import {
AuthenticatedMedusaRequest,
MedusaRequest,
@@ -8,6 +11,7 @@ import {
AdditionalData,
CreateOrderDTO,
HttpTypes,
OrderDTO,
} from "@medusajs/framework/types"
import {
ContainerRegistrationKeys,
@@ -21,24 +25,28 @@ export const GET = async (
req: MedusaRequest<HttpTypes.AdminOrderFilters>,
res: MedusaResponse<HttpTypes.AdminDraftOrderListResponse>
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const variables = {
filters: {
...req.filterableFields,
is_draft_order: true,
},
...req.queryConfig.pagination,
}
const queryObject = remoteQueryObjectFromString({
entryPoint: "order",
variables: {
filters: {
...req.filterableFields,
is_draft_order: true,
},
...req.queryConfig.pagination,
const workflow = getOrdersListWorkflow(req.scope)
const { result } = await workflow.run({
input: {
fields: req.queryConfig.fields,
variables,
},
fields: req.queryConfig.fields,
})
const { rows: draft_orders, metadata } = await remoteQuery(queryObject)
const { rows, metadata } = result as {
rows: OrderDTO[]
metadata: any
}
res.json({
draft_orders,
draft_orders: rows as unknown as HttpTypes.AdminOrder[],
count: metadata.count,
offset: metadata.skip,
limit: metadata.take,
@@ -6,24 +6,34 @@ import {
} from "../../utils/common-validators"
import {
createFindParams,
createOperatorMap,
createSelectParams,
WithAdditionalData,
} from "../../utils/validators"
export type AdminGetOrderParamsType = z.infer<typeof AdminGetOrderParams>
export const AdminGetOrderParams = createSelectParams()
export type AdminGetDraftOrderParamsType = z.infer<
typeof AdminGetDraftOrderParams
>
export const AdminGetDraftOrderParams = createSelectParams()
export const AdminGetOrdersParamsFields = z.object({
const AdminGetDraftOrdersParamsFields = z.object({
id: z.union([z.string(), z.array(z.string())]).optional(),
created_at: createOperatorMap().optional(),
updated_at: createOperatorMap().optional(),
q: z.string().optional(),
region_id: z.union([z.string(), z.array(z.string())]).optional(),
sales_channel_id: z.array(z.string()).optional(),
})
export type AdminGetOrdersParamsType = z.infer<typeof AdminGetOrdersParams>
export const AdminGetOrdersParams = createFindParams({
export type AdminGetDraftOrdersParamsType = z.infer<
typeof AdminGetDraftOrdersParams
>
export const AdminGetDraftOrdersParams = createFindParams({
limit: 50,
offset: 0,
})
.merge(AdminGetOrdersParamsFields)
.merge(applyAndAndOrOperators(AdminGetOrdersParamsFields))
.merge(AdminGetDraftOrdersParamsFields)
.merge(applyAndAndOrOperators(AdminGetDraftOrdersParamsFields))
enum Status {
completed = "completed",
@@ -91,3 +101,11 @@ export const AdminCreateDraftOrder = WithAdditionalData(
)
}
)
export type AdminUpdateDraftOrderType = z.infer<typeof AdminUpdateDraftOrder>
export const AdminUpdateDraftOrder = z.object({
email: z.string().optional(),
shipping_address: AddressPayload.optional(),
billing_address: AddressPayload.optional(),
metadata: z.record(z.unknown()).nullish(),
})