116 lines
3.8 KiB
TypeScript
116 lines
3.8 KiB
TypeScript
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
import { PrizeStatus, PrizeType, StockType } from '@prisma/client';
|
|
import { Type } from 'class-transformer';
|
|
import {
|
|
IsDate,
|
|
IsEnum,
|
|
IsInt,
|
|
IsNotEmpty,
|
|
IsOptional,
|
|
IsString,
|
|
Matches,
|
|
Min,
|
|
ValidateIf,
|
|
} from 'class-validator';
|
|
|
|
export class CreatePrizeDto {
|
|
@ApiProperty({ example: 'آیفون ۱۵ پرو ۲۵۶ گیگابایت', description: 'عنوان جایزه' })
|
|
@IsString()
|
|
@IsNotEmpty({ message: 'عنوان جایزه الزامی است' })
|
|
title: string;
|
|
|
|
@ApiPropertyOptional({ example: 'تحویل حضوری با ارائه کارت شناسایی' })
|
|
@IsString()
|
|
@IsOptional()
|
|
description?: string;
|
|
|
|
@ApiPropertyOptional({ example: 'تحویل حضوری با ارائه کارت شناسایی' })
|
|
@IsString()
|
|
@IsOptional()
|
|
subtitle?: string;
|
|
|
|
@ApiPropertyOptional({ example: 'http://localhost:3000/uploads/iphone.png' })
|
|
@IsString()
|
|
@IsOptional()
|
|
image?: string;
|
|
|
|
@ApiPropertyOptional({ example: 'http://localhost:3000/uploads/iphone.png' })
|
|
@IsString()
|
|
@IsOptional()
|
|
iconUrl?: string;
|
|
|
|
@ApiProperty({ enum: PrizeType, example: PrizeType.PHYSICAL, description: 'نوع جایزه' })
|
|
@IsOptional()
|
|
type?: PrizeType;
|
|
|
|
@ApiPropertyOptional({ description: 'نام مستعار نوع جایزه' })
|
|
@IsOptional()
|
|
prizeType?: string;
|
|
|
|
@ApiProperty({ enum: StockType, example: StockType.LIMITED, description: 'نوع موجودی (محدود / نامحدود)' })
|
|
@IsEnum(StockType)
|
|
@IsNotEmpty()
|
|
stockType: StockType;
|
|
|
|
@ApiPropertyOptional({ example: 5, description: 'موجودی اولیه (در صورت محدود بودن)' })
|
|
@ValidateIf((o) => o.stockType === StockType.LIMITED)
|
|
@Type(() => Number)
|
|
@IsInt({ message: 'موجودی اولیه باید عدد صحیح باشد' })
|
|
@Min(1, { message: 'موجودی اولیه باید حداقل ۱ باشد' })
|
|
initialStock?: number;
|
|
|
|
@ApiPropertyOptional({ example: 5, description: 'موجودی باقیمانده فعلی' })
|
|
@Type(() => Number)
|
|
@IsInt({ message: 'موجودی باقیمانده باید عدد صحیح باشد' })
|
|
@Min(0, { message: 'موجودی باقیمانده نمیتواند منفی باشد' })
|
|
@IsOptional()
|
|
remainingStock?: number;
|
|
|
|
@ApiProperty({ example: 10, description: 'وزن برد (عددی مثبت و بزرگتر از صفر)' })
|
|
@Type(() => Number)
|
|
@IsInt({ message: 'وزن برد باید عدد صحیح باشد' })
|
|
@Min(1, { message: 'وزن برد باید حداقل ۱ باشد' })
|
|
weight: number;
|
|
|
|
@ApiPropertyOptional({ enum: PrizeStatus, default: PrizeStatus.ACTIVE })
|
|
@IsEnum(PrizeStatus)
|
|
@IsOptional()
|
|
status?: PrizeStatus = PrizeStatus.ACTIVE;
|
|
|
|
@ApiPropertyOptional({ description: 'وضعیت فعال بودن' })
|
|
@IsOptional()
|
|
isActive?: boolean;
|
|
|
|
@ApiPropertyOptional({ example: 1, default: 0, description: 'ترتیب سگمنت روی گردونه' })
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@IsOptional()
|
|
sortOrder?: number = 0;
|
|
|
|
@ApiPropertyOptional({ example: '#FF5733', description: 'کد رنگ سگمنت در گردونه (فرمت هگز)' })
|
|
@IsString()
|
|
@IsOptional()
|
|
segmentColor?: string;
|
|
|
|
@ApiPropertyOptional({ example: '#FF5733', description: 'کد رنگ (نام مستعار)' })
|
|
@IsString()
|
|
@IsOptional()
|
|
color?: string;
|
|
|
|
@ApiPropertyOptional({ example: '#FFFFFF' })
|
|
@IsString()
|
|
@IsOptional()
|
|
textColor?: string;
|
|
|
|
@ApiPropertyOptional({ example: '2026-12-31T23:59:59.000Z', description: 'تاریخ انقضای کد یا جایزه' })
|
|
@Type(() => Date)
|
|
@IsDate()
|
|
@IsOptional()
|
|
expiresAt?: Date;
|
|
|
|
@ApiPropertyOptional({ example: 'تبریک! شما برنده {prize} شدید. کد جایزه: {code}' })
|
|
@IsString()
|
|
@IsOptional()
|
|
smsTemplate?: string;
|
|
}
|