chore(types, api): support shipping option type api endpoints (#13191)

* chore(types, api): support shipping option type api endpoints

* core flows

* api

* typos

* compiler errors

* integration tests

* remove metadata

* changeset

* modify test

* upsert

* change remote query

* minor to patch

* description optional

* description optional

* woops my bad

* my bad again

---------

Co-authored-by: william bouchard <williambouchard@williams-MacBook-Pro.local>
This commit is contained in:
William Bouchardandwilliam bouchard authored and GitHub committed 2025-08-14 10:15:51 -04:00
1 parent aa27240b7f
commit 34c3c14e0a
29 files changed
+1240 -105

No files matched your search

@@ -0,0 +1,79 @@
import {
deleteShippingOptionTypesWorkflow,
updateShippingOptionTypesWorkflow,
} from "@medusajs/core-flows"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "@medusajs/framework/http"
import { refetchShippingOptionType } from "../helpers"
import {
AdminGetShippingOptionTypeParamsType,
AdminUpdateShippingOptionTypeType,
} from "../validators"
import { HttpTypes } from "@medusajs/framework/types"
import { MedusaError } from "@medusajs/framework/utils"
export const GET = async (
req: AuthenticatedMedusaRequest<AdminGetShippingOptionTypeParamsType>,
res: MedusaResponse<HttpTypes.AdminShippingOptionTypeResponse>
) => {
const shippingOptionType = await refetchShippingOptionType(
req.params.id,
req.scope,
req.queryConfig.fields
)
res.status(200).json({ shipping_option_type: shippingOptionType })
}
export const POST = async (
req: AuthenticatedMedusaRequest<AdminUpdateShippingOptionTypeType>,
res: MedusaResponse<HttpTypes.AdminShippingOptionTypeResponse>
) => {
const existingShippingOptionType = await refetchShippingOptionType(
req.params.id,
req.scope,
["id"]
)
if (!existingShippingOptionType) {
throw new MedusaError(
MedusaError.Types.NOT_FOUND,
`Shipping option type with id "${req.params.id}" not found`
)
}
const { result } = await updateShippingOptionTypesWorkflow(req.scope).run({
input: {
selector: { id: req.params.id },
update: req.validatedBody,
},
})
const shippingOptionType = await refetchShippingOptionType(
result[0].id,
req.scope,
req.queryConfig.fields
)
res.status(200).json({ shipping_option_type: shippingOptionType })
}
export const DELETE = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse<HttpTypes.AdminShippingOptionTypeDeleteResponse>
) => {
const id = req.params.id
await deleteShippingOptionTypesWorkflow(req.scope).run({
input: { ids: [id] },
})
res.status(200).json({
id,
object: "shipping_option_type",
deleted: true,
})
}
@@ -0,0 +1,16 @@
import { MedusaContainer } from "@medusajs/framework/types"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
export const refetchShippingOptionType = async (
shippingOptionTypeId: string,
scope: MedusaContainer,
fields: string[]
) => {
const query = scope.resolve(ContainerRegistrationKeys.QUERY)
const { data: shippingOptionTypes } = await query.graph({
entity: "shipping_option_type",
fields: fields,
filters: { id: shippingOptionTypeId },
})
return shippingOptionTypes[0]
}
@@ -0,0 +1,62 @@
import * as QueryConfig from "./query-config"
import { MiddlewareRoute } from "@medusajs/framework/http"
import {
validateAndTransformBody,
validateAndTransformQuery,
} from "@medusajs/framework"
import {
AdminCreateShippingOptionType,
AdminGetShippingOptionTypeParams,
AdminGetShippingOptionTypesParams,
AdminUpdateShippingOptionType,
} from "./validators"
export const adminShippingOptionTypeRoutesMiddlewares: MiddlewareRoute[] = [
{
method: ["GET"],
matcher: "/admin/shipping-option-types",
middlewares: [
validateAndTransformQuery(
AdminGetShippingOptionTypesParams,
QueryConfig.listShippingOptionTypesTransformQueryConfig
),
],
},
{
method: ["GET"],
matcher: "/admin/shipping-option-types/:id",
middlewares: [
validateAndTransformQuery(
AdminGetShippingOptionTypeParams,
QueryConfig.retrieveShippingOptionTypeTransformQueryConfig
),
],
},
{
method: ["POST"],
matcher: "/admin/shipping-option-types",
middlewares: [
validateAndTransformBody(AdminCreateShippingOptionType),
validateAndTransformQuery(
AdminGetShippingOptionTypeParams,
QueryConfig.retrieveShippingOptionTypeTransformQueryConfig
),
],
},
{
method: ["POST"],
matcher: "/admin/shipping-option-types/:id",
middlewares: [
validateAndTransformBody(AdminUpdateShippingOptionType),
validateAndTransformQuery(
AdminGetShippingOptionTypeParams,
QueryConfig.retrieveShippingOptionTypeTransformQueryConfig
),
],
},
{
method: ["DELETE"],
matcher: "/admin/shipping-option-types/:id",
middlewares: [],
},
]
@@ -0,0 +1,19 @@
export const defaultAdminShippingOptionTypeFields = [
"id",
"label",
"code",
"description",
"created_at",
"updated_at",
]
export const retrieveShippingOptionTypeTransformQueryConfig = {
defaults: defaultAdminShippingOptionTypeFields,
isList: false,
}
export const listShippingOptionTypesTransformQueryConfig = {
...retrieveShippingOptionTypeTransformQueryConfig,
defaultLimit: 20,
isList: true,
}
@@ -0,0 +1,49 @@
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "@medusajs/framework/http"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
import { createShippingOptionTypesWorkflow } from "@medusajs/core-flows"
import { refetchShippingOptionType } from "./helpers"
import { HttpTypes } from "@medusajs/framework/types"
export const GET = async (
req: AuthenticatedMedusaRequest<HttpTypes.AdminShippingOptionTypeListParams>,
res: MedusaResponse<HttpTypes.AdminShippingOptionTypeListResponse>
) => {
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
const { data: shippingOptionTypes, metadata } = await query.graph({
entity: "shipping_option_type",
fields: req.queryConfig.fields,
filters: req.filterableFields,
pagination: req.queryConfig.pagination,
})
res.json({
shipping_option_types: shippingOptionTypes,
count: metadata!.count,
offset: metadata!.skip,
limit: metadata!.take,
})
}
export const POST = async (
req: AuthenticatedMedusaRequest<HttpTypes.AdminCreateShippingOptionType>,
res: MedusaResponse<HttpTypes.AdminShippingOptionTypeResponse>
) => {
const input = [req.validatedBody]
const { result } = await createShippingOptionTypesWorkflow(req.scope).run({
input: { shipping_option_types: input },
})
const shippingOptionType = await refetchShippingOptionType(
result[0].id,
req.scope,
req.queryConfig.fields
)
res.status(200).json({ shipping_option_type: shippingOptionType })
}
@@ -0,0 +1,55 @@
import { z } from "zod"
import {
createFindParams,
createOperatorMap,
createSelectParams,
} from "../../utils/validators"
import { applyAndAndOrOperators } from "../../utils/common-validators"
export type AdminGetShippingOptionTypeParamsType = z.infer<
typeof AdminGetShippingOptionTypeParams
>
export const AdminGetShippingOptionTypeParams = createSelectParams()
export const AdminGetShippingOptionTypesParamsFields = z.object({
q: z.string().optional(),
id: z.union([z.string(), z.array(z.string())]).optional(),
label: z.union([z.string(), z.array(z.string())]).optional(),
code: z.union([z.string(), z.array(z.string())]).optional(),
description: z.union([z.string(), z.array(z.string())]).optional(),
created_at: createOperatorMap().optional(),
updated_at: createOperatorMap().optional(),
deleted_at: createOperatorMap().optional(),
})
export type AdminGetShippingOptionTypesParamsType = z.infer<
typeof AdminGetShippingOptionTypesParams
>
export const AdminGetShippingOptionTypesParams = createFindParams({
limit: 10,
offset: 0,
})
.merge(AdminGetShippingOptionTypesParamsFields)
.merge(applyAndAndOrOperators(AdminGetShippingOptionTypesParamsFields))
export type AdminCreateShippingOptionTypeType = z.infer<
typeof AdminCreateShippingOptionType
>
export const AdminCreateShippingOptionType = z
.object({
label: z.string(),
code: z.string(),
description: z.string().optional(),
})
.strict()
export type AdminUpdateShippingOptionTypeType = z.infer<
typeof AdminUpdateShippingOptionType
>
export const AdminUpdateShippingOptionType = z
.object({
label: z.string().optional(),
code: z.string().optional(),
description: z.string().optional(),
})
.strict()
@@ -79,7 +79,7 @@ export const AdminUpdateShippingOptionRule = z
export const AdminCreateShippingOptionTypeObject = z
.object({
label: z.string(),
description: z.string(),
description: z.string().optional(),
code: z.string(),
})
.strict()
+2
View File
@@ -60,6 +60,7 @@ import { storeProductRoutesMiddlewares } from "./store/products/middlewares"
import { storeRegionRoutesMiddlewares } from "./store/regions/middlewares"
import { storeReturnReasonRoutesMiddlewares } from "./store/return-reasons/middlewares"
import { storeShippingOptionRoutesMiddlewares } from "./store/shipping-options/middlewares"
import { adminShippingOptionTypeRoutesMiddlewares } from "./admin/shipping-option-types/middlewares"
export default defineMiddlewares([
...storeRoutesMiddlewares,
@@ -103,6 +104,7 @@ export default defineMiddlewares([
...adminDraftOrderRoutesMiddlewares,
...adminSalesChannelRoutesMiddlewares,
...adminStockLocationRoutesMiddlewares,
...adminShippingOptionTypeRoutesMiddlewares,
...adminProductTypeRoutesMiddlewares,
...adminProductTagRoutesMiddlewares,
...adminUploadRoutesMiddlewares,