refactor(medusa): Migrate ProductService to TS (#1625)

* refactor: product service

* fix: type errors in consumers

* fix: use Status enum instead of ProductStatus

* fix: remove ProductStatus

* fix: rename ProductStatus

* fix: product model nullable fields

* fix: explicit typecasting in listVariants

* fix: use atomicPhase in public methods

* fix: use transactionManager in protected methods

* fix: remove disable eslint rule comment

* fix: retrieveVariants relations

* fix: retrieveVariants

* fix: FilterableProductProps validation

* fix: nullable thumbnail

* fix: tests by making model column types more explicit

* move upsert method to repo layer

* fix: unit tests

* fix: integration tests

* fix: product tags query + integration test

* fix: rename FindWithRelationsOptions to FindWithoutRelationsOptions

* fix (productRepository): use string[] for relations

* refactor: extract price relation filtering logic into util

* fix: failing unit test

* rename DTO suffix to Input suffix

* fix: missing awaits

* fix: check for images and tags length

* fix: remove unneeded function

* extract types used in product service to types folder

* fix: use text instead of varchar

* remove: reorderOptions from ProductService

* fix: product model

* fix: add private retrieve method

* fix: conflicts

* fix: failing unit test

* fix: integration test

* fix: remove ProductSelector type

* fix: remove validateId

* fix: use spread operator

* fix: repo method typings

* fix: remove comment
This commit is contained in:
Zakaria El Asri
2022-06-20 10:50:46 +01:00
committed by GitHub
parent 9e686a8e47
commit f0be31120f
32 changed files with 808 additions and 650 deletions
@@ -8,6 +8,7 @@ import {
IsString,
ValidateNested,
} from "class-validator"
import { ProductStatus } from "../../../../models"
import { DateComparisonOperator } from "../../../../types/common"
import { FilterableProductProps } from "../../../../types/product"
import { AdminGetProductsPaginationParams } from "../products"
@@ -88,13 +89,6 @@ export default async (req: Request, res) => {
})
}
enum ProductStatus {
DRAFT = "draft",
PROPOSED = "proposed",
PUBLISHED = "published",
REJECTED = "rejected",
}
export class AdminGetPriceListsPriceListProductsParams extends AdminGetProductsPaginationParams {
@IsString()
@IsOptional()
@@ -17,7 +17,7 @@ import {
ProductVariantService,
ShippingProfileService,
} from "../../../../services"
import { ProductStatus } from "../../../../types/product"
import { ProductStatus } from "../../../../models"
import { ProductVariantPricesCreateReq } from "../../../../types/product-variant"
import { validator } from "../../../../utils/validator"
@@ -376,7 +376,7 @@ class ProductVariantReq {
@IsObject()
@IsOptional()
metadata?: object
metadata?: Record<string, unknown>
@IsArray()
@ValidateNested({ each: true })
@@ -485,5 +485,5 @@ export class AdminPostProductsReq {
@IsObject()
@IsOptional()
metadata?: object
metadata?: Record<string, unknown>
}
@@ -75,7 +75,7 @@ export const defaultAdminProductRelations = [
"collection",
]
export const defaultAdminProductFields = [
export const defaultAdminProductFields: (keyof Product)[] = [
"id",
"title",
"subtitle",
@@ -9,7 +9,7 @@ import {
ValidateNested,
} from "class-validator"
import { omit } from "lodash"
import { Product } from "../../../../models/product"
import { Product, ProductStatus } from "../../../../models/product"
import { DateComparisonOperator } from "../../../../types/common"
import {
allowedAdminProductFields,
@@ -97,13 +97,6 @@ export default async (req, res) => {
res.json(result)
}
export enum ProductStatus {
DRAFT = "draft",
PROPOSED = "proposed",
PUBLISHED = "published",
REJECTED = "rejected",
}
export class AdminGetProductsPaginationParams {
@IsNumber()
@IsOptional()
@@ -12,11 +12,8 @@ import {
ValidateIf,
ValidateNested,
} from "class-validator"
import {
defaultAdminProductFields,
defaultAdminProductRelations,
ProductStatus,
} from "."
import { defaultAdminProductFields, defaultAdminProductRelations } from "."
import { ProductStatus } from "../../../../models"
import { ProductService, PricingService } from "../../../../services"
import { ProductVariantPricesUpdateReq } from "../../../../types/product-variant"
import { validator } from "../../../../utils/validator"
@@ -320,7 +317,7 @@ class ProductVariantReq {
@IsObject()
@IsOptional()
metadata?: object
metadata?: Record<string, unknown>
@IsArray()
@IsOptional()
@@ -424,5 +421,5 @@ export class AdminPostProductsProductReq {
@IsObject()
@IsOptional()
metadata?: object
metadata?: Record<string, unknown>
}
@@ -20,6 +20,7 @@ import { PriceSelectionParams } from "../../../../types/price-selection"
import { validator } from "../../../../utils/validator"
import { IsType } from "../../../../utils/validators/is-type"
import { optionalBooleanMapper } from "../../../../utils/validators/is-boolean"
import { Product } from "../../../../models"
/**
* @oas [get] /products
@@ -85,9 +86,9 @@ export default async (req, res) => {
// get only published products for store endpoint
filterableFields["status"] = ["published"]
let includeFields: string[] = []
let includeFields: (keyof Product)[] = []
if (validated.fields) {
const set = new Set(validated.fields.split(","))
const set = new Set(validated.fields.split(",")) as Set<keyof Product>
set.add("id")
includeFields = [...set]
}