import { Type } from 'class-transformer'; import { IsArray, IsBoolean, IsInt, IsOptional, IsString, Min, MinLength, ValidateNested, } from 'class-validator'; export class ProductVariantDto { @IsOptional() @IsString() id?: string; @IsOptional() @IsString() colorId?: string; @IsOptional() @IsString() sizeId?: string; @IsOptional() @IsString() packageId?: string; @IsInt() @Min(0) price!: number; @IsOptional() @IsInt() @Min(0) discountPrice?: number; @IsOptional() @IsInt() @Min(0) vipPrice?: number; } export class CreateProductDto { @IsString() @MinLength(1) nameFa!: string; @IsOptional() @IsString() nameEn?: string; @IsOptional() @IsString() summary?: string; @IsOptional() @IsString() description?: string; @IsInt() @Min(0) price!: number; @IsOptional() @IsInt() @Min(0) discountPrice?: number; @IsOptional() @IsString() categoryId?: string; @IsOptional() @IsString() brandId?: string; @IsOptional() @IsString() imageUrl?: string; @IsOptional() @IsString() imageKey?: string; @IsOptional() @IsArray() @IsString({ each: true }) galleryUrls?: string[]; @IsOptional() @IsArray() @IsString({ each: true }) galleryKeys?: string[]; @IsOptional() @IsArray() @IsString({ each: true }) tags?: string[]; @IsOptional() @IsBoolean() published?: boolean; @IsOptional() @IsBoolean() vipEnabled?: boolean; @IsOptional() @IsBoolean() vipOnly?: boolean; @IsOptional() @IsBoolean() vipSpecialPrice?: boolean; @IsOptional() @IsInt() @Min(0) vipPrice?: number; @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => ProductVariantDto) variants?: ProductVariantDto[]; /** SUPER_ADMIN only */ @IsOptional() @IsString() storeId?: string; } export class UpdateProductDto { @IsOptional() @IsString() @MinLength(1) nameFa?: string; @IsOptional() @IsString() nameEn?: string; @IsOptional() @IsString() summary?: string; @IsOptional() @IsString() description?: string; @IsOptional() @IsInt() @Min(0) price?: number; @IsOptional() @IsInt() @Min(0) discountPrice?: number | null; @IsOptional() @IsString() categoryId?: string | null; @IsOptional() @IsString() brandId?: string | null; @IsOptional() @IsString() imageUrl?: string | null; @IsOptional() @IsString() imageKey?: string | null; @IsOptional() @IsArray() @IsString({ each: true }) galleryUrls?: string[]; @IsOptional() @IsArray() @IsString({ each: true }) galleryKeys?: string[]; @IsOptional() @IsArray() @IsString({ each: true }) tags?: string[]; @IsOptional() @IsBoolean() published?: boolean; @IsOptional() @IsBoolean() vipEnabled?: boolean; @IsOptional() @IsBoolean() vipOnly?: boolean; @IsOptional() @IsBoolean() vipSpecialPrice?: boolean; @IsOptional() @IsInt() @Min(0) vipPrice?: number | null; @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => ProductVariantDto) variants?: ProductVariantDto[]; }