Validation - Definition
Eicrud's validation happens at the controller level (between the client, and your services).
Entities and commands DTOs are validated the same way.
You can use any class-validator decorator in your DTOs.
Note
Fields that aren't annotated with a class-validator
decorator won't be allowed in the DTO. You can use the @Allow
decorator to bypass that rule, but we recommend using proper validation instead.
Nested Validation
class-validator
's @ValidateNested
will only work when decorator @$Type
is applied.
import { $Type } from '@eicrud/core/validation'
export class CmdDto {
@$Type(Slice)
@ValidateNested()
firstSlice: Slice;
}
Eicrud decorators
Eicrud offers custom decorators you can use.
$MaxSize(size: number, addPerTrustPoint?: number)
Specify the max length of the stringified argument.
import { $MaxSize } from '@eicrud/core/validation'
export class CmdDto {
@$MaxSize(300)
bio: string;
}
Warning
By default, every DTO field has a max stringified size of 50
(specified in ValidationOptions->defaultMaxSize
). This means you need to decorate fields with @$MaxSize(x)
to bypass this limit. Using class-validator
's @MaxLength
won't affect that limit. Setting defaultMaxSize
to 0 disables that check.
$MaxArLength(length: number, addPerTrustPoint?: number)
Specify the max length of an array argument.
import { $MaxArLength } from '@eicrud/core/validation'
export class CmdDto {
@$Type(Seed)
@$MaxArLength(5)
seeds: Seed[];
}
Note
@$MaxArLength
must be used with @$Type
decorator, or else @$MaxSize
will be applied.
Warning
By default, @$Type
DTO fields have a max length of 20
(specified in ValidationOptions->defaultMaxArLength
). This means you need to decorate fields with @$MaxArLength(x)
to bypass this limit.
Validation Pipe
You can use CrudValidationPipe
to apply Eicrud's validation and transforms to your own NestJS controllers.
import { CrudValidationPipe } from '@eicrud/core/validation';
@Get('hello')
async get(@Query(new CrudValidationPipe()) query: MyQuery) {
return `Hello ${query.name}`;
}
export class MyQuery {
@IsOptional()
@IsString()
@$Transform((value) => value.toUpperCase())
name: string;
}