-
Notifications
You must be signed in to change notification settings - Fork 1
/
create-order-item-timeframe.dto.ts
115 lines (108 loc) · 3.5 KB
/
create-order-item-timeframe.dto.ts
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* eslint-disable @typescript-eslint/no-explicit-any */
import { ApiProperty } from "@nestjs/swagger";
import {
IsInt,
IsISO8601,
IsNumber,
Max,
Min,
registerDecorator,
ValidationArguments,
ValidationOptions
} from "class-validator";
export class CreateOrderItemTimeframeDto {
@ApiProperty({ example: '2020-10-11T00:00:00.000Z' })
@IsISO8601({ strict: true })
@IsStartOfDay()
start: Date;
@ApiProperty({ example: '2020-12-31T23:59:59.999Z' })
@IsISO8601({ strict: true })
@IsEndOfDay()
@IsGreaterThan("start")
@IsTheSameYearAs("start")
end: Date;
@ApiProperty({ example: 100000, description: 'amount of energy represented in Wh unit' })
@IsNumber({ allowInfinity: false, allowNaN: false })
@IsInt()
@Max(9007199254740991)
@Min(1)
energy: number;
}
function IsStartOfDay(validationOptions?: ValidationOptions) {
return function (object: Record<string, any>, propertyName: string) {
registerDecorator({
name: "IsStartOfDay",
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
validator: {
validate(value: string | number | Date): boolean {
return new Date(value).getUTCMilliseconds() === 0;
},
defaultMessage(): string {
return "start should be the first millisecond of a day";
}
}
});
};
}
function IsEndOfDay(validationOptions?: ValidationOptions) {
return function (object: Record<string, any>, propertyName: string) {
registerDecorator({
name: "IsEndOfDay",
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
validator: {
validate(value: string | number | Date): boolean {
return new Date(value).getUTCMilliseconds() === 999;
},
defaultMessage(): string {
return "end should be the last millisecond of a day";
}
}
});
};
}
function IsGreaterThan(property: string, validationOptions?: ValidationOptions) {
return function (object: Record<string, any>, propertyName: string) {
registerDecorator({
name: "IsGreaterThan",
target: object.constructor,
propertyName: propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate(value: string | number | Date, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = args.object[relatedPropertyName];
return value > relatedValue;
},
defaultMessage(args?: ValidationArguments): string {
return `${args.property} should be larger than ${args.constraints[0]}`;
}
}
});
};
}
function IsTheSameYearAs(property: string, validationOptions?: ValidationOptions) {
return function (object: Record<string, any>, propertyName: string) {
registerDecorator({
name: "IsTheSameYearAs",
target: object.constructor,
propertyName: propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate(value: string | number | Date, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = args.object[relatedPropertyName];
return new Date(value).getUTCFullYear() === new Date(relatedValue).getUTCFullYear();
},
defaultMessage(args?: ValidationArguments): string {
return `${args.property} should be the same year as ${args.constraints[0]}`;
}
}
});
};
}