feat: Categories retrieve + list API (#7009)

This commit is contained in:
Oli Juhl authored and GitHub committed 2024-04-08 19:26:34 +02:00
1 parent db2f0ef53f
commit 6cc9a5e469
41 files changed
+1176 -35

No files matched your search

@@ -0,0 +1,30 @@
import { AdminProductCategoryResponse } from "@medusajs/types"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../types/routing"
import { AdminProductCategoryParamsType } from "../validators"
export const GET = async (
req: AuthenticatedMedusaRequest<AdminProductCategoryParamsType>,
res: MedusaResponse<AdminProductCategoryResponse>
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const queryObject = remoteQueryObjectFromString({
entryPoint: "product_category",
variables: {
filters: req.filterableFields,
id: req.params.id,
},
fields: req.remoteQueryConfig.fields,
})
const [product_category] = await remoteQuery(queryObject)
res.json({ product_category })
}
@@ -0,0 +1,36 @@
import { MiddlewareRoute } from "../../../loaders/helpers/routing/types"
import { authenticate } from "../../../utils/authenticate-middleware"
import { validateAndTransformQuery } from "../../utils/validate-query"
import * as QueryConfig from "./query-config"
import {
AdminProductCategoriesParams,
AdminProductCategoryParams,
} from "./validators"
export const adminProductCategoryRoutesMiddlewares: MiddlewareRoute[] = [
{
method: ["ALL"],
matcher: "/admin/product-categories*",
middlewares: [authenticate("admin", ["bearer", "session", "api-key"])],
},
{
method: ["GET"],
matcher: "/admin/product-categories",
middlewares: [
validateAndTransformQuery(
AdminProductCategoriesParams,
QueryConfig.listProductCategoryConfig
),
],
},
{
method: ["GET"],
matcher: "/admin/product-categories/:id",
middlewares: [
validateAndTransformQuery(
AdminProductCategoryParams,
QueryConfig.retrieveProductCategoryConfig
),
],
},
]
@@ -0,0 +1,29 @@
export const defaults = [
"id",
"name",
"description",
"handle",
"is_active",
"is_internal",
"rank",
"parent_category_id",
"created_at",
"updated_at",
"metadata",
"parent_category.id",
"parent_category.name",
"category_children.id",
"category_children.name",
]
export const retrieveProductCategoryConfig = {
defaults,
isList: false,
}
export const listProductCategoryConfig = {
defaults,
defaultLimit: 50,
isList: true,
}
@@ -0,0 +1,35 @@
import { AdminProductCategoryListResponse } from "@medusajs/types"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../types/routing"
import { AdminProductCategoriesParamsType } from "./validators"
export const GET = async (
req: AuthenticatedMedusaRequest<AdminProductCategoriesParamsType>,
res: MedusaResponse<AdminProductCategoryListResponse>
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const queryObject = remoteQueryObjectFromString({
entryPoint: "product_category",
variables: {
filters: req.filterableFields,
...req.remoteQueryConfig.pagination,
},
fields: req.remoteQueryConfig.fields,
})
const { rows: product_categories, metadata } = await remoteQuery(queryObject)
res.json({
product_categories,
count: metadata.count,
offset: metadata.skip,
limit: metadata.take,
})
}
@@ -0,0 +1,52 @@
import { z } from "zod"
import { optionalBooleanMapper } from "../../../utils/validators/is-boolean"
import {
createFindParams,
createOperatorMap,
createSelectParams,
} from "../../utils/validators"
export type AdminProductCategoryParamsType = z.infer<
typeof AdminProductCategoryParams
>
export const AdminProductCategoryParams = createSelectParams().merge(
z.object({
include_ancestors_tree: z.preprocess(
(val: any) => optionalBooleanMapper.get(val?.toLowerCase()),
z.boolean().optional()
),
include_descendants_tree: z.preprocess(
(val: any) => optionalBooleanMapper.get(val?.toLowerCase()),
z.boolean().optional()
),
})
)
export type AdminProductCategoriesParamsType = z.infer<
typeof AdminProductCategoriesParams
>
export const AdminProductCategoriesParams = createFindParams({
offset: 0,
limit: 50,
}).merge(
z.object({
q: z.string().optional(),
id: z.union([z.string(), z.array(z.string())]).optional(),
description: z.union([z.string(), z.array(z.string())]).optional(),
handle: z.union([z.string(), z.array(z.string())]).optional(),
parent_category_id: z.union([z.string(), z.array(z.string())]).optional(),
include_ancestors_tree: z.preprocess(
(val: any) => optionalBooleanMapper.get(val?.toLowerCase()),
z.boolean().optional()
),
include_descendants_tree: z.preprocess(
(val: any) => optionalBooleanMapper.get(val?.toLowerCase()),
z.boolean().optional()
),
created_at: createOperatorMap().optional(),
updated_at: createOperatorMap().optional(),
deleted_at: createOperatorMap().optional(),
$and: z.lazy(() => AdminProductCategoriesParams.array()).optional(),
$or: z.lazy(() => AdminProductCategoriesParams.array()).optional(),
})
)
@@ -1,11 +1,11 @@
import { ProductStatus } from "@medusajs/utils"
import { z } from "zod"
import { optionalBooleanMapper } from "../../../utils/validators/is-boolean"
import {
createFindParams,
createOperatorMap,
createSelectParams,
} from "../../utils/validators"
import { optionalBooleanMapper } from "../../../utils/validators/is-boolean"
const statusEnum = z.nativeEnum(ProductStatus)
@@ -28,6 +28,7 @@ export const AdminGetProductsParams = createFindParams({
(val: any) => optionalBooleanMapper.get(val?.toLowerCase()),
z.boolean().optional()
),
category_id: z.string().array().optional(),
price_list_id: z.string().array().optional(),
sales_channel_id: z.string().array().optional(),
collection_id: z.string().array().optional(),
@@ -12,6 +12,7 @@ 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 { adminProductCategoryRoutesMiddlewares } from "./admin/product-categories/middlewares"
import { adminProductTypeRoutesMiddlewares } from "./admin/product-types/middlewares"
import { adminProductRoutesMiddlewares } from "./admin/products/middlewares"
import { adminPromotionRoutesMiddlewares } from "./admin/promotions/middlewares"
@@ -67,5 +68,6 @@ export const config: MiddlewaresConfig = {
...adminProductTypeRoutesMiddlewares,
...adminUploadRoutesMiddlewares,
...adminFulfillmentSetsRoutesMiddlewares,
...adminProductCategoryRoutesMiddlewares,
],
}
@@ -1,15 +1,14 @@
import { NextFunction } from "express"
import { MedusaRequest, MedusaResponse } from "../../types/routing"
import { zodValidator } from "./validate-body"
import { z } from "zod"
import { removeUndefinedProperties } from "../../utils"
import { omit } from "lodash"
import { BaseEntity, QueryConfig, RequestQueryFields } from "@medusajs/types"
import { NextFunction } from "express"
import { omit } from "lodash"
import { z } from "zod"
import { MedusaRequest, MedusaResponse } from "../../types/routing"
import { removeUndefinedProperties } from "../../utils"
import {
prepareListQuery,
prepareRetrieveQuery,
} from "../../utils/get-query-config"
import { FindConfig } from "@medusajs/types"
import { zodValidator } from "./validate-body"
/**
* Normalize an input query, especially from array like query params to an array type
* e.g: /admin/orders/?fields[]=id,status,cart_id becomes { fields: ["id", "status", "cart_id"] }