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:
Stevche Radevski authored and GitHub committed 2024-06-04 10:56:22 +02:00
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()
+2
View File
@@ -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,