Skip to content

Commit c4cf1eb

Browse files
authored
Merge pull request #4028 from Northeastern-Electric-Racing/feature/global-car-filtering
Feature/global car filtering
2 parents 3932dc3 + ea12487 commit c4cf1eb

77 files changed

Lines changed: 2659 additions & 694 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/backend/custom.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { Organization } from '@prisma/client';
1+
import { Organization, Prisma } from '@prisma/client';
22
import { User as SharedUser } from 'shared';
33

44
declare global {
55
namespace Express {
66
export interface Request {
77
currentUser: SharedUser;
88
organization: Organization;
9+
currentCar?: Prisma.CarGetPayload<{ include: { wbsElement: true } }>;
910
}
1011
}
1112
}

src/backend/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import cors from 'cors';
33
import cookieParser from 'cookie-parser';
44
import { getUserAndOrganization, prodHeaders, requireJwtDev, requireJwtProd } from './src/utils/auth.utils.js';
55
import { errorHandler } from './src/utils/errors.utils.js';
6+
import { getCurrentCar } from './src/utils/car.utils.js';
67
import userRouter from './src/routes/users.routes.js';
78
import projectRouter from './src/routes/projects.routes.js';
89
import teamsRouter from './src/routes/teams.routes.js';
@@ -90,6 +91,9 @@ app.use(isProd ? requireJwtProd : requireJwtDev);
9091
// get user and organization
9192
app.use(getUserAndOrganization);
9293

94+
// get current car
95+
app.use(getCurrentCar);
96+
9397
// routes
9498
app.use('/users', userRouter);
9599
app.use('/projects', projectRouter);

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default class ChangeRequestsController {
1616

1717
static async getAllChangeRequests(req: Request, res: Response, next: NextFunction) {
1818
try {
19-
const changeRequests = await ChangeRequestsService.getAllChangeRequests(req.organization);
19+
const changeRequests = await ChangeRequestsService.getAllChangeRequests(req.organization, req.currentCar?.carId);
2020
res.status(200).json(changeRequests);
2121
} catch (error: unknown) {
2222
next(error);
@@ -34,7 +34,11 @@ export default class ChangeRequestsController {
3434

3535
static async getToReviewChangeRequests(req: Request, res: Response, next: NextFunction) {
3636
try {
37-
const changeRequests = await ChangeRequestsService.getToReviewChangeRequests(req.currentUser, req.organization);
37+
const changeRequests = await ChangeRequestsService.getToReviewChangeRequests(
38+
req.currentUser,
39+
req.organization,
40+
req.currentCar?.carId
41+
);
3842
res.status(200).json(changeRequests);
3943
} catch (error: unknown) {
4044
next(error);
@@ -50,7 +54,8 @@ export default class ChangeRequestsController {
5054
const changeRequests = await ChangeRequestsService.getUnreviewedChangeRequests(
5155
req.currentUser,
5256
validatedWbs,
53-
req.organization
57+
req.organization,
58+
req.currentCar?.carId
5459
);
5560
res.status(200).json(changeRequests);
5661
} catch (error: unknown) {
@@ -67,7 +72,8 @@ export default class ChangeRequestsController {
6772
const changeRequests = await ChangeRequestsService.getApprovedChangeRequests(
6873
req.currentUser,
6974
validatedWbs,
70-
req.organization
75+
req.organization,
76+
req.currentCar?.carId
7177
);
7278
res.status(200).json(changeRequests);
7379
} catch (error: unknown) {

src/backend/src/controllers/finance.controllers.ts

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -172,17 +172,17 @@ export default class FinanceController {
172172
static async getReimbursementRequestTeamData(req: Request, res: Response, next: NextFunction) {
173173
try {
174174
const { teamId } = req.params as Record<string, string>;
175-
const { startDate, endDate, carNumber } = req.query;
175+
const { startDate, endDate } = req.query;
176176
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
177177
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
178-
const parsedCarNumber = typeof carNumber === 'string' ? Number(carNumber) : undefined;
178+
const carNumber = req.currentCar?.wbsElement.carNumber;
179179

180180
const rrData = await FinanceServices.getReimbursementRequestTeamData(
181181
req.organization,
182182
teamId,
183183
parsedStartDate,
184184
parsedEndDate,
185-
parsedCarNumber
185+
carNumber
186186
);
187187
res.status(200).json(rrData);
188188
} catch (error: unknown) {
@@ -193,17 +193,17 @@ export default class FinanceController {
193193
static async getReimbursementRequestTeamTypeData(req: Request, res: Response, next: NextFunction) {
194194
try {
195195
const { teamTypeId } = req.params as Record<string, string>;
196-
const { startDate, endDate, carNumber } = req.query;
196+
const { startDate, endDate } = req.query;
197197
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
198198
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
199-
const parsedCarNumber = typeof carNumber === 'string' ? Number(carNumber) : undefined;
199+
const carNumber = req.currentCar?.wbsElement.carNumber;
200200

201201
const rrData = await FinanceServices.getReimbursementRequestTeamTypeData(
202202
req.organization,
203203
teamTypeId,
204204
parsedStartDate,
205205
parsedEndDate,
206-
parsedCarNumber
206+
carNumber
207207
);
208208
res.status(200).json(rrData);
209209
} catch (error: unknown) {
@@ -214,17 +214,17 @@ export default class FinanceController {
214214
static async getSpendingBarTeamData(req: Request, res: Response, next: NextFunction) {
215215
try {
216216
const { teamId } = req.params as Record<string, string>;
217-
const { startDate, endDate, carNumber } = req.query;
217+
const { startDate, endDate } = req.query;
218218
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
219219
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
220-
const parsedCarNumber = typeof carNumber === 'string' ? Number(carNumber) : undefined;
220+
const carNumber = req.currentCar?.wbsElement.carNumber;
221221

222222
const spendingBarData = await FinanceServices.getSpendingBarTeamData(
223223
req.organization,
224224
teamId,
225225
parsedStartDate,
226226
parsedEndDate,
227-
parsedCarNumber
227+
carNumber
228228
);
229229
res.status(200).json(spendingBarData);
230230
} catch (error: unknown) {
@@ -235,17 +235,17 @@ export default class FinanceController {
235235
static async getSpendingBarTeamTypeData(req: Request, res: Response, next: NextFunction) {
236236
try {
237237
const { teamTypeId } = req.params as Record<string, string>;
238-
const { startDate, endDate, carNumber } = req.query;
238+
const { startDate, endDate } = req.query;
239239
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
240240
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
241-
const parsedCarNumber = typeof carNumber === 'string' ? Number(carNumber) : undefined;
241+
const carNumber = req.currentCar?.wbsElement.carNumber;
242242

243243
const spendingBarData = await FinanceServices.getSpendingBarTeamTypeData(
244244
req.organization,
245245
teamTypeId,
246246
parsedStartDate,
247247
parsedEndDate,
248-
parsedCarNumber
248+
carNumber
249249
);
250250
res.status(200).json(spendingBarData);
251251
} catch (error: unknown) {
@@ -255,16 +255,16 @@ export default class FinanceController {
255255

256256
static async getAllReimbursementRequestData(req: Request, res: Response, next: NextFunction) {
257257
try {
258-
const { startDate, endDate, carNumber } = req.query;
258+
const { startDate, endDate } = req.query;
259259
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
260260
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
261-
const parsedCarNumber = typeof carNumber === 'string' ? Number(carNumber) : undefined;
261+
const carNumber = req.currentCar?.wbsElement.carNumber;
262262

263263
const rrData = await FinanceServices.getAllReimbursementRequestData(
264264
req.organization,
265265
parsedStartDate,
266266
parsedEndDate,
267-
parsedCarNumber
267+
carNumber
268268
);
269269
res.status(200).json(rrData);
270270
} catch (error: unknown) {
@@ -275,17 +275,17 @@ export default class FinanceController {
275275
static async getReimbursementRequestCategoryData(req: Request, res: Response, next: NextFunction) {
276276
try {
277277
const { otherReasonId } = req.params as Record<string, string>;
278-
const { startDate, endDate, carNumber } = req.query;
278+
const { startDate, endDate } = req.query;
279279
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
280280
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
281-
const parsedCarNumber = typeof carNumber === 'string' ? Number(carNumber) : undefined;
281+
const carNumber = req.currentCar?.wbsElement.carNumber;
282282

283283
const rrData = await FinanceServices.getReimbursementRequestCategoryData(
284284
otherReasonId,
285285
req.organization,
286286
parsedStartDate,
287287
parsedEndDate,
288-
parsedCarNumber
288+
carNumber
289289
);
290290
res.status(200).json(rrData);
291291
} catch (error: unknown) {
@@ -295,16 +295,16 @@ export default class FinanceController {
295295

296296
static async getAllSpendingBarData(req: Request, res: Response, next: NextFunction) {
297297
try {
298-
const { startDate, endDate, carNumber } = req.query;
298+
const { startDate, endDate } = req.query;
299299
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
300300
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
301-
const parsedCarNumber = typeof carNumber === 'string' ? Number(carNumber) : undefined;
301+
const carNumber = req.currentCar?.wbsElement.carNumber;
302302

303303
const spendingBarData = await FinanceServices.getAllSpendingBarData(
304304
req.organization,
305305
parsedStartDate,
306306
parsedEndDate,
307-
parsedCarNumber
307+
carNumber
308308
);
309309
res.status(200).json(spendingBarData);
310310
} catch (error: unknown) {
@@ -314,7 +314,17 @@ export default class FinanceController {
314314

315315
static async getSpendingBarCategoryData(req: Request, res: Response, next: NextFunction) {
316316
try {
317-
const spendingBarData = await FinanceServices.getSpendingBarCategoryData(req.organization);
317+
const { startDate, endDate } = req.query;
318+
const parsedStartDate = typeof startDate === 'string' ? new Date(startDate) : undefined;
319+
const parsedEndDate = typeof endDate === 'string' ? new Date(endDate) : undefined;
320+
const carNumber = req.currentCar?.wbsElement.carNumber;
321+
322+
const spendingBarData = await FinanceServices.getSpendingBarCategoryData(
323+
req.organization,
324+
parsedStartDate,
325+
parsedEndDate,
326+
carNumber
327+
);
318328
res.status(200).json(spendingBarData);
319329
} catch (error: unknown) {
320330
next(error);

src/backend/src/controllers/projects.controllers.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import BillOfMaterialsService from '../services/boms.services.js';
1616
export default class ProjectsController {
1717
static async getAllProjectsGantt(req: Request, res: Response, next: NextFunction) {
1818
try {
19-
const projects: ProjectGantt[] = await ProjectsService.getAllProjectsGantt(req.organization);
19+
const projects: ProjectGantt[] = await ProjectsService.getAllProjectsGantt(req.organization, req.currentCar?.carId);
2020
res.status(200).json(projects);
2121
} catch (error: unknown) {
2222
next(error);
@@ -25,7 +25,7 @@ export default class ProjectsController {
2525

2626
static async getAllProjects(req: Request, res: Response, next: NextFunction) {
2727
try {
28-
const projects: ProjectPreview[] = await ProjectsService.getAllProjects(req.organization);
28+
const projects: ProjectPreview[] = await ProjectsService.getAllProjects(req.organization, req.currentCar?.carId);
2929
res.status(200).json(projects);
3030
} catch (error: unknown) {
3131
next(error);
@@ -34,7 +34,11 @@ export default class ProjectsController {
3434

3535
static async getUsersTeamsProjects(req: Request, res: Response, next: NextFunction) {
3636
try {
37-
const projects: ProjectOverview[] = await ProjectsService.getUsersTeamsProjects(req.currentUser, req.organization);
37+
const projects: ProjectOverview[] = await ProjectsService.getUsersTeamsProjects(
38+
req.currentUser,
39+
req.organization,
40+
req.currentCar?.carId
41+
);
3842
res.status(200).json(projects);
3943
} catch (error: unknown) {
4044
next(error);
@@ -43,7 +47,11 @@ export default class ProjectsController {
4347

4448
static async getUsersLeadingProjects(req: Request, res: Response, next: NextFunction) {
4549
try {
46-
const projects: ProjectOverview[] = await ProjectsService.getUsersLeadingProjects(req.currentUser, req.organization);
50+
const projects: ProjectOverview[] = await ProjectsService.getUsersLeadingProjects(
51+
req.currentUser,
52+
req.organization,
53+
req.currentCar?.carId
54+
);
4755
res.status(200).json(projects);
4856
} catch (error: unknown) {
4957
next(error);
@@ -53,7 +61,7 @@ export default class ProjectsController {
5361
static async getTeamsProjects(req: Request, res: Response, next: NextFunction) {
5462
try {
5563
const { teamId } = req.params as Record<string, string>;
56-
const projects: Project[] = await ProjectsService.getTeamsProjects(req.organization, teamId);
64+
const projects: Project[] = await ProjectsService.getTeamsProjects(req.organization, teamId, req.currentCar?.carId);
5765
res.status(200).json(projects);
5866
} catch (error: unknown) {
5967
next(error);

src/backend/src/controllers/reimbursement-requests.controllers.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import { HttpException } from '../utils/errors.utils.js';
1313
export default class ReimbursementRequestsController {
1414
static async getCurrentUserReimbursementRequests(req: Request, res: Response, next: NextFunction) {
1515
try {
16+
const carNumber = req.currentCar?.wbsElement.carNumber;
1617
const userReimbursementRequests = await ReimbursementRequestService.getUserReimbursementRequests(
1718
req.currentUser,
18-
req.organization
19+
req.organization,
20+
carNumber
1921
);
2022
res.status(200).json(userReimbursementRequests);
2123
} catch (error: unknown) {
@@ -25,9 +27,11 @@ export default class ReimbursementRequestsController {
2527

2628
static async getCurrentUserAssignedReimbursementRequests(req: Request, res: Response, next: NextFunction) {
2729
try {
30+
const carNumber = req.currentCar?.wbsElement.carNumber;
2831
const assignedReimbursementRequests = await ReimbursementRequestService.getUserAssignedReimbursementRequests(
2932
req.currentUser,
30-
req.organization
33+
req.organization,
34+
carNumber
3135
);
3236
res.status(200).json(assignedReimbursementRequests);
3337
} catch (error: unknown) {
@@ -46,9 +50,11 @@ export default class ReimbursementRequestsController {
4650

4751
static async getCurrentUsersTeamsReimbursementRequests(req: Request, res: Response, next: NextFunction) {
4852
try {
53+
const carNumber = req.currentCar?.wbsElement.carNumber;
4954
const userTeamsReimbursementRequests = await ReimbursementRequestService.getUsersTeamsReimbursementRequests(
5055
req.currentUser,
51-
req.organization
56+
req.organization,
57+
carNumber
5258
);
5359
res.status(200).json(userTeamsReimbursementRequests);
5460
} catch (error: unknown) {
@@ -208,9 +214,11 @@ export default class ReimbursementRequestsController {
208214

209215
static async getPendingAdvisorList(req: Request, res: Response, next: NextFunction) {
210216
try {
217+
const carNumber = req.currentCar?.wbsElement.carNumber;
211218
const requestsPendingAdvisors: ReimbursementRequest[] = await ReimbursementRequestService.getPendingAdvisorList(
212219
req.currentUser,
213-
req.organization
220+
req.organization,
221+
carNumber
214222
);
215223
res.status(200).json(requestsPendingAdvisors);
216224
} catch (error: unknown) {
@@ -308,9 +316,11 @@ export default class ReimbursementRequestsController {
308316

309317
static async getAllReimbursementRequests(req: Request, res: Response, next: NextFunction) {
310318
try {
319+
const carNumber = req.currentCar?.wbsElement.carNumber;
311320
const reimbursementRequests: ReimbursementRequest[] = await ReimbursementRequestService.getAllReimbursementRequests(
312321
req.currentUser,
313-
req.organization
322+
req.organization,
323+
carNumber
314324
);
315325
res.status(200).json(reimbursementRequests);
316326
} catch (error: unknown) {

src/backend/src/controllers/users.controllers.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,11 @@ export default class UsersController {
7474

7575
static async getUsersFavoriteProjects(req: Request, res: Response, next: NextFunction) {
7676
try {
77-
const projects = await UsersService.getUsersFavoriteProjects(req.currentUser.userId, req.organization);
77+
const projects = await UsersService.getUsersFavoriteProjects(
78+
req.currentUser.userId,
79+
req.organization,
80+
req.currentCar?.carId
81+
);
7882

7983
res.status(200).json(projects);
8084
} catch (error: unknown) {

0 commit comments

Comments
 (0)