import { Type } from 'class-transformer'; import { IsArray, IsEmail, IsIn, IsInt, IsObject, IsOptional, IsString, Max, MaxLength, Min, MinLength, ValidateIf, } from 'class-validator'; import { PERSON_IMPORT_SOURCES, PERSON_MOODS } from '@mento/shared'; export class ListQueryDto { @IsOptional() @IsString() q?: string; @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number = 1; @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(100) limit?: number = 20; @IsOptional() @IsIn([...PERSON_MOODS]) mood?: (typeof PERSON_MOODS)[number]; @IsOptional() @IsIn(['name', 'newest']) sort?: 'name' | 'newest'; /** فیلتر منبع ورود شخص */ @IsOptional() @IsString() @MaxLength(40) importSource?: string; } export class CreateCompanyDto { @IsString() @MinLength(2) @MaxLength(160) name!: string; @IsOptional() @IsString() @MaxLength(32) nationalId?: string; @IsOptional() @IsString() @MaxLength(40) phone?: string; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsEmail() email?: string; @IsOptional() @IsString() @MaxLength(200) website?: string; @IsOptional() @IsString() @MaxLength(400) address?: string; @IsOptional() @IsString() @MaxLength(2000) notes?: string; @IsOptional() @IsArray() @IsString({ each: true }) tags?: string[]; @IsOptional() @IsObject() customFields?: Record; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() ownerId?: string | null; } export class UpdateCompanyDto { @IsOptional() @IsString() @MinLength(2) @MaxLength(160) name?: string; @IsOptional() @IsString() @MaxLength(32) nationalId?: string; @IsOptional() @IsString() @MaxLength(40) phone?: string; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsEmail() email?: string; @IsOptional() @IsString() @MaxLength(200) website?: string; @IsOptional() @IsString() @MaxLength(400) address?: string; @IsOptional() @IsString() @MaxLength(2000) notes?: string; @IsOptional() @IsArray() @IsString({ each: true }) tags?: string[]; @IsOptional() @IsObject() customFields?: Record; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() ownerId?: string | null; } export class CreatePersonDto { @IsOptional() @IsString() @MaxLength(80) firstName?: string; @IsOptional() @IsString() @MaxLength(80) lastName?: string; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() @MaxLength(80) previousFirstName?: string | null; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() @MaxLength(80) previousLastName?: string | null; @IsOptional() @IsString() @MaxLength(40) @IsIn([...PERSON_IMPORT_SOURCES]) importSource?: (typeof PERSON_IMPORT_SOURCES)[number]; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() @MaxLength(120) sourceRef?: string | null; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsEmail() email?: string; @IsOptional() @IsString() @MaxLength(40) phone?: string; @IsOptional() @IsString() @MaxLength(40) mobile?: string; @IsOptional() @IsString() @MaxLength(120) position?: string; @IsOptional() @IsString() @MaxLength(300) website?: string; @IsOptional() @IsString() @MaxLength(200) instagram?: string; @IsOptional() @IsString() @MaxLength(120) referrer?: string; @IsOptional() @IsArray() @IsString({ each: true }) addresses?: string[]; @IsOptional() @IsString() @MaxLength(2000) notes?: string; @IsOptional() @IsIn([...PERSON_MOODS]) mood?: (typeof PERSON_MOODS)[number]; @IsOptional() @IsArray() @IsString({ each: true }) tags?: string[]; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() companyId?: string | null; @IsOptional() @IsObject() customFields?: Record; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() ownerId?: string | null; /** فقط برای ایمپورت اکسل — تاریخ ثبت مبدأ */ @IsOptional() @IsString() registeredAt?: string | null; } export class UpdatePersonDto { @IsOptional() @IsString() @MaxLength(80) firstName?: string; @IsOptional() @IsString() @MaxLength(80) lastName?: string; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() @MaxLength(80) previousFirstName?: string | null; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() @MaxLength(80) previousLastName?: string | null; @IsOptional() @IsString() @MaxLength(40) importSource?: string; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() @MaxLength(120) sourceRef?: string | null; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsEmail() email?: string; @IsOptional() @IsString() @MaxLength(40) phone?: string; @IsOptional() @IsString() @MaxLength(40) mobile?: string; @IsOptional() @IsString() @MaxLength(120) position?: string; @IsOptional() @IsString() @MaxLength(300) website?: string; @IsOptional() @IsString() @MaxLength(200) instagram?: string; @IsOptional() @IsString() @MaxLength(120) referrer?: string; @IsOptional() @IsArray() @IsString({ each: true }) addresses?: string[]; @IsOptional() @IsString() @MaxLength(2000) notes?: string; @IsOptional() @IsIn([...PERSON_MOODS]) mood?: (typeof PERSON_MOODS)[number]; @IsOptional() @IsArray() @IsString({ each: true }) tags?: string[]; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() companyId?: string | null; @IsOptional() @IsObject() customFields?: Record; @IsOptional() @ValidateIf((_, v) => v !== '' && v != null) @IsString() ownerId?: string | null; }