Files
Lucky_Wheel/apps/api/src/modules/prize/dto/create-prize.dto.ts
T
2026-09-10 01:58:29 +03:30

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;
}