반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- type challenge
- 레벨 1
- Crawling
- 자바스크립트
- 수학
- 크롤링
- 타입 챌린지
- 쉬운 문제
- socket
- 타입스크립트
- 프로그래머스 레벨 2
- HTTP
- 문자열
- Node.js
- 알고리즘
- 그래프
- Nestjs
- dp
- HTTP 완벽 가이드
- TCP
- Algorithm
- 백준
- typescript
- javascript
- 가천대
- 프로그래머스
- ip
- dfs
- BFS
- 소켓
Archives
- Today
- Total
kakasoo
class-validator로 특정 날짜 검증하기 본문
반응형
@IsDate()
specificDate: Date;
날짜를 검증하기 위해서는 IsDate 데코레이터를 이용할 수 있다.
이렇게 작성할 경우 단순 String으로 된 Date는 무시당할 수 있기 때문에 Type 데코레이터도 필요하다.
날짜가 필수적인지 아닌지에 따라 아래와 같이 작성할 수 있다.
import { applyDecorators } from '@nestjs/common';
import { Type } from 'class-transformer';
import { IsDate, IsNotEmpty } from 'class-validator';
export function IsNotEmptyDate() {
return applyDecorators(
IsNotEmpty(),
IsDate(),
Type(() => Date),
);
}
import { applyDecorators } from '@nestjs/common';
import { Type } from 'class-transformer';
import { IsDate, IsOptional } from 'class-validator';
export function IsOptionalDate() {
return applyDecorators(
IsOptional(),
IsDate(),
Type(() => Date),
);
}
위는 필수적인 케이스고, 아래는 선택적인 케이스를 작성한 것이다.
이를 합쳐서 아래와 같이 인자를 받는 형태로 작성할 수 있다.
export function IsDateDecorator(isOptional: boolean = true) {
return applyDecorators(
isOptional ? IsOptional() : IsNotEmpty(),
IsDate(),
Type(() => Date),
);
}
하지만 날짜의 입력은, 서비스 특성에 따라 오늘 날짜를 포함한 시간대 이후를 받아야 할 수도 있다.
또한 시간 단위가 아니라 날짜 단위, 예컨대 23:59과 00:00를 1분 차이가 아니라 하루 차이로 볼 수도 있다.
이런 경우를 위해 아래와 같이 데코레이터를 만들 수 있다.
IsAfterDate decorator
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';
export function getDifferTime(a: Date, b: Date, standard: 'day' | 'hour') {
if (standard === 'day') {
return a.getDate() - b.getDate();
} else if (standard === 'hour') {
const differTime = a.getTime() - b.getTime();
return differTime / (1000 * 60 * 60);
}
}
export function IsAfterDate(validationOptions?: { hours: number } & ValidationOptions) {
return function (object: Record<string, any>, propertyName: string) {
registerDecorator({
name: 'IsAfterDate',
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
constraints: [],
validator: {
validate(value: any, args: ValidationArguments) {
return value instanceof Date && getDifferTime(value, new Date(), 'hour') >= validationOptions.hours;
},
},
});
};
}
class-validator는 registerDecorator 를 통해 손쉽게 커스텀 데코레이터를 만들 수 있다.
위의 applyDecorator는 기존의 데코레이터를 합성하는 방식이지만,
registerDecorator는 기존에 없던 데코레이터를 만들 수 있기에 더 기능 확장에 용이하다.
반응형
'프로그래밍 > NestJS' 카테고리의 다른 글
NestJS 모듈 배포를 위한 코드 작성 (0) | 2023.01.11 |
---|---|
NestJS에 SpreadSheet API 사용하기 (0) | 2023.01.01 |
TypeORM에서 오늘 날짜의 데이터만 뽑기 (0) | 2022.12.25 |
Response DTO를 이용한 응답 직렬화 (Serialization) (0) | 2022.11.27 |
[TypeORM] Null이 있는 상황에서의 orderBy (0) | 2022.11.27 |