This repository was archived by the owner on Feb 10, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathvalidateRoundDates.ts
105 lines (94 loc) · 2.73 KB
/
validateRoundDates.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
import { z } from "zod";
export interface RoundDatesData {
timezone: string;
round: {
start: string;
end?: string;
noEndDate: boolean;
};
applications: {
start: string;
end: string;
};
}
export const getRoundDatesSchema = () => {
return z
.object({
timezone: z.string(),
round: z.object({
start: z.string(),
end: z.string().optional(),
noEndDate: z.boolean(),
}),
applications: z.object({
start: z.string(),
end: z.string(),
}),
})
.superRefine(validateRoundDates);
};
export const validateRoundDates = (data: RoundDatesData, ctx: z.RefinementCtx) => {
const roundStart = new Date(data.round.start);
const roundEnd = data.round.end ? new Date(data.round.end) : null;
const appStart = new Date(data.applications.start);
const appEnd = new Date(data.applications.end);
// Validate round start and end dates
if (isNaN(roundStart.getTime())) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Round start date must be valid",
path: ["round", "start"],
});
}
if (!data.round.noEndDate && (!roundEnd || isNaN(roundEnd.getTime()))) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Round end date must be valid if noEndDate is not checked",
path: ["round", "end"],
});
}
if (!data.round.noEndDate && roundEnd && roundStart >= roundEnd) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Round end date must be after the start date",
path: ["round", "end"],
});
}
// Validate application start and end dates
if (isNaN(appStart.getTime())) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Application start date must be valid",
path: ["applications", "start"],
});
}
if (isNaN(appEnd.getTime())) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Application end date must be valid",
path: ["applications", "end"],
});
}
if (appStart && appEnd && appStart >= appEnd) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Application end date must be after the start date",
path: ["applications", "end"],
});
}
// Ensure application dates are before round dates
if (roundStart && appStart && appStart > roundStart) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Application start date must not be after the round start date",
path: ["applications", "start"],
});
}
if (!data.round.noEndDate && roundEnd && appEnd && appEnd > roundEnd) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Application end date must not be after the round end date",
path: ["applications", "end"],
});
}
};