diff --git a/packages/medusa/src/api/routes/admin/product-categories/create-product-category.ts b/packages/medusa/src/api/routes/admin/product-categories/create-product-category.ts index ee18a0cac3e53..70aa70dcb5558 100644 --- a/packages/medusa/src/api/routes/admin/product-categories/create-product-category.ts +++ b/packages/medusa/src/api/routes/admin/product-categories/create-product-category.ts @@ -29,7 +29,6 @@ import { FindParams } from "../../../../types/common" * // must be previously logged in or use api token * medusa.admin.productCategories.create({ * name: 'Jeans', - * handle: 'jeans', * }) * .then(({ productCategory }) => { * console.log(productCategory.id); @@ -42,7 +41,6 @@ import { FindParams } from "../../../../types/common" * --header 'Content-Type: application/json' \ * --data-raw '{ * "name": "Jeans", -* "handle": "jeans", * }' * security: * - api_token: [] @@ -101,7 +99,6 @@ export default async (req: Request, res: Response) => { * type: object * required: * - name - * - handle * properties: * name: * type: string @@ -124,10 +121,6 @@ export class AdminPostProductCategoriesReq extends AdminProductCategoriesReqBase @IsString() @IsNotEmpty() name: string - - @IsString() - @IsNotEmpty() - handle: string } export class AdminPostProductCategoriesParams extends FindParams {} diff --git a/packages/medusa/src/models/product-category.ts b/packages/medusa/src/models/product-category.ts index 0e9a7e7ad3ba9..3155f2c768b72 100644 --- a/packages/medusa/src/models/product-category.ts +++ b/packages/medusa/src/models/product-category.ts @@ -1,5 +1,6 @@ import { generateEntityId } from "../utils/generate-entity-id" import { SoftDeletableEntity } from "../interfaces/models/soft-deletable-entity" +import { kebabCase } from "lodash" import { BeforeInsert, Index, @@ -49,6 +50,10 @@ export class ProductCategory extends SoftDeletableEntity { @BeforeInsert() private beforeInsert(): void { this.id = generateEntityId(this.id, "pcat") + + if (!this.handle) { + this.handle = kebabCase(this.name) + } } } @@ -60,7 +65,6 @@ export class ProductCategory extends SoftDeletableEntity { * type: object * required: * - name - * - handle * properties: * id: * type: string diff --git a/packages/medusa/src/services/__tests__/product-category.ts b/packages/medusa/src/services/__tests__/product-category.ts index 5a059040d9a2a..03c768efccfdf 100644 --- a/packages/medusa/src/services/__tests__/product-category.ts +++ b/packages/medusa/src/services/__tests__/product-category.ts @@ -112,12 +112,11 @@ describe("ProductCategoryService", () => { }) it("successfully creates a product category", async () => { - await productCategoryService.create({ name: "jeans", handle: "jeans" }) + await productCategoryService.create({ name: "jeans" }) expect(productCategoryRepository.create).toHaveBeenCalledTimes(1) expect(productCategoryRepository.create).toHaveBeenCalledWith({ name: "jeans", - handle: "jeans" }) }) }) diff --git a/packages/medusa/src/types/product-category.ts b/packages/medusa/src/types/product-category.ts index 555f191a2f037..30fd31a3ead4f 100644 --- a/packages/medusa/src/types/product-category.ts +++ b/packages/medusa/src/types/product-category.ts @@ -3,13 +3,17 @@ import { IsNotEmpty, IsOptional, IsString, IsBoolean } from "class-validator" export type CreateProductCategoryInput = { name: string - handle: string + handle?: string is_internal?: boolean is_active?: boolean parent_category_id?: string | null } export class AdminProductCategoriesReqBase { + @IsString() + @IsNotEmpty() + handle?: string + @IsBoolean() @IsOptional() is_internal?: boolean @@ -18,6 +22,7 @@ export class AdminProductCategoriesReqBase { @IsOptional() is_active?: boolean + @IsString() @IsOptional() @Transform(({ value }) => { return value === "null" ? null : value