Reputation: 929
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
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
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
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