feat(medusa, core-flows): Create service zones (#6979)

This commit is contained in:
Oli Juhl
2024-04-06 21:31:23 +02:00
committed by GitHub
parent e8587e9f95
commit 81ea044f31
14 changed files with 509 additions and 15 deletions
@@ -0,0 +1,45 @@
import { createServiceZonesWorkflow } from "@medusajs/core-flows"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import { MedusaRequest, MedusaResponse } from "../../../../../types/routing"
import { AdminCreateFulfillmentSetServiceZonesType } from "../../validators"
export const POST = async (
req: MedusaRequest<AdminCreateFulfillmentSetServiceZonesType>,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const workflowInput = {
data: [
{
fulfillment_set_id: req.params.id,
name: req.validatedBody.name,
geo_zones: req.validatedBody.geo_zones,
},
],
}
const { errors } = await createServiceZonesWorkflow(req.scope).run({
input: workflowInput,
throwOnError: false,
})
if (Array.isArray(errors) && errors[0]) {
throw errors[0].error
}
const [fulfillment_set] = await remoteQuery(
remoteQueryObjectFromString({
entryPoint: "fulfillment_sets",
variables: {
id: req.params.id,
},
fields: req.remoteQueryConfig.fields,
})
)
res.status(200).json({ fulfillment_set })
}
@@ -0,0 +1,28 @@
import { MiddlewareRoute } from "../../../types/middlewares"
import { authenticate } from "../../../utils/authenticate-middleware"
import { validateAndTransformBody } from "../../utils/validate-body"
import { validateAndTransformQuery } from "../../utils/validate-query"
import * as QueryConfig from "./query-config"
import {
AdminCreateFulfillmentSetServiceZonesSchema,
AdminFulfillmentSetParams
} from "./validators"
export const adminFulfillmentSetsRoutesMiddlewares: MiddlewareRoute[] = [
{
method: "ALL",
matcher: "/admin/fulfillment-sets*",
middlewares: [authenticate("admin", ["session", "bearer", "api-key"])],
},
{
method: ["POST"],
matcher: "/admin/fulfillment-sets/:id/service-zones",
middlewares: [
validateAndTransformBody(AdminCreateFulfillmentSetServiceZonesSchema),
validateAndTransformQuery(
AdminFulfillmentSetParams,
QueryConfig.retrieveTransformQueryConfig
),
],
},
]
@@ -0,0 +1,20 @@
export const defaultAdminFulfillmentSetsFields = [
"id",
"name",
"type",
"created_at",
"updated_at",
"deleted_at",
"*service_zones",
"*service_zones.geo_zones",
]
export const retrieveTransformQueryConfig = {
defaults: defaultAdminFulfillmentSetsFields,
isList: false,
}
export const listTransformQueryConfig = {
...retrieveTransformQueryConfig,
isList: true,
}
@@ -0,0 +1,73 @@
import { z } from "zod"
import { createFindParams, createOperatorMap } from "../../utils/validators"
const geoZoneBaseSchema = z.object({
country_code: z.string(),
metadata: z.record(z.unknown()).optional(),
})
const geoZoneCountrySchema = geoZoneBaseSchema.merge(
z.object({
type: z.literal("country"),
})
)
const geoZoneProvinceSchema = geoZoneBaseSchema.merge(
z.object({
type: z.literal("province"),
province_code: z.string(),
})
)
const geoZoneCitySchema = geoZoneBaseSchema.merge(
z.object({
type: z.literal("city"),
province_code: z.string(),
city: z.string(),
})
)
const geoZoneZipSchema = geoZoneBaseSchema.merge(
z.object({
type: z.literal("zip"),
province_code: z.string(),
city: z.string(),
postal_expression: z.record(z.unknown()),
})
)
export const AdminCreateFulfillmentSetServiceZonesSchema = z
.object({
name: z.string(),
geo_zones: z.array(
z.union([
geoZoneCountrySchema,
geoZoneProvinceSchema,
geoZoneCitySchema,
geoZoneZipSchema,
])
),
})
.strict()
export type AdminCreateFulfillmentSetServiceZonesType = z.infer<
typeof AdminCreateFulfillmentSetServiceZonesSchema
>
export type AdminFulfillmentSetParamsType = z.infer<
typeof AdminFulfillmentSetParams
>
export const AdminFulfillmentSetParams = createFindParams({
limit: 20,
offset: 0,
}).merge(
z.object({
id: z.union([z.string(), z.array(z.string())]).optional(),
name: z.union([z.string(), z.array(z.string())]).optional(),
type: z.union([z.string(), z.array(z.string())]).optional(),
service_zone_id: z.union([z.string(), z.array(z.string())]).optional(),
created_at: createOperatorMap().optional(),
updated_at: createOperatorMap().optional(),
deleted_at: createOperatorMap().optional(),
})
)
@@ -1,6 +1,9 @@
import * as QueryConfig from "./query-config"
import { transformBody, transformQuery } from "../../../api/middlewares"
import { MiddlewareRoute } from "../../../types/middlewares"
import { authenticate } from "../../../utils/authenticate-middleware"
import { maybeApplyLinkFilter } from "../../utils/maybe-apply-link-filter"
import { validateAndTransformBody } from "../../utils/validate-body"
import * as QueryConfig from "./query-config"
import {
AdminCreateStockLocationFulfillmentSet,
AdminGetStockLocationsLocationParams,
@@ -12,11 +15,6 @@ import {
AdminStockLocationsLocationSalesChannelBatchReq,
} from "./validators"
import { MiddlewareRoute } from "../../../types/middlewares"
import { authenticate } from "../../../utils/authenticate-middleware"
import { maybeApplyLinkFilter } from "../../utils/maybe-apply-link-filter"
import { validateAndTransformBody } from "../../utils/validate-body"
export const adminStockLocationRoutesMiddlewares: MiddlewareRoute[] = [
{
method: "ALL",
+4 -2
View File
@@ -5,18 +5,19 @@ import { adminCollectionRoutesMiddlewares } from "./admin/collections/middleware
import { adminCurrencyRoutesMiddlewares } from "./admin/currencies/middlewares"
import { adminCustomerGroupRoutesMiddlewares } from "./admin/customer-groups/middlewares"
import { adminCustomerRoutesMiddlewares } from "./admin/customers/middlewares"
import { adminShippingOptionRoutesMiddlewares } from "./admin/shipping-options/middlewares"
import { adminDraftOrderRoutesMiddlewares } from "./admin/draft-orders/middlewares"
import { adminFulfillmentSetsRoutesMiddlewares } from "./admin/fulfillment-sets/middlewares"
import { adminInventoryRoutesMiddlewares } from "./admin/inventory-items/middlewares"
import { adminInviteRoutesMiddlewares } from "./admin/invites/middlewares"
import { adminPaymentRoutesMiddlewares } from "./admin/payments/middlewares"
import { adminPriceListsRoutesMiddlewares } from "./admin/price-lists/middlewares"
import { adminPricingRoutesMiddlewares } from "./admin/pricing/middlewares"
import { adminProductRoutesMiddlewares } from "./admin/products/middlewares"
import { adminProductTypeRoutesMiddlewares } from "./admin/product-types/middlewares"
import { adminProductRoutesMiddlewares } from "./admin/products/middlewares"
import { adminPromotionRoutesMiddlewares } from "./admin/promotions/middlewares"
import { adminRegionRoutesMiddlewares } from "./admin/regions/middlewares"
import { adminSalesChannelRoutesMiddlewares } from "./admin/sales-channels/middlewares"
import { adminShippingOptionRoutesMiddlewares } from "./admin/shipping-options/middlewares"
import { adminStockLocationRoutesMiddlewares } from "./admin/stock-locations/middlewares"
import { adminStoreRoutesMiddlewares } from "./admin/stores/middlewares"
import { adminTaxRateRoutesMiddlewares } from "./admin/tax-rates/middlewares"
@@ -65,5 +66,6 @@ export const config: MiddlewaresConfig = {
...adminStockLocationRoutesMiddlewares,
...adminProductTypeRoutesMiddlewares,
...adminUploadRoutesMiddlewares,
...adminFulfillmentSetsRoutesMiddlewares,
],
}