Skip to content

Commit 943aba6

Browse files
committed
format dates in api layer for backend
1 parent 518aca3 commit 943aba6

13 files changed

Lines changed: 64 additions & 35 deletions

File tree

src/backend/src/routes/change-requests.routes.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ChangeRequestReason, ChangeRequestType } from 'shared';
44
import ChangeRequestsController from '../controllers/change-requests.controllers.js';
55
import {
66
intMinZero,
7+
isDateOnly,
78
nonEmptyString,
89
projectProposedChangesValidators,
910
validateInputs,
@@ -38,14 +39,7 @@ changeRequestsRouter.post(
3839
intMinZero(body('wbsNum.projectNumber')),
3940
intMinZero(body('wbsNum.workPackageNumber')),
4041
body('type').custom((value) => value === ChangeRequestType.Activation),
41-
body('startDate').custom((value) => {
42-
const parsed = Date.parse(value);
43-
if (isNaN(parsed)) return false;
44-
const date = new Date(parsed);
45-
return (
46-
date.getUTCHours() === 0 && date.getUTCMinutes() === 0 && date.getUTCSeconds() === 0 && date.getUTCMilliseconds() === 0
47-
);
48-
}),
42+
isDateOnly(body('startDate')),
4943
nonEmptyString(body('leadId')),
5044
nonEmptyString(body('managerId')),
5145
body('confirmDetails').isBoolean(),

src/frontend/src/apis/calendar.api.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
Machinery,
66
EventType,
77
AvailabilityCreateArgs,
8+
dateToMidnightUTC,
89
Event,
910
EventStatus,
1011
EventTypeCreateArgs,
@@ -118,7 +119,9 @@ export const editShop = (shopId: string, payload: { name: string; description: s
118119
};
119120

120121
export const markUserConfirmed = async (id: string, payload: { availability: AvailabilityCreateArgs[] }) => {
121-
return axios.post<Event>(apiUrls.calendarEventMarkUserConfirmed(id), payload);
122+
return axios.post<Event>(apiUrls.calendarEventMarkUserConfirmed(id), {
123+
availability: payload.availability.map((a) => ({ ...a, dateSet: dateToMidnightUTC(a.dateSet) }))
124+
});
122125
};
123126

124127
export const getSingleEvent = async (id: string) => {

src/frontend/src/apis/finance.api.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
} from '../hooks/finance.hooks';
2727
import axios from '../utils/axios';
2828
import { apiUrls } from '../utils/urls';
29+
import { dateToMidnightUTC } from 'shared';
2930
import {
3031
reimbursementRequestDataTransformer,
3132
reimbursementRequestTransformer,
@@ -71,7 +72,10 @@ export const uploadSingleReceipt = (file: File, id: string) => {
7172
* @returns the created reimbursement request
7273
*/
7374
export const createReimbursementRequest = (formData: CreateReimbursementRequestPayload) => {
74-
return axios.post(apiUrls.financeCreateReimbursementRequest(), formData);
75+
return axios.post(apiUrls.financeCreateReimbursementRequest(), {
76+
...formData,
77+
dateOfExpense: formData.dateOfExpense ? dateToMidnightUTC(formData.dateOfExpense) : undefined
78+
});
7579
};
7680

7781
/**
@@ -102,7 +106,10 @@ export const markReimbursementRequestAsReimbursed = (id: string) => {
102106
* @returns the edited reimbursement request
103107
*/
104108
export const editReimbursementRequest = (id: string, formData: EditReimbursementRequestPayload) => {
105-
return axios.post(apiUrls.financeEditReimbursementRequest(id), formData);
109+
return axios.post(apiUrls.financeEditReimbursementRequest(id), {
110+
...formData,
111+
dateOfExpense: formData.dateOfExpense ? dateToMidnightUTC(formData.dateOfExpense) : undefined
112+
});
106113
};
107114

108115
/**

src/frontend/src/apis/recruitment.api.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import axios from '../utils/axios';
22
import { MilestonePayload, FaqPayload } from '../hooks/recruitment.hooks';
33
import { apiUrls } from '../utils/urls';
4-
import { Milestone } from 'shared';
4+
import { dateToMidnightUTC, Milestone } from 'shared';
55
import { FrequentlyAskedQuestion } from 'shared';
66

77
export const getAllMilestones = () => {
@@ -12,13 +12,15 @@ export const getAllMilestones = () => {
1212

1313
export const createMilestone = (payload: MilestonePayload) => {
1414
return axios.post(apiUrls.milestoneCreate(), {
15-
...payload
15+
...payload,
16+
dateOfEvent: dateToMidnightUTC(payload.dateOfEvent)
1617
});
1718
};
1819

1920
export const editMilestone = (payload: MilestonePayload, id: string) => {
2021
return axios.post(apiUrls.milestoneEdit(id), {
21-
...payload
22+
...payload,
23+
dateOfEvent: dateToMidnightUTC(payload.dateOfEvent)
2224
});
2325
};
2426

src/frontend/src/apis/tasks.api.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,17 @@
33
* See the LICENSE file in the repository root folder for details.
44
*/
55

6-
import { CalendarTask, FilterTaskArgs, Task, TaskCardPreview, TaskPriority, TaskStatus, WbsNumber, wbsPipe } from 'shared';
6+
import {
7+
CalendarTask,
8+
dateToMidnightUTC,
9+
FilterTaskArgs,
10+
Task,
11+
TaskCardPreview,
12+
TaskPriority,
13+
TaskStatus,
14+
WbsNumber,
15+
wbsPipe
16+
} from 'shared';
717
import axios from '../utils/axios';
818
import { apiUrls } from '../utils/urls';
919
import { taskTransformer } from './transformers/tasks.transformers';
@@ -69,8 +79,8 @@ export const editTask = (
6979
title,
7080
notes,
7181
priority,
72-
deadline,
73-
startDate
82+
deadline: deadline ? dateToMidnightUTC(deadline) : undefined,
83+
startDate: startDate ? dateToMidnightUTC(startDate) : undefined
7484
});
7585
};
7686

src/frontend/src/apis/users.api.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import axios from '../utils/axios';
77
import {
8+
dateToMidnightUTC,
89
ProjectOverview,
910
SetUserScheduleSettingsPayload,
1011
Task,
@@ -170,7 +171,10 @@ export const updateUserSecureSettings = (settings: UserSecureSettings) => {
170171
* Update the given user's schedule settings by UserId
171172
*/
172173
export const updateUserScheduleSettings = (settings: SetUserScheduleSettingsPayload) => {
173-
return axios.post<UserScheduleSettings>(apiUrls.userScheduleSettingsSet(), settings);
174+
return axios.post<UserScheduleSettings>(apiUrls.userScheduleSettingsSet(), {
175+
...settings,
176+
availability: settings.availability.map((a) => ({ ...a, dateSet: dateToMidnightUTC(a.dateSet) }))
177+
});
174178
};
175179

176180
export const updateUserRole = (id: string, role: string) => {

src/frontend/src/apis/work-packages.api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
import axios from '../utils/axios';
7-
import { DescriptionBulletPreview, WbsNumber, WorkPackage, WorkPackagePreview, WorkPackageStage } from 'shared';
7+
import { dateToMidnightUTC, DescriptionBulletPreview, WbsNumber, WorkPackage, WorkPackagePreview, WorkPackageStage } from 'shared';
88
import { wbsPipe } from '../utils/pipes';
99
import { apiUrls } from '../utils/urls';
1010
import { workPackagePreviewTransformer, workPackageTransformer } from './transformers/work-packages.transformers';
@@ -109,7 +109,7 @@ export const getManyWorkPackages = (wbsNums: WbsNumber[]) => {
109109
*/
110110
export const slackUpcomingDeadlines = (deadline: Date) => {
111111
return axios.post<{ message: string }>(apiUrls.workPackagesSlackUpcomingDeadlines(), {
112-
deadline
112+
deadline: dateToMidnightUTC(deadline)
113113
});
114114
};
115115

src/frontend/src/pages/CalendarPage/Components/CalendarCreateTaskModal.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { yupResolver } from '@hookform/resolvers/yup';
33
import { Autocomplete, FormControl, FormHelperText, FormLabel, Grid, MenuItem, TextField } from '@mui/material';
44
import { DatePicker } from '@mui/x-date-pickers';
55
import { Controller, useForm } from 'react-hook-form';
6-
import { countWords, isUnderWordCount, ProjectPreview, TaskPriority, TaskStatus, wbsPipe } from 'shared';
6+
import { countWords, dateToMidnightUTC, isUnderWordCount, ProjectPreview, TaskPriority, TaskStatus, wbsPipe } from 'shared';
77
import { useAllMembers } from '../../../hooks/users.hooks';
88
import { useAllProjects } from '../../../hooks/projects.hooks';
99
import { useCreateTask } from '../../../hooks/tasks.hooks';
@@ -85,8 +85,8 @@ const CalendarCreateTaskModal: React.FC<CalendarCreateTaskModalProps> = ({ open,
8585
status: data.status,
8686
assignees: data.assignees,
8787
notes: data.notes,
88-
deadline: data.deadline?.toISOString(),
89-
startDate: data.startDate?.toISOString()
88+
deadline: data.deadline ? dateToMidnightUTC(data.deadline).toISOString() : undefined,
89+
startDate: data.startDate ? dateToMidnightUTC(data.startDate).toISOString() : undefined
9090
});
9191
toast.success('Task created successfully!');
9292
onClose();

src/frontend/src/pages/GanttPage/ProjectGanttChart/ProjectGanttChangeModals/GanttProjectCreateModal.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Box, Typography } from '@mui/material';
2-
import { ProjectGantt } from 'shared';
2+
import { dateToMidnightUTC, ProjectGantt } from 'shared';
33
import dayjs from 'dayjs';
44
import LoadingIndicator from '../../../../components/LoadingIndicator';
55
import { useToast } from '../../../../hooks/toasts.hooks';
@@ -46,7 +46,7 @@ export const GanttProjectCreateModal = ({ change, handleClose, open }: GanttProj
4646

4747
const workPackagePayloads: WorkPackageApiInputs[] = project.workPackages.map((workPackage) => ({
4848
name: workPackage.name,
49-
startDate: workPackage.startDate.toISOString(),
49+
startDate: dateToMidnightUTC(workPackage.startDate).toISOString(),
5050
duration: dayjs(workPackage.endDate).diff(dayjs(workPackage.startDate), 'week'),
5151
crId: undefined,
5252
blockedBy: workPackage.blockedBy,
@@ -73,8 +73,8 @@ export const GanttProjectCreateModal = ({ change, handleClose, open }: GanttProj
7373
status: task.status,
7474
assignees: task.assignees.map((user) => user.userId),
7575
notes: task.notes || '',
76-
deadline: task.deadline ? task.deadline.toISOString() : undefined,
77-
startDate: task.startDate ? task.startDate.toISOString() : undefined
76+
deadline: task.deadline ? dateToMidnightUTC(task.deadline).toISOString() : undefined,
77+
startDate: task.startDate ? dateToMidnightUTC(task.startDate).toISOString() : undefined
7878
});
7979
toast.success('All tasks created successfully!');
8080
} catch (error) {

src/frontend/src/pages/GanttPage/ProjectGanttChart/ProjectGanttChangeModals/GanttTimeLineChangeModal.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Box, FormControl, InputLabel, MenuItem, Select, SelectChangeEvent, Text
22
import {
33
ChangeRequestReason,
44
ChangeRequestType,
5+
dateToMidnightUTC,
56
Link,
67
LinkCreateArgs,
78
ProjectGantt,
@@ -151,7 +152,7 @@ export const GanttTimeLineChangeModal = ({ change, handleClose, open }: GanttTim
151152
name: workPackage.name,
152153
stage: workPackage.stage,
153154
duration,
154-
startDate: change.newStart.toISOString(),
155+
startDate: dateToMidnightUTC(change.newStart).toISOString(),
155156
blockedBy: workPackage.blockedBy,
156157
descriptionBullets: workPackage.descriptionBullets,
157158
leadId: workPackage.lead ? workPackage.lead.userId : undefined,
@@ -180,7 +181,7 @@ export const GanttTimeLineChangeModal = ({ change, handleClose, open }: GanttTim
180181
await createSingleWorkPackage({
181182
projectWbsNum: project.wbsNum,
182183
name: workPackage.name,
183-
startDate: workPackage.startDate.toISOString(),
184+
startDate: dateToMidnightUTC(workPackage.startDate).toISOString(),
184185
duration,
185186
stage: workPackage.stage ?? 'NONE',
186187
blockedBy: [],
@@ -198,8 +199,8 @@ export const GanttTimeLineChangeModal = ({ change, handleClose, open }: GanttTim
198199
status: task.status,
199200
assignees: task.assignees?.map((user) => user.userId) || [],
200201
notes: task.notes || '',
201-
deadline: task.deadline?.toISOString(),
202-
startDate: task.startDate?.toISOString()
202+
deadline: task.deadline ? dateToMidnightUTC(task.deadline).toISOString() : undefined,
203+
startDate: task.startDate ? dateToMidnightUTC(task.startDate).toISOString() : undefined
203204
};
204205

205206
try {

0 commit comments

Comments
 (0)