import { IsEmail, IsString, IsEnum, IsBoolean, IsOptional, MinLength, MaxLength, Matches, } from 'class-validator'; import { UserRole } from '../entities'; interface UserEntity { id: string; email: string; username: string; role: UserRole; isActive: boolean; createdAt: Date; updatedAt: Date; } export class CreateUserDto { @IsEmail() email: string; @IsString() @MinLength(3) @MaxLength(30) @Matches(/^[a-zA-Z0-9_]+$/, { message: 'Username can only contain letters, numbers, and underscores', }) username: string; @IsString() @MinLength(6) password: string; @IsEnum(UserRole) @IsOptional() role?: UserRole = UserRole.USER; @IsBoolean() @IsOptional() isActive?: boolean = true; } export class UpdateUserDto { @IsEmail() @IsOptional() email?: string; @IsString() @MinLength(3) @MaxLength(30) @Matches(/^[a-zA-Z0-9_]+$/, { message: 'Username can only contain letters, numbers, and underscores', }) @IsOptional() username?: string; @IsString() @MinLength(6) @IsOptional() password?: string; @IsEnum(UserRole) @IsOptional() role?: UserRole; @IsBoolean() @IsOptional() isActive?: boolean; } export class LoginUserDto { @IsString() username: string; @IsString() password: string; } export class UserResponseDto { id: string; email: string; username: string; role: UserRole; isActive: boolean; createdAt: Date; updatedAt: Date; constructor(user: UserEntity) { this.id = user.id; this.email = user.email; this.username = user.username; this.role = user.role; this.isActive = user.isActive; this.createdAt = user.createdAt; this.updatedAt = user.updatedAt; } } export class ChangePasswordDto { @IsString() currentPassword: string; @IsString() @MinLength(6) newPassword: string; }