Feat: Add product tag endpoints, move tests to HTTP folder (#7591)
* chore: Move product type tests to HTTP folder * feat: Add product tags endpoints and move tests to HTTP folder
This commit is contained in:
1 parent
ce40fe88f5
commit
0929c4f457
24 files changed
+805
-399
No files matched your search
@@ -0,0 +1,66 @@
|
||||
import {
|
||||
deleteProductTagsWorkflow,
|
||||
updateProductTagsWorkflow,
|
||||
} from "@medusajs/core-flows"
|
||||
import {
|
||||
AuthenticatedMedusaRequest,
|
||||
MedusaResponse,
|
||||
} from "../../../../types/routing"
|
||||
|
||||
import {
|
||||
AdminGetProductTagParamsType,
|
||||
AdminUpdateProductTagType,
|
||||
} from "../validators"
|
||||
import { refetchEntity } from "../../../utils/refetch-entity"
|
||||
|
||||
export const GET = async (
|
||||
req: AuthenticatedMedusaRequest<AdminGetProductTagParamsType>,
|
||||
res: MedusaResponse
|
||||
) => {
|
||||
const productTag = await refetchEntity(
|
||||
"product_tag",
|
||||
req.params.id,
|
||||
req.scope,
|
||||
req.remoteQueryConfig.fields
|
||||
)
|
||||
|
||||
res.status(200).json({ product_tag: productTag })
|
||||
}
|
||||
|
||||
export const POST = async (
|
||||
req: AuthenticatedMedusaRequest<AdminUpdateProductTagType>,
|
||||
res: MedusaResponse
|
||||
) => {
|
||||
const { result } = await updateProductTagsWorkflow(req.scope).run({
|
||||
input: {
|
||||
selector: { id: req.params.id },
|
||||
update: req.validatedBody,
|
||||
},
|
||||
})
|
||||
|
||||
const productTag = await refetchEntity(
|
||||
"product_tag",
|
||||
result[0].id,
|
||||
req.scope,
|
||||
req.remoteQueryConfig.fields
|
||||
)
|
||||
|
||||
res.status(200).json({ product_tag: productTag })
|
||||
}
|
||||
|
||||
export const DELETE = async (
|
||||
req: AuthenticatedMedusaRequest,
|
||||
res: MedusaResponse
|
||||
) => {
|
||||
const id = req.params.id
|
||||
|
||||
await deleteProductTagsWorkflow(req.scope).run({
|
||||
input: { ids: [id] },
|
||||
})
|
||||
|
||||
res.status(200).json({
|
||||
id,
|
||||
object: "product_tag",
|
||||
deleted: true,
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import * as QueryConfig from "./query-config"
|
||||
import { MiddlewareRoute } from "../../../loaders/helpers/routing/types"
|
||||
import { validateAndTransformQuery } from "../../utils/validate-query"
|
||||
import {
|
||||
AdminCreateProductTag,
|
||||
AdminGetProductTagParams,
|
||||
AdminGetProductTagsParams,
|
||||
AdminUpdateProductTag,
|
||||
} from "./validators"
|
||||
import { validateAndTransformBody } from "../../utils/validate-body"
|
||||
|
||||
export const adminProductTagRoutesMiddlewares: MiddlewareRoute[] = [
|
||||
{
|
||||
method: ["GET"],
|
||||
matcher: "/admin/product-tags",
|
||||
middlewares: [
|
||||
validateAndTransformQuery(
|
||||
AdminGetProductTagsParams,
|
||||
QueryConfig.listProductTagsTransformQueryConfig
|
||||
),
|
||||
],
|
||||
},
|
||||
{
|
||||
method: ["GET"],
|
||||
matcher: "/admin/product-tags/:id",
|
||||
middlewares: [
|
||||
validateAndTransformQuery(
|
||||
AdminGetProductTagParams,
|
||||
QueryConfig.retrieveProductTagTransformQueryConfig
|
||||
),
|
||||
],
|
||||
},
|
||||
// Create/update/delete methods are new in v2
|
||||
{
|
||||
method: ["POST"],
|
||||
matcher: "/admin/product-tags",
|
||||
middlewares: [
|
||||
validateAndTransformBody(AdminCreateProductTag),
|
||||
validateAndTransformQuery(
|
||||
AdminGetProductTagParams,
|
||||
QueryConfig.retrieveProductTagTransformQueryConfig
|
||||
),
|
||||
],
|
||||
},
|
||||
{
|
||||
method: ["POST"],
|
||||
matcher: "/admin/product-tags/:id",
|
||||
middlewares: [
|
||||
validateAndTransformBody(AdminUpdateProductTag),
|
||||
validateAndTransformQuery(
|
||||
AdminGetProductTagParams,
|
||||
QueryConfig.retrieveProductTagTransformQueryConfig
|
||||
),
|
||||
],
|
||||
},
|
||||
{
|
||||
method: ["DELETE"],
|
||||
matcher: "/admin/product-tags/:id",
|
||||
middlewares: [],
|
||||
},
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
export const defaultAdminProductTagFields = [
|
||||
"id",
|
||||
"value",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
]
|
||||
|
||||
export const retrieveProductTagTransformQueryConfig = {
|
||||
defaults: defaultAdminProductTagFields,
|
||||
isList: false,
|
||||
}
|
||||
|
||||
export const listProductTagsTransformQueryConfig = {
|
||||
...retrieveProductTagTransformQueryConfig,
|
||||
defaultLimit: 20,
|
||||
isList: true,
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import {
|
||||
AuthenticatedMedusaRequest,
|
||||
MedusaResponse,
|
||||
} from "../../../types/routing"
|
||||
|
||||
import { createProductTagsWorkflow } from "@medusajs/core-flows"
|
||||
import {
|
||||
AdminCreateProductTagType,
|
||||
AdminGetProductTagsParamsType,
|
||||
} from "./validators"
|
||||
import { refetchEntities, refetchEntity } from "../../utils/refetch-entity"
|
||||
|
||||
export const GET = async (
|
||||
req: AuthenticatedMedusaRequest<AdminGetProductTagsParamsType>,
|
||||
res: MedusaResponse
|
||||
) => {
|
||||
const { rows: product_tags, metadata } = await refetchEntities(
|
||||
"product_tag",
|
||||
req.filterableFields,
|
||||
req.scope,
|
||||
req.remoteQueryConfig.fields,
|
||||
req.remoteQueryConfig.pagination
|
||||
)
|
||||
|
||||
res.json({
|
||||
product_tags: product_tags,
|
||||
count: metadata.count,
|
||||
offset: metadata.skip,
|
||||
limit: metadata.take,
|
||||
})
|
||||
}
|
||||
|
||||
export const POST = async (
|
||||
req: AuthenticatedMedusaRequest<AdminCreateProductTagType>,
|
||||
res: MedusaResponse
|
||||
) => {
|
||||
const input = [req.validatedBody]
|
||||
|
||||
const { result } = await createProductTagsWorkflow(req.scope).run({
|
||||
input: { product_tags: input },
|
||||
})
|
||||
|
||||
const productTag = await refetchEntity(
|
||||
"product_tag",
|
||||
result[0].id,
|
||||
req.scope,
|
||||
req.remoteQueryConfig.fields
|
||||
)
|
||||
|
||||
res.status(200).json({ product_tag: productTag })
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
import { z } from "zod"
|
||||
import {
|
||||
createFindParams,
|
||||
createOperatorMap,
|
||||
createSelectParams,
|
||||
} from "../../utils/validators"
|
||||
|
||||
export type AdminGetProductTagParamsType = z.infer<
|
||||
typeof AdminGetProductTagParams
|
||||
>
|
||||
export const AdminGetProductTagParams = createSelectParams()
|
||||
|
||||
export type AdminGetProductTagsParamsType = z.infer<
|
||||
typeof AdminGetProductTagsParams
|
||||
>
|
||||
export const AdminGetProductTagsParams = createFindParams({
|
||||
limit: 20,
|
||||
offset: 0,
|
||||
}).merge(
|
||||
z.object({
|
||||
q: z.string().optional(),
|
||||
id: z.union([z.string(), z.array(z.string())]).optional(),
|
||||
value: z.union([z.string(), z.array(z.string())]).optional(),
|
||||
created_at: createOperatorMap().optional(),
|
||||
updated_at: createOperatorMap().optional(),
|
||||
deleted_at: createOperatorMap().optional(),
|
||||
$and: z.lazy(() => AdminGetProductTagsParams.array()).optional(),
|
||||
$or: z.lazy(() => AdminGetProductTagsParams.array()).optional(),
|
||||
})
|
||||
)
|
||||
|
||||
export type AdminCreateProductTagType = z.infer<typeof AdminCreateProductTag>
|
||||
export const AdminCreateProductTag = z
|
||||
.object({
|
||||
value: z.string(),
|
||||
metadata: z.record(z.string(), z.unknown()).optional(),
|
||||
})
|
||||
.strict()
|
||||
|
||||
export type AdminUpdateProductTagType = z.infer<typeof AdminUpdateProductTag>
|
||||
export const AdminUpdateProductTag = z
|
||||
.object({
|
||||
value: z.string().optional(),
|
||||
metadata: z.record(z.string(), z.unknown()).optional(),
|
||||
})
|
||||
.strict()
|
||||
@@ -17,6 +17,7 @@ import { adminPriceListsRoutesMiddlewares } from "./admin/price-lists/middleware
|
||||
import { adminPricingRoutesMiddlewares } from "./admin/pricing/middlewares"
|
||||
import { adminProductCategoryRoutesMiddlewares } from "./admin/product-categories/middlewares"
|
||||
import { adminProductTypeRoutesMiddlewares } from "./admin/product-types/middlewares"
|
||||
import { adminProductTagRoutesMiddlewares } from "./admin/product-tags/middlewares"
|
||||
import { adminProductRoutesMiddlewares } from "./admin/products/middlewares"
|
||||
import { adminPromotionRoutesMiddlewares } from "./admin/promotions/middlewares"
|
||||
import { adminRegionRoutesMiddlewares } from "./admin/regions/middlewares"
|
||||
@@ -86,6 +87,7 @@ export const config: MiddlewaresConfig = {
|
||||
...adminSalesChannelRoutesMiddlewares,
|
||||
...adminStockLocationRoutesMiddlewares,
|
||||
...adminProductTypeRoutesMiddlewares,
|
||||
...adminProductTagRoutesMiddlewares,
|
||||
...adminUploadRoutesMiddlewares,
|
||||
...adminFulfillmentSetsRoutesMiddlewares,
|
||||
...adminOrderRoutesMiddlewares,
|
||||
|
||||
@@ -24,7 +24,7 @@ export const refetchEntities = async (
|
||||
delete filters.context
|
||||
}
|
||||
|
||||
let variables = { filters, ...context, ...pagination }
|
||||
const variables = { filters, ...context, ...pagination }
|
||||
|
||||
const queryObject = remoteQueryObjectFromString({
|
||||
entryPoint,
|
||||
|
||||
Reference in new issue
Block a user