Hrant Nurijanyan
Hrant Nurijanyan

Reputation: 929

class-validator case-insensitive enum validation?

I have anum like this:

export enum UserRole {
  USER,
  ADMIN,
  BLOGGER
}

and create.user.dto like this

import { IsEmail, IsEnum, IsNotEmpty, IsOptional } from 'class-validator';
import { UserRole } from './user.entity';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsNotEmpty()
  firstName: string;

  @IsNotEmpty()
  lastName: string;

  @IsOptional()
  username: string;

  @IsOptional()
  @IsEnum(UserRole)
  role: UserRole;

  @IsNotEmpty()
  password: string;
}

Now role validation does not fail if I only post the role uppercase('ADMIN','USER') or 'BLOGGER'.

How to make class-validator not case sensitive? I mean, validate true also for 'admin' 'aDmIn'.

Upvotes: 18

Views: 42242

Answers (3)

Alaniza96
Alaniza96

Reputation: 331

For what it's worth, you could also use class-validator's @Transform decorator to match your enum casing.

export enum UserRole {
 USER = "user",
 ADMIN = "admin",
 BLOGGER = "blogger"
}

Then in your DTO:

@IsOptional()
@Transform(({ value }) => ("" + value).toLowerCase())
@IsEnum(UserRole)
role: UserRole;

Worked for me with "class-validator": "^0.14.0"

Upvotes: 13

DamarOwen
DamarOwen

Reputation: 177

your enum should like this

export enum UserRole {
  USER = "USER",
  ADMIN = "ADMIN",
  BLOGGER = "BLOGGER"
}

is proven works in case-insensitive or vice versa

Upvotes: 2

satanTime
satanTime

Reputation: 13574

then you need a regexp validation via @Matches.

  @IsOptional()
  @Matches(`^${Object.values(UserRole).filter(v => typeof v !== "number").join('|')}$`, 'i')
  role: UserRole;

the final rule is /^USER|ADMIN|BLOGGER$/i, where i ignores the case.

Upvotes: 14

Related Questions