Skip to content

Commit 07212bd

Browse files
committed
Merge branch 'develop' into feature/Project-Form-Redesign
2 parents c6f13ef + 3b9228a commit 07212bd

152 files changed

Lines changed: 5639 additions & 922 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.

.github/workflows/run-tests.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ jobs:
2020
steps:
2121
- name: Checkout repository
2222
uses: actions/checkout@v3
23+
- name: Set env variables
24+
run: touch .env && echo "FINANCE_TEAM_ID=0" >> .env
2325
- name: Set up Node.js
2426
uses: actions/setup-node@v3
2527
with:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ A project management web application built in Typescript, React, and Express.
88

99
All of our documentation is on [our Confluence page](https://nerdocs.atlassian.net/wiki/spaces/NER/pages/5603329/Software). Start there to learn what the project is all about.
1010

11-
All questions can be directed to `#software` in the [NER Slack](https://nu-electric-racing.slack.com) (backup contact: [`@anthonybernardi`](https://github.com/anthonybernardi)).
11+
All questions can be directed to `#software` in the [NER Slack](https://nu-electric-racing.slack.com) (backup contact: [`@RChandler234`](https://github.com/RChandler234)).
1212

1313
## Environment Setup
1414

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,19 @@ export default class ChangeRequestsController {
7575

7676
static async createStandardChangeRequest(req: Request, res: Response, next: NextFunction) {
7777
try {
78-
const { wbsNum, type, what, why } = req.body;
78+
const { wbsNum, type, what, why, proposedSolutions } = req.body;
7979
const submitter = await getCurrentUser(res);
80-
const id = await ChangeRequestsService.createStandardChangeRequest(
80+
const createdCR = await ChangeRequestsService.createStandardChangeRequest(
8181
submitter,
8282
wbsNum.carNumber,
8383
wbsNum.projectNumber,
8484
wbsNum.workPackageNumber,
8585
type,
8686
what,
87-
why
87+
why,
88+
proposedSolutions
8889
);
89-
return res.status(200).json({ message: `${id}` });
90+
return res.status(200).json(createdCR);
9091
} catch (error: unknown) {
9192
next(error);
9293
}

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

Lines changed: 195 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Project, validateWBS, WbsNumber, wbsPipe } from 'shared';
1+
import { Manufacturer, MaterialType, Project, validateWBS, WbsNumber, wbsPipe } from 'shared';
22
import { NextFunction, Request, Response } from 'express';
33
import { User } from '@prisma/client';
44
import { getCurrentUser } from '../utils/auth.utils';
@@ -154,4 +154,198 @@ export default class ProjectsController {
154154
next(error);
155155
}
156156
}
157+
158+
static async createAssembly(req: Request, res: Response, next: NextFunction) {
159+
try {
160+
const user: User = await getCurrentUser(res);
161+
const wbsNum: WbsNumber = validateWBS(req.params.wbsNum);
162+
const { name, pdmFileName } = req.body;
163+
const createAssembly = await ProjectsService.createAssembly(name, user, wbsNum, pdmFileName);
164+
res.status(200).json(createAssembly);
165+
} catch (error: unknown) {
166+
next(error);
167+
}
168+
}
169+
170+
static async createMaterial(req: Request, res: Response, next: NextFunction) {
171+
try {
172+
const {
173+
name,
174+
assemblyId,
175+
status,
176+
materialTypeName,
177+
manufacturerName,
178+
manufacturerPartNumber,
179+
pdmFileName,
180+
quantity,
181+
unitName,
182+
price,
183+
subtotal,
184+
linkUrl,
185+
notes
186+
} = req.body;
187+
const creator = await getCurrentUser(res);
188+
const wbsNum = validateWBS(req.params.wbsNum);
189+
const material = await ProjectsService.createMaterial(
190+
creator,
191+
name,
192+
status,
193+
materialTypeName,
194+
manufacturerName,
195+
manufacturerPartNumber,
196+
quantity,
197+
price,
198+
subtotal,
199+
linkUrl,
200+
notes,
201+
wbsNum,
202+
assemblyId,
203+
pdmFileName,
204+
unitName
205+
);
206+
return res.status(200).json(material);
207+
} catch (error: unknown) {
208+
next(error);
209+
}
210+
}
211+
212+
static async createManufacturer(req: Request, res: Response, next: NextFunction) {
213+
try {
214+
const { name } = req.body;
215+
const user = await getCurrentUser(res);
216+
const createdManufacturer = await ProjectsService.createManufacturer(user, name);
217+
res.status(200).json(createdManufacturer);
218+
} catch (error: unknown) {
219+
next(error);
220+
}
221+
}
222+
223+
static async deleteManufacturer(req: Request, res: Response, next: NextFunction) {
224+
try {
225+
const user: User = await getCurrentUser(res);
226+
const { manufacturerName } = req.params;
227+
const deletedManufacturer = await ProjectsService.deleteManufacturer(user, manufacturerName);
228+
res.status(200).json(deletedManufacturer);
229+
} catch (error: unknown) {
230+
next(error);
231+
}
232+
}
233+
234+
static async getAllManufacturers(req: Request, res: Response, next: NextFunction) {
235+
try {
236+
const user = await getCurrentUser(res);
237+
const manufacturers: Manufacturer[] = await ProjectsService.getAllManufacturers(user);
238+
return res.status(200).json(manufacturers);
239+
} catch (error: unknown) {
240+
next(error);
241+
}
242+
}
243+
244+
static async getAllMaterialTypes(req: Request, res: Response, next: NextFunction) {
245+
try {
246+
const user = await getCurrentUser(res);
247+
const materialTypes: MaterialType[] = await ProjectsService.getAllMaterialTypes(user);
248+
return res.status(200).json(materialTypes);
249+
} catch (error: unknown) {
250+
next(error);
251+
}
252+
}
253+
254+
static async createMaterialType(req: Request, res: Response, next: NextFunction) {
255+
try {
256+
const { name } = req.body;
257+
const user = await getCurrentUser(res);
258+
const createdMaterialType = await ProjectsService.createMaterialType(name, user);
259+
res.status(200).json(createdMaterialType);
260+
} catch (error: unknown) {
261+
next(error);
262+
}
263+
}
264+
265+
static async assignMaterialAssembly(req: Request, res: Response, next: NextFunction) {
266+
try {
267+
const { materialId } = req.params;
268+
const { assemblyId } = req.body;
269+
const user = await getCurrentUser(res);
270+
const updatedMaterial = await ProjectsService.assignMaterialAssembly(user, materialId, assemblyId);
271+
res.status(200).json(updatedMaterial);
272+
} catch (error: unknown) {
273+
next(error);
274+
}
275+
}
276+
277+
static async deleteAssemblyType(req: Request, res: Response, next: NextFunction) {
278+
try {
279+
const { assemblyId } = req.params;
280+
const user = await getCurrentUser(res);
281+
const deletedAssembly = await ProjectsService.deleteAssembly(assemblyId, user);
282+
res.status(200).json(deletedAssembly);
283+
} catch (error: unknown) {
284+
next(error);
285+
}
286+
}
287+
288+
static async deleteMaterialType(req: Request, res: Response, next: NextFunction) {
289+
try {
290+
const { materialTypeId } = req.params;
291+
const user = await getCurrentUser(res);
292+
const deletedMaterial = await ProjectsService.deleteMaterialType(materialTypeId, user);
293+
res.status(200).json(deletedMaterial);
294+
} catch (error: unknown) {
295+
next(error);
296+
}
297+
}
298+
299+
static async deleteMaterial(req: Request, res: Response, next: NextFunction) {
300+
try {
301+
const { materialId } = req.params;
302+
const user: User = await getCurrentUser(res);
303+
const updatedMaterial = await ProjectsService.deleteMaterial(user, materialId);
304+
res.status(200).json(updatedMaterial);
305+
} catch (error: unknown) {
306+
next(error);
307+
}
308+
}
309+
310+
static async editMaterial(req: Request, res: Response, next: NextFunction) {
311+
try {
312+
const user = await getCurrentUser(res);
313+
const { materialId } = req.params;
314+
const {
315+
name,
316+
assemblyId,
317+
status,
318+
materialTypeName,
319+
manufacturerName,
320+
manufacturerPartNumber,
321+
pdmFileName,
322+
quantity,
323+
unitName,
324+
price,
325+
subtotal,
326+
linkUrl,
327+
notes
328+
} = req.body;
329+
const updatedMaterial = await ProjectsService.editMaterial(
330+
user,
331+
materialId,
332+
name,
333+
status,
334+
materialTypeName,
335+
manufacturerName,
336+
manufacturerPartNumber,
337+
quantity,
338+
price,
339+
subtotal,
340+
linkUrl,
341+
notes,
342+
unitName,
343+
assemblyId,
344+
pdmFileName
345+
);
346+
res.status(200).json(updatedMaterial);
347+
} catch (error: unknown) {
348+
next(error);
349+
}
350+
}
157351
}

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

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ export default class ReimbursementRequestsController {
7272
static async reimburseUser(req: Request, res: Response, next: NextFunction) {
7373
try {
7474
const user = await getCurrentUser(res);
75-
const { amount } = req.body;
75+
const { amount, dateReceived } = req.body;
7676

77-
const reimbursement = await ReimbursementRequestService.reimburseUser(amount, user);
77+
const reimbursement = await ReimbursementRequestService.reimburseUser(amount, dateReceived, user);
7878
res.status(200).json(reimbursement);
7979
} catch (error: unknown) {
8080
next(error);
@@ -162,9 +162,15 @@ export default class ReimbursementRequestsController {
162162

163163
static async createExpenseType(req: Request, res: Response, next: NextFunction) {
164164
try {
165-
const { name, code, allowed } = req.body;
165+
const { name, code, allowed, allowedRefundSources } = req.body;
166166
const user = await getCurrentUser(res);
167-
const createdExpenseType = await ReimbursementRequestService.createExpenseType(user, name, code, allowed);
167+
const createdExpenseType = await ReimbursementRequestService.createExpenseType(
168+
user,
169+
name,
170+
code,
171+
allowed,
172+
allowedRefundSources
173+
);
168174
res.status(200).json(createdExpenseType);
169175
} catch (error: unknown) {
170176
next(error);
@@ -182,6 +188,10 @@ export default class ReimbursementRequestsController {
182188

183189
const receipt = await ReimbursementRequestService.uploadReceipt(requestId, file, user);
184190

191+
const isProd = process.env.NODE_ENV === 'production';
192+
const origin = isProd ? 'https://finishlinebyner.com' : 'http://localhost:3000';
193+
194+
res.header('Access-Control-Allow-Origin', origin);
185195
res.status(200).json(receipt);
186196
} catch (error: unknown) {
187197
next(error);
@@ -220,6 +230,17 @@ export default class ReimbursementRequestsController {
220230
}
221231
}
222232

233+
static async denyReimbursementRequest(req: Request, res: Response, next: NextFunction) {
234+
try {
235+
const { requestId } = req.params;
236+
const user = await getCurrentUser(res);
237+
const reimbursementStatus = await ReimbursementRequestService.denyReimbursementRequest(requestId, user);
238+
res.status(200).json(reimbursementStatus);
239+
} catch (error: unknown) {
240+
next(error);
241+
}
242+
}
243+
223244
static async markReimbursementRequestAsDelivered(req: Request, res: Response, next: NextFunction) {
224245
try {
225246
const { requestId } = req.params;
@@ -265,14 +286,15 @@ export default class ReimbursementRequestsController {
265286
static async editExpenseTypeCode(req: Request, res: Response, next: NextFunction) {
266287
try {
267288
const { expenseTypeId } = req.params;
268-
const { name, code, allowed } = req.body;
289+
const { name, code, allowed, allowedRefundSources } = req.body;
269290
const submitter = await getCurrentUser(res);
270291
const expenseTypeUpdated = await ReimbursementRequestService.editExpenseType(
271292
expenseTypeId,
272293
code,
273294
name,
274295
allowed,
275-
submitter
296+
submitter,
297+
allowedRefundSources
276298
);
277299
res.status(200).json(expenseTypeUpdated);
278300
} catch (error: unknown) {

src/backend/src/controllers/teams.controllers.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,38 @@ export default class TeamsController {
6262
next(error);
6363
}
6464
}
65+
66+
static async createTeam(req: Request, res: Response, next: NextFunction) {
67+
try {
68+
const { teamName, headId, slackId, description } = req.body;
69+
const submitter = await getCurrentUser(res);
70+
const team = await TeamsService.createTeam(submitter, teamName, headId, slackId, description);
71+
return res.status(200).json(team);
72+
} catch (error: unknown) {
73+
next(error);
74+
}
75+
}
76+
77+
static async setTeamLeads(req: Request, res: Response, next: NextFunction) {
78+
try {
79+
const { userIds } = req.body;
80+
const { teamId } = req.params;
81+
const submitter = await getCurrentUser(res);
82+
const team = await TeamsService.setTeamLeads(submitter, teamId, userIds);
83+
return res.status(200).json(team);
84+
} catch (error: unknown) {
85+
next(error);
86+
}
87+
}
88+
89+
static async deleteTeam(req: Request, res: Response, next: NextFunction) {
90+
try {
91+
const { teamId } = req.params;
92+
const deleter = await getCurrentUser(res);
93+
await TeamsService.deleteTeam(deleter, teamId);
94+
return res.status(204).json({ message: `Successfully deleted team with id ${teamId}` });
95+
} catch (error: unknown) {
96+
next(error);
97+
}
98+
}
6599
}

0 commit comments

Comments
 (0)