import { Transform, Type } from 'class-transformer'; import { IsArray, IsBoolean, IsInt, IsNumber, IsOptional, IsString, Min, MinLength, ValidateNested, } from 'class-validator'; export class StoreItemVariantSelectionDto { @IsString() @MinLength(1) variationId!: string; @IsString() @MinLength(1) optionId!: string; } export class CreateStoreItemVariantDto { @IsArray() @ValidateNested({ each: true }) @Type(() => StoreItemVariantSelectionDto) selections!: StoreItemVariantSelectionDto[]; @IsOptional() @IsNumber() @Min(0) price?: number; @IsOptional() @IsInt() @Min(0) stockQuantity?: number; } export class BatchCreateStoreItemsDto { @IsString() @MinLength(1) productId!: string; @IsArray() @ValidateNested({ each: true }) @Type(() => CreateStoreItemVariantDto) items!: CreateStoreItemVariantDto[]; } export class ListStoreItemsDto { @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number; @IsOptional() @Type(() => Number) @IsInt() @Min(1) pageSize?: number; } export class ListPublicStoreItemsDto { @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number; @IsOptional() @Type(() => Number) @IsInt() @Min(1) pageSize?: number; @IsOptional() @IsString() categoryId?: string; @IsOptional() @IsString() brandId?: string; @IsOptional() @IsString() productId?: string; @IsOptional() @IsString() name?: string; @IsOptional() @Transform(({ value }) => value === 'true' || value === true) @IsBoolean() inStock?: boolean; @IsOptional() @Transform(({ value }) => value === 'true' || value === true) @IsBoolean() isFestival?: boolean; @IsOptional() @Type(() => Number) @IsNumber() @Min(0) minPrice?: number; @IsOptional() @Type(() => Number) @IsNumber() @Min(0) maxPrice?: number; } export class UpdateStoreItemVariantDto { @IsOptional() @IsNumber() @Min(0) price?: number; @IsOptional() @IsInt() @Min(0) stockQuantity?: number; @IsOptional() @IsNumber() @Min(0) discountedPrice?: number | null; @IsOptional() isFestival?: boolean; } export class BatchUpdateStoreItemDiscountDto { @IsString() @MinLength(1) id!: string; @IsOptional() @IsNumber() @Min(0) discountedPrice?: number | null; } export class BatchUpdateStoreItemDiscountsDto { @IsString() @MinLength(1) productId!: string; @IsArray() @ValidateNested({ each: true }) @Type(() => BatchUpdateStoreItemDiscountDto) items!: BatchUpdateStoreItemDiscountDto[]; } export class SyncStoreItemVariantRowDto { @IsOptional() @IsString() id?: string; @IsArray() @ValidateNested({ each: true }) @Type(() => StoreItemVariantSelectionDto) selections!: StoreItemVariantSelectionDto[]; @IsNumber() @Min(0) price!: number; @IsInt() @Min(0) stockQuantity!: number; } export class SyncProductStoreItemVariantsDto { @IsString() @MinLength(1) productId!: string; @IsArray() @ValidateNested({ each: true }) @Type(() => SyncStoreItemVariantRowDto) items!: SyncStoreItemVariantRowDto[]; @IsArray() @IsString({ each: true }) removedIds!: string[]; } export class BatchUpdateFestivalRewardDto { @IsString() @MinLength(1) id!: string; @IsOptional() @IsInt() @Min(0) rewardPoints?: number | null; } export class BatchUpdateFestivalRewardsDto { @IsString() @MinLength(1) productId!: string; @IsArray() @ValidateNested({ each: true }) @Type(() => BatchUpdateFestivalRewardDto) items!: BatchUpdateFestivalRewardDto[]; } // Backward-compatible aliases for existing imports export { StoreItemVariantSelectionDto as StoreItemSelectionDto, CreateStoreItemVariantDto as CreateStoreItemDto, UpdateStoreItemVariantDto as UpdateStoreItemDto, SyncStoreItemVariantRowDto as SyncStoreItemRowDto, SyncProductStoreItemVariantsDto as SyncProductStoreItemsDto, };