Skip to content

Commit bce8696

Browse files
committed
Merge branch 'develop' of https://github.com/Northeastern-Electric-Racing/FinishLine into #2063-use-all-design-reviews-hook
2 parents a75d162 + 5bd5e3c commit bce8696

59 files changed

Lines changed: 2980 additions & 223 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/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import changeRequestsRouter from './src/routes/change-requests.routes';
1111
import descriptionBulletsRouter from './src/routes/description-bullets.routes';
1212
import tasksRouter from './src/routes/tasks.routes';
1313
import reimbursementRequestsRouter from './src/routes/reimbursement-requests.routes';
14-
import designReviewRouter from './src/routes/design-review.routes';
1514
import notificationsRouter from './src/routes/notifications.routes';
15+
import designReviewsRouter from './src/routes/design-reviews.routes';
1616

1717
const app = express();
1818
const port = process.env.PORT || 3001;
@@ -54,7 +54,7 @@ app.use('/change-requests', changeRequestsRouter);
5454
app.use('/description-bullets', descriptionBulletsRouter);
5555
app.use('/tasks', tasksRouter);
5656
app.use('/reimbursement-requests', reimbursementRequestsRouter);
57-
app.use('/design-reviews', designReviewRouter);
57+
app.use('/design-reviews', designReviewsRouter);
5858
app.use('/notifications', notificationsRouter);
5959
app.use('/', (_req, res) => {
6060
res.json('Welcome to FinishLine');

src/backend/src/controllers/design-review.controllers.ts

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import { NextFunction, Request, Response } from 'express';
2+
import DesignReviewsService from '../services/design-reviews.services';
3+
import { getCurrentUser } from '../utils/auth.utils';
4+
import { User } from '@prisma/client';
5+
6+
export default class DesignReviewsController {
7+
static async getAllDesignReviews(_req: Request, res: Response, next: NextFunction) {
8+
try {
9+
const designReviews = await DesignReviewsService.getAllDesignReviews();
10+
return res.status(200).json(designReviews);
11+
} catch (error: unknown) {
12+
next(error);
13+
}
14+
}
15+
16+
static async deleteDesignReview(req: Request, res: Response, next: NextFunction) {
17+
try {
18+
const drId: string = req.params.designReviewId;
19+
const user: User = await getCurrentUser(res);
20+
const deletedDesignReview = await DesignReviewsService.deleteDesignReview(user, drId);
21+
return res.status(200).json(deletedDesignReview);
22+
} catch (error: unknown) {
23+
next(error);
24+
}
25+
}
26+
27+
static async createDesignReview(req: Request, res: Response, next: NextFunction) {
28+
try {
29+
const submitter: User = await getCurrentUser(res);
30+
const {
31+
dateScheduled,
32+
teamTypeId,
33+
requiredMemberIds,
34+
optionalMemberIds,
35+
location,
36+
isOnline,
37+
isInPerson,
38+
zoomLink,
39+
docTemplateLink,
40+
wbsNum,
41+
meetingTimes
42+
} = req.body;
43+
44+
const createdDesignReview = await DesignReviewsService.createDesignReview(
45+
submitter,
46+
dateScheduled,
47+
teamTypeId,
48+
requiredMemberIds,
49+
optionalMemberIds,
50+
isOnline,
51+
isInPerson,
52+
docTemplateLink,
53+
wbsNum,
54+
meetingTimes,
55+
zoomLink,
56+
location
57+
);
58+
return res.status(200).json(createdDesignReview);
59+
} catch (error: unknown) {
60+
next(error);
61+
}
62+
}
63+
64+
static async getSingleDesignReview(req: Request, res: Response, next: NextFunction) {
65+
try {
66+
const drId: string = req.params.designReviewId;
67+
const user: User = await getCurrentUser(res);
68+
const designReview = await DesignReviewsService.getSingleDesignReview(user, drId);
69+
return res.status(200).json(designReview);
70+
} catch (error: unknown) {
71+
next(error);
72+
}
73+
}
74+
75+
// Edit a work package to the given specifications
76+
static async editDesignReviews(req: Request, res: Response, next: NextFunction) {
77+
try {
78+
const {
79+
dateScheduled,
80+
teamType,
81+
requiredMembers,
82+
optionalMembers,
83+
isOnline,
84+
isInPerson,
85+
zoomLink,
86+
location,
87+
docTemplateLink,
88+
status,
89+
attendees,
90+
meetingTimes
91+
} = req.body;
92+
93+
const { designReviewId } = req.params;
94+
95+
// get the user from the submitter
96+
const user = await getCurrentUser(res);
97+
98+
await DesignReviewsService.editDesignReview(
99+
user,
100+
designReviewId,
101+
dateScheduled,
102+
teamType.teamTypeId,
103+
requiredMembers,
104+
optionalMembers,
105+
isOnline,
106+
isInPerson,
107+
zoomLink,
108+
location,
109+
docTemplateLink,
110+
status,
111+
attendees,
112+
meetingTimes
113+
);
114+
return res.status(200).json({ message: 'Design Review updated successfully' });
115+
} catch (error: unknown) {
116+
next(error);
117+
}
118+
}
119+
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,24 @@ export default class UsersController {
146146
}
147147
}
148148

149+
static async setUserScheduleSettings(req: Request, res: Response, next: NextFunction) {
150+
try {
151+
const { personalGmail, personalZoomLink, availability } = req.body;
152+
const user = await getCurrentUser(res);
153+
154+
const updatedScheduleSettings = await UsersService.setUserScheduleSettings(
155+
user,
156+
personalGmail,
157+
personalZoomLink,
158+
availability
159+
);
160+
161+
return res.status(200).json(updatedScheduleSettings);
162+
} catch (error: unknown) {
163+
next(error);
164+
}
165+
}
166+
149167
static async getUserScheduleSettings(req: Request, res: Response, next: NextFunction) {
150168
try {
151169
const userId: number = parseInt(req.params.userId);

src/backend/src/prisma-query-args/design-review.query-args.ts renamed to src/backend/src/prisma-query-args/design-reviews.query-args.ts

File renamed without changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
Warnings:
3+
4+
- Added the required column `iconName` to the `TeamType` table without a default value. This is not possible if the table is not empty.
5+
6+
*/
7+
-- AlterTable
8+
ALTER TABLE "TeamType" ADD COLUMN "iconName" TEXT NOT NULL;

src/backend/src/prisma/schema.prisma

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,13 +590,14 @@ enum Design_Review_Status {
590590
model TeamType {
591591
teamTypeId String @id @default(uuid())
592592
name String @unique
593+
iconName String
593594
Design_Reviews Design_Review[]
594595
}
595596

596597
model Design_Review {
597598
designReviewId String @id @default(uuid())
598599
dateScheduled DateTime @db.Date
599-
// Meeting times are an integer between 0 and 48 representing time after 9am in 15 minute increments, eg. 0 = 9:00am, 5 = 10:15 am
600+
// Meeting times are an integer between 0 and 83 representing time after 9am in 15 minute increments, eg. 0 = 9:00am, 5 = 10:15 am
600601
meetingTimes Int[]
601602
dateCreated DateTime @default(now()) @db.Timestamp(3)
602603
userCreated User @relation(fields: [userCreatedId], references: [userId], name: "designReviewCreator")

src/backend/src/routes/design-review.routes.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import express from 'express';
2+
import { body } from 'express-validator';
3+
import { intMinZero, nonEmptyString, isDate, isDesignReviewStatus } from '../utils/validation.utils';
4+
import DesignReviewsController from '../controllers/design-reviews.controllers';
5+
import { validateInputs } from '../utils/utils';
6+
const designReviewsRouter = express.Router();
7+
8+
designReviewsRouter.get('/', DesignReviewsController.getAllDesignReviews);
9+
10+
designReviewsRouter.delete('/:designReviewId/delete', DesignReviewsController.deleteDesignReview);
11+
designReviewsRouter.get('/:designReviewId', DesignReviewsController.getSingleDesignReview);
12+
13+
designReviewsRouter.post(
14+
'/create',
15+
isDate(body('dateScheduled')),
16+
nonEmptyString(body('teamTypeId')),
17+
body('requiredMemberIds').isArray(),
18+
intMinZero(body('requiredMemberIds.*')),
19+
body('optionalMemberIds').isArray(),
20+
intMinZero(body('optionalMemberIds.*')),
21+
nonEmptyString(body('location').optional()),
22+
body('isOnline').isBoolean(),
23+
body('isInPerson').isBoolean(),
24+
nonEmptyString(body('zoomLink').optional()),
25+
nonEmptyString(body('docTemplateLink')).optional(),
26+
body('wbsNum'),
27+
body('meetingTimes').isArray(),
28+
intMinZero(body('meetingTimes.*')),
29+
validateInputs,
30+
DesignReviewsController.createDesignReview
31+
);
32+
33+
designReviewsRouter.post(
34+
'/:designReviewId/edit',
35+
isDate(body('dateScheduled')),
36+
nonEmptyString(body('teamTypeId')),
37+
body('requiredMembersIds').isArray(),
38+
intMinZero(body('requiredMembersIds.*')),
39+
body('optionalMembersIds').isArray(),
40+
intMinZero(body('optionalMembersIds.*')),
41+
body('isOnline').isBoolean(),
42+
body('isInPerson').isBoolean(),
43+
nonEmptyString(body('zoomLink')).isURL().optional(),
44+
nonEmptyString(body('location')).optional(),
45+
nonEmptyString(body('docTemplateLink')).isURL().optional(),
46+
isDesignReviewStatus(body('status')),
47+
body('attendees').isArray(),
48+
intMinZero(body('attendees.*')),
49+
body('meetingTimes').isArray(),
50+
intMinZero(body('meetingTimes.*')),
51+
validateInputs,
52+
DesignReviewsController.editDesignReviews
53+
);
54+
55+
export default designReviewsRouter;

src/backend/src/routes/users.routes.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import express from 'express';
33
import { body } from 'express-validator';
44
import UsersController from '../controllers/users.controllers';
55
import { validateInputs } from '../utils/utils';
6-
import { isRole, nonEmptyString } from '../utils/validation.utils';
6+
import { isRole, nonEmptyString, intMinZero } from '../utils/validation.utils';
77

88
const userRouter = express.Router();
99

@@ -32,6 +32,18 @@ userRouter.post(
3232
nonEmptyString(body('phoneNumber')),
3333
UsersController.setUserSecureSettings
3434
);
35+
36+
userRouter.post(
37+
'/schedule-settings/set',
38+
nonEmptyString(body('personalGmail')).isEmail(),
39+
nonEmptyString(body('personalZoomLink')).isURL(),
40+
body('availability').isArray(),
41+
intMinZero(body('availibility.*')),
42+
validateInputs,
43+
UsersController.setUserScheduleSettings
44+
);
45+
3546
userRouter.get('/:userId/secure-settings', UsersController.getUserSecureSettings);
3647
userRouter.get('/:userId/schedule-settings', UsersController.getUserScheduleSettings);
48+
3749
export default userRouter;

0 commit comments

Comments
 (0)