feat: Admin Shipping Profiles API (#7019)

This commit is contained in:
Oli Juhl
2024-04-09 11:03:37 +02:00
committed by GitHub
parent fbc2959b37
commit dbddfc12ed
21 changed files with 520 additions and 400 deletions
@@ -40,7 +40,7 @@ export const GET = async (
if (!service_zone) {
throw new MedusaError(
MedusaError.Types.NOT_FOUND,
`Service zone with id ${req.params.zone_id} not found`
`Service zone with id: ${req.params.zone_id} not found`
)
}
@@ -0,0 +1,26 @@
import { AdminShippingProfileResponse } from "@medusajs/types"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../types/routing"
export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse<AdminShippingProfileResponse>
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const query = remoteQueryObjectFromString({
entryPoint: "shipping_profiles",
variables: { id: req.params.id },
fields: req.remoteQueryConfig.fields,
})
const [shippingProfile] = await remoteQuery(query)
res.status(200).json({ shipping_profile: shippingProfile })
}
@@ -0,0 +1,51 @@
import { MiddlewareRoute } from "../../../loaders/helpers/routing/types"
import { authenticate } from "../../../utils/authenticate-middleware"
import { validateAndTransformBody } from "../../utils/validate-body"
import { validateAndTransformQuery } from "../../utils/validate-query"
import {
listTransformQueryConfig,
retrieveTransformQueryConfig,
} from "./query-config"
import {
AdminCreateShippingProfile,
AdminShippingProfileParams,
AdminShippingProfilesParams,
} from "./validators"
export const adminShippingProfilesMiddlewares: MiddlewareRoute[] = [
{
matcher: "/admin/shipping-profiles*",
middlewares: [authenticate("admin", ["bearer", "session", "api-key"])],
},
{
method: ["POST"],
matcher: "/admin/shipping-profiles",
middlewares: [
validateAndTransformQuery(
AdminShippingProfilesParams,
retrieveTransformQueryConfig
),
validateAndTransformBody(AdminCreateShippingProfile),
],
},
{
method: ["GET"],
matcher: "/admin/shipping-profiles",
middlewares: [
validateAndTransformQuery(
AdminShippingProfilesParams,
listTransformQueryConfig
),
],
},
{
method: ["GET"],
matcher: "/admin/shipping-profiles/:id",
middlewares: [
validateAndTransformQuery(
AdminShippingProfileParams,
retrieveTransformQueryConfig
),
],
},
]
@@ -0,0 +1,18 @@
export const defaultAdminShippingProfileFields = [
"id",
"name",
"type",
"metadata",
"created_at",
"updated_at",
]
export const retrieveTransformQueryConfig = {
defaults: defaultAdminShippingProfileFields,
isList: false,
}
export const listTransformQueryConfig = {
...retrieveTransformQueryConfig,
isList: true,
}
@@ -0,0 +1,71 @@
import { createShippingProfilesWorkflow } from "@medusajs/core-flows"
import {
AdminShippingProfileResponse,
AdminShippingProfilesResponse,
} from "@medusajs/types"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../types/routing"
import { AdminCreateShippingProfileType } from "./validators"
export const POST = async (
req: AuthenticatedMedusaRequest<AdminCreateShippingProfileType>,
res: MedusaResponse<AdminShippingProfileResponse>
) => {
const shippingProfilePayload = req.validatedBody
const { result, errors } = await createShippingProfilesWorkflow(
req.scope
).run({
input: { data: [shippingProfilePayload] },
throwOnError: false,
})
if (Array.isArray(errors) && errors[0]) {
throw errors[0].error
}
const shippingProfileId = result?.[0].id
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const query = remoteQueryObjectFromString({
entryPoint: "shipping_profiles",
variables: { id: shippingProfileId },
fields: req.remoteQueryConfig.fields,
})
const [shippingProfile] = await remoteQuery(query)
res.status(200).json({ shipping_profile: shippingProfile })
}
export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse<AdminShippingProfilesResponse>
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const query = remoteQueryObjectFromString({
entryPoint: "shipping_profiles",
variables: {
filters: req.filterableFields,
...req.remoteQueryConfig.pagination,
},
fields: req.remoteQueryConfig.fields,
})
const { rows: shippingProfiles, metadata } = await remoteQuery(query)
res.status(200).json({
shipping_profiles: shippingProfiles,
count: metadata.count,
offset: metadata.skip,
limit: metadata.take,
})
}
@@ -0,0 +1,25 @@
import { z } from "zod"
import { createFindParams, createSelectParams } from "../../utils/validators"
export const AdminShippingProfileParams = createSelectParams()
export const AdminShippingProfilesParams = createFindParams({
limit: 20,
offset: 0,
}).merge(
z.object({
type: z.string().optional(),
name: z.string().optional(),
})
)
export const AdminCreateShippingProfile = z
.object({
name: z.string(),
type: z.string(),
metadata: z.record(z.string(), z.unknown()).optional(),
})
.strict()
export type AdminCreateShippingProfileType = z.infer<
typeof AdminCreateShippingProfile
>
@@ -19,6 +19,7 @@ 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 { adminShippingProfilesMiddlewares } from "./admin/shipping-profiles/middlewares"
import { adminStockLocationRoutesMiddlewares } from "./admin/stock-locations/middlewares"
import { adminStoreRoutesMiddlewares } from "./admin/stores/middlewares"
import { adminTaxRateRoutesMiddlewares } from "./admin/tax-rates/middlewares"
@@ -69,5 +70,6 @@ export const config: MiddlewaresConfig = {
...adminUploadRoutesMiddlewares,
...adminFulfillmentSetsRoutesMiddlewares,
...adminProductCategoryRoutesMiddlewares,
...adminShippingProfilesMiddlewares,
],
}
-1
View File
@@ -2,7 +2,6 @@ export * from "./api"
export * from "./api-v2"
export * from "./api/middlewares"
export * from "./interfaces"
export * from "./joiner-config"
export * from "./models"
export * from "./modules-config"
export * from "./services"
-5
View File
@@ -1,5 +0,0 @@
import * as joinerConfigs from "./joiner-configs"
export const joinerConfig = Object.values(joinerConfigs).map(
(config) => config.default
)
@@ -1 +0,0 @@
export * as shippingProfile from "./shipping-profile-service"
@@ -1,29 +0,0 @@
import { ModuleJoinerConfig } from "@medusajs/types"
export default {
serviceName: "shippingProfileService",
primaryKeys: ["id"],
linkableKeys: { profile_id: "ShippingProfile" },
schema: `
scalar Date
scalar JSON
type ShippingProfile {
id: ID!
name: String!
type: String!
created_at: Date!
updated_at: Date!
deleted_at: Date
metadata: JSON
}
`,
alias: [
{
name: ["shipping_profile", "shipping_profiles"],
args: {
entity: "ShippingProfile",
},
},
],
} as ModuleJoinerConfig
+10 -14
View File
@@ -1,3 +1,12 @@
import {
MODULE_PACKAGE_NAMES,
MedusaApp,
MedusaAppMigrateUp,
MedusaAppOutput,
MedusaModule,
Modules,
ModulesDefinition,
} from "@medusajs/modules-sdk"
import {
CommonTypes,
InternalModuleDeclaration,
@@ -8,21 +17,11 @@ import {
import {
ContainerRegistrationKeys,
FlagRouter,
isObject,
MedusaV2Flag,
isObject,
} from "@medusajs/utils"
import {
MedusaApp,
MedusaAppMigrateUp,
MedusaAppOutput,
MedusaModule,
MODULE_PACKAGE_NAMES,
Modules,
ModulesDefinition,
} from "@medusajs/modules-sdk"
import { asValue } from "awilix"
import { joinerConfig } from "../joiner-config"
import { remoteQueryFetchData } from "../utils/remote-query-fetch-data"
export function mergeDefaultModules(
@@ -101,7 +100,6 @@ export async function migrateMedusaApp(
await MedusaAppMigrateUp({
modulesConfig: configModules,
servicesConfig: joinerConfig,
remoteFetchData: remoteQueryFetchData(container),
sharedContainer: container,
sharedResourcesConfig,
@@ -170,7 +168,6 @@ export const loadMedusaApp = async (
const medusaApp = await MedusaApp({
workerMode: configModule.projectConfig.worker_mode,
modulesConfig: configModules,
servicesConfig: joinerConfig,
remoteFetchData: remoteQueryFetchData(container),
sharedContainer: container,
sharedResourcesConfig,
@@ -291,7 +288,6 @@ export async function runModulesLoader({
await MedusaApp({
modulesConfig: configModules,
servicesConfig: joinerConfig,
remoteFetchData: remoteQueryFetchData(container),
sharedContainer: container,
sharedResourcesConfig,