Skip to content

Commit 325e138

Browse files
committed
merge with current develop
2 parents c45a859 + 7074c55 commit 325e138

247 files changed

Lines changed: 10903 additions & 6226 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.

devContainerization/Dockerfile.backend.dev

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:20
1+
FROM node:20-slim
22
WORKDIR /base
33

44
COPY package.json tsconfig.build.json ./

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"istart": "yarn i && yarn start",
4545
"reset": "rimraf yarn.lock; rimraf src/frontend/node_modules; rimraf src/backend/node_modules; rimraf src/shared/node_modules; rimraf ./node_modules; ",
4646
"install:hard": "yarn reset; yarn install; yarn prisma:generate",
47-
"tsc-check": "tsc --noEmit --project src/backend/tsconfig.json && tsc --noEmit --project src/frontend/tsconfig.json",
47+
"tsc-check": "tsc --noEmit --project src/frontend/tsconfig.json && tsc --noEmit --project src/backend/tsconfig.json",
4848
"docker:dev": "docker stop finishline; cd devContainerization; docker compose -f docker-compose.dev.yml down && docker compose -f docker-compose.dev.yml build && docker compose -f docker-compose.dev.yml up --watch",
4949
"exec:frontend": "docker exec -it frontend /bin/sh",
5050
"exec:backend": "docker exec -it backend /bin/sh"
@@ -54,6 +54,7 @@
5454
"@types/react-dom": "17.0.1"
5555
},
5656
"dependencies": {
57+
"@types/multer": "^1.4.12",
5758
"mitt": "^3.0.1",
5859
"typescript": "^5.7.3"
5960
},

src/backend/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import tasksRouter from './src/routes/tasks.routes';
1313
import reimbursementRequestsRouter from './src/routes/reimbursement-requests.routes';
1414
import notificationsRouter from './src/routes/notifications.routes';
1515
import designReviewsRouter from './src/routes/design-reviews.routes';
16-
import workPackageTemplatesRouter from './src/routes/work-package-templates.routes';
16+
import wbsElementTemplatesRouter from './src/routes/wbs-element-templates.routes';
1717
import carsRouter from './src/routes/cars.routes';
1818
import organizationRouter from './src/routes/organizations.routes';
1919
import recruitmentRouter from './src/routes/recruitment.routes';
@@ -22,6 +22,7 @@ import announcementsRouter from './src/routes/announcements.routes';
2222
import onboardingRouter from './src/routes/onboarding.routes';
2323
import popUpsRouter from './src/routes/pop-up.routes';
2424
import statisticsRouter from './src/routes/statistics.routes';
25+
import retrospectiveRouter from './src/routes/retrospective.routes';
2526
import partsRouter from './src/routes/parts.routes';
2627

2728
const app = express();
@@ -74,14 +75,15 @@ app.use('/tasks', tasksRouter);
7475
app.use('/reimbursement-requests', reimbursementRequestsRouter);
7576
app.use('/design-reviews', designReviewsRouter);
7677
app.use('/notifications', notificationsRouter);
77-
app.use('/templates', workPackageTemplatesRouter);
78+
app.use('/templates', wbsElementTemplatesRouter);
7879
app.use('/cars', carsRouter);
7980
app.use('/organizations', organizationRouter);
8081
app.use('/recruitment', recruitmentRouter);
8182
app.use('/pop-ups', popUpsRouter);
8283
app.use('/announcements', announcementsRouter);
8384
app.use('/onboarding', onboardingRouter);
8485
app.use('/statistics', statisticsRouter);
86+
app.use('/retrospective', retrospectiveRouter);
8587
app.use('/parts', partsRouter);
8688
app.use('/', (_req, res) => {
8789
res.status(200).json('Welcome to FinishLine');

src/backend/src/controllers/announcements.controllers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NextFunction, Request, Response } from 'express';
2-
import AnnouncementService from '../services/announcement.service';
2+
import AnnouncementService from '../services/announcement.services';
33

44
export default class AnnouncementController {
55
static async getUserUnreadAnnouncements(req: Request, res: Response, next: NextFunction) {

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Request, Response, NextFunction } from 'express';
22
import ChangeRequestsService from '../services/change-requests.services';
3+
import { validateWBS, WbsNumber } from 'shared';
34

45
export default class ChangeRequestsController {
56
static async getChangeRequestByID(req: Request, res: Response, next: NextFunction) {
@@ -33,7 +34,15 @@ export default class ChangeRequestsController {
3334

3435
static async getUnreviewedChangeRequests(req: Request, res: Response, next: NextFunction) {
3536
try {
36-
const changeRequests = await ChangeRequestsService.getUnreviewedChangeRequests(req.currentUser, req.organization);
37+
const { wbsnum } = req.query;
38+
let validatedWbs: WbsNumber | undefined;
39+
if (wbsnum) validatedWbs = validateWBS(wbsnum as string);
40+
41+
const changeRequests = await ChangeRequestsService.getUnreviewedChangeRequests(
42+
req.currentUser,
43+
validatedWbs,
44+
req.organization
45+
);
3746
res.status(200).json(changeRequests);
3847
} catch (error: unknown) {
3948
next(error);
@@ -42,7 +51,15 @@ export default class ChangeRequestsController {
4251

4352
static async getApprovedChangeRequests(req: Request, res: Response, next: NextFunction) {
4453
try {
45-
const changeRequests = await ChangeRequestsService.getApprovedChangeRequests(req.currentUser, req.organization);
54+
const { wbsnum } = req.query;
55+
let validatedWbs: WbsNumber | undefined;
56+
if (wbsnum) validatedWbs = validateWBS(wbsnum as string);
57+
58+
const changeRequests = await ChangeRequestsService.getApprovedChangeRequests(
59+
req.currentUser,
60+
validatedWbs,
61+
req.organization
62+
);
4663
res.status(200).json(changeRequests);
4764
} catch (error: unknown) {
4865
next(error);

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

Lines changed: 63 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Manufacturer, MaterialType, Project, validateWBS, WbsNumber, wbsPipe } from 'shared';
1+
import { Manufacturer, MaterialType, Project, ProjectPreview, validateWBS, WbsNumber, wbsPipe } from 'shared';
22
import { NextFunction, Request, Response } from 'express';
33
import ProjectsService from '../services/projects.services';
44
import BillOfMaterialsService from '../services/boms.services';
@@ -7,7 +7,25 @@ export default class ProjectsController {
77
static async getAllProjects(req: Request, res: Response, next: NextFunction) {
88
try {
99
const includeDeleted = req.params.deleted === 'true';
10-
const projects: Project[] = await ProjectsService.getAllProjects(req.organization, includeDeleted);
10+
const projects: ProjectPreview[] = await ProjectsService.getAllProjects(req.organization, includeDeleted);
11+
res.status(200).json(projects);
12+
} catch (error: unknown) {
13+
next(error);
14+
}
15+
}
16+
17+
static async getUsersTeamsProjects(req: Request, res: Response, next: NextFunction) {
18+
try {
19+
const projects: ProjectPreview[] = await ProjectsService.getUsersTeamsProjects(req.currentUser, req.organization);
20+
res.status(200).json(projects);
21+
} catch (error: unknown) {
22+
next(error);
23+
}
24+
}
25+
26+
static async getUsersLeadingProjects(req: Request, res: Response, next: NextFunction) {
27+
try {
28+
const projects: ProjectPreview[] = await ProjectsService.getUsersLeadingProjects(req.currentUser, req.organization);
1129
res.status(200).json(projects);
1230
} catch (error: unknown) {
1331
next(error);
@@ -109,27 +127,6 @@ export default class ProjectsController {
109127
}
110128
}
111129

112-
static async setAbbreviation(req: Request, res: Response, next: NextFunction) {
113-
try {
114-
const { abbreviation } = req.body;
115-
const wbsNum: WbsNumber = validateWBS(req.body.wbsNum);
116-
const updatedProject = await ProjectsService.setAbbreviation(wbsNum, req.currentUser, req.organization, abbreviation);
117-
res.status(200).json(updatedProject);
118-
} catch (error: unknown) {
119-
next(error);
120-
}
121-
}
122-
123-
static async deleteAbbreviation(req: Request, res: Response, next: NextFunction) {
124-
try {
125-
const wbsNum: WbsNumber = validateWBS(req.params.wbsNum);
126-
await ProjectsService.deleteAbbreviation(wbsNum, req.currentUser, req.organization);
127-
res.status(200).json({ message: `Project ${wbsPipe(wbsNum)}'s abbreviation was successfully deleted.` });
128-
} catch (error: unknown) {
129-
next(error);
130-
}
131-
}
132-
133130
static async getAllLinkTypes(req: Request, res: Response, next: NextFunction) {
134131
try {
135132
const linkTypes = await ProjectsService.getAllLinkTypes(req.organization);
@@ -421,4 +418,47 @@ export default class ProjectsController {
421418
next(error);
422419
}
423420
}
421+
422+
static async getAssembliesForWbsElement(req: Request, res: Response, next: NextFunction) {
423+
try {
424+
const wbsNumber: WbsNumber = validateWBS(req.params.wbsNum);
425+
426+
const assemblies = await BillOfMaterialsService.getAssembliesForWbsElement(wbsNumber, req.organization);
427+
res.status(200).json(assemblies);
428+
} catch (error: unknown) {
429+
next(error);
430+
}
431+
}
432+
433+
static async getMaterialsForWbsElement(req: Request, res: Response, next: NextFunction) {
434+
try {
435+
const wbsNumber: WbsNumber = validateWBS(req.params.wbsNum);
436+
437+
const assemblies = await BillOfMaterialsService.getMaterialsForWbsElement(wbsNumber, req.organization);
438+
res.status(200).json(assemblies);
439+
} catch (error: unknown) {
440+
next(error);
441+
}
442+
}
443+
444+
static async setAbbreviation(req: Request, res: Response, next: NextFunction) {
445+
try {
446+
const { abbreviation } = req.body;
447+
const wbsNum: WbsNumber = validateWBS(req.body.wbsNum);
448+
const updatedProject = await ProjectsService.setAbbreviation(wbsNum, req.currentUser, req.organization, abbreviation);
449+
res.status(200).json(updatedProject);
450+
} catch (error: unknown) {
451+
next(error);
452+
}
453+
}
454+
455+
static async deleteAbbreviation(req: Request, res: Response, next: NextFunction) {
456+
try {
457+
const wbsNum: WbsNumber = validateWBS(req.params.wbsNum);
458+
await ProjectsService.deleteAbbreviation(wbsNum, req.currentUser, req.organization);
459+
res.status(200).json({ message: `Project ${wbsPipe(wbsNum)}'s abbreviation was successfully deleted.` });
460+
} catch (error: unknown) {
461+
next(error);
462+
}
463+
}
424464
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { NextFunction, Request, Response } from 'express';
2+
import RetrospectiveService from '../services/retrospective.services';
3+
4+
export default class RetrospectiveController {
5+
static async getRetrospectiveTimelines(req: Request, res: Response, next: NextFunction) {
6+
try {
7+
const { start, end } = req.query;
8+
const projects = await RetrospectiveService.getRetrospectiveTimelines(
9+
req.organization.organizationId,
10+
start ? new Date(start as string) : undefined,
11+
end ? new Date(end as string) : undefined
12+
);
13+
res.json(projects);
14+
} catch (error) {
15+
next(error);
16+
}
17+
}
18+
19+
static async getRetrospectiveBudgets(req: Request, res: Response, next: NextFunction) {
20+
try {
21+
const projects = await RetrospectiveService.getRetrospectiveBudgets(req.organization.organizationId);
22+
res.json(projects);
23+
} catch (error) {
24+
next(error);
25+
}
26+
}
27+
}

src/backend/src/controllers/tasks.controllers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default class TasksController {
1212
req.currentUser,
1313
wbsNum,
1414
title,
15-
notes,
15+
notes ?? '',
1616
priority,
1717
status,
1818
assignees,

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NextFunction, Request, Response } from 'express';
22
import TeamsService from '../services/teams.services';
33
import { HttpException } from '../utils/errors.utils';
4+
import { WorkPackage } from 'shared';
45

56
export default class TeamsController {
67
static async getAllTeams(req: Request, res: Response, next: NextFunction) {
@@ -237,4 +238,13 @@ export default class TeamsController {
237238
next(error);
238239
}
239240
}
241+
242+
static async getMyTeamsWorkpackages(req: Request, res: Response, next: NextFunction) {
243+
try {
244+
const workPackages: WorkPackage[] = await TeamsService.getMyTeamsWorkpackages(req.currentUser, req.organization);
245+
res.json(workPackages);
246+
} catch (error) {
247+
next(error);
248+
}
249+
}
240250
}

0 commit comments

Comments
 (0)