Skip to content

Commit 862c452

Browse files
committed
Merge branch 'develop' into multitenancy
2 parents 2781ec5 + 24a3ef8 commit 862c452

100 files changed

Lines changed: 4036 additions & 3280 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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2627
const app = express();
2728

@@ -81,6 +82,7 @@ app.use('/pop-ups', popUpsRouter);
8182
app.use('/announcements', announcementsRouter);
8283
app.use('/onboarding', onboardingRouter);
8384
app.use('/statistics', statisticsRouter);
85+
app.use('/retrospective', retrospectiveRouter);
8486
app.use('/', (_req, res) => {
8587
res.status(200).json('Welcome to FinishLine');
8688
});

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) {
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/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
}

src/backend/src/prisma/seed.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import OrganizationsService from '../services/organizations.services';
4949
import StatisticsService from '../services/statistics.services';
5050
import { seedGraph } from './seed-data/statistics.seed';
5151
import { graphCollectionTransformer } from '../transformers/statistics-graph-collection.transformer';
52-
import AnnouncementService from '../services/announcement.service';
52+
import AnnouncementService from '../services/announcement.services';
5353
import OnboardingServices from '../services/onboarding.services';
5454

5555
const prisma = new PrismaClient();
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Router } from 'express';
2+
import RetrospectiveController from '../controllers/retrospectives.controllers';
3+
4+
const retrospectiveRouter = Router();
5+
6+
retrospectiveRouter.get('/timelines', RetrospectiveController.getRetrospectiveTimelines);
7+
retrospectiveRouter.get('/budgets', RetrospectiveController.getRetrospectiveBudgets);
8+
9+
export default retrospectiveRouter;

src/backend/src/routes/teams.routes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,6 @@ teamsRouter.post(
8585

8686
teamsRouter.delete('teamType/:teamTypeId/delete', TeamsController.deleteTeamType);
8787

88+
teamsRouter.get('/my-teams-work-packages', TeamsController.getMyTeamsWorkpackages);
89+
8890
export default teamsRouter;
File renamed without changes.

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
isGuest,
55
isLeadership,
66
isNotLeadership,
7-
isProject,
7+
isProjectWbs,
88
ProjectProposedChangesCreateArgs,
99
ProposedSolution,
1010
ProposedSolutionCreateArgs,
@@ -827,7 +827,7 @@ export default class ChangeRequestsService {
827827
if (
828828
projectNumber !== 0 && // Excluding Cars
829829
!(projectProposedChanges && projectProposedChanges.workPackageProposedChanges.length === 0) && // Excluding new projects with work packages
830-
!(isProject(wbsElement) && workPackageProposedChanges) // Excluding Creating Work Package on Project
830+
!(isProjectWbs(wbsElement) && workPackageProposedChanges) // Excluding Creating Work Package on Project
831831
) {
832832
await validateNoUnreviewedOpenCRs(wbsElement.wbsElementId);
833833
}
@@ -941,7 +941,9 @@ export default class ChangeRequestsService {
941941
detail: bullet.detail,
942942
descriptionBulletTypeId: bullet.descriptionBulletType.id
943943
}))
944-
}
944+
},
945+
leadId: workPackage.originalElement.leadId,
946+
managerId: workPackage.originalElement.managerId
945947
}
946948
},
947949
duration: workPackage.originalElement.duration,
@@ -1003,6 +1005,16 @@ export default class ChangeRequestsService {
10031005
descriptionBulletTypeId: bullet.descriptionBulletType.id
10041006
}))
10051007
},
1008+
lead: {
1009+
connect: {
1010+
userId: leadId
1011+
}
1012+
},
1013+
manager: {
1014+
connect: {
1015+
userId: managerId
1016+
}
1017+
},
10061018
workPackageProposedChanges: {
10071019
create: {
10081020
duration,

src/backend/src/services/projects.services.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
DescriptionBulletPreview,
44
isAdmin,
55
isGuest,
6-
isProject,
6+
isProjectWbs,
77
LinkCreateArgs,
88
LinkType,
99
Project,
@@ -40,18 +40,18 @@ export default class ProjectsService {
4040
* @param includeDeleted whether or not to include deleted projects
4141
* @returns all the projects
4242
*/
43-
static async getAllProjects(organization: Organization, includeDeleted: boolean): Promise<Project[]> {
43+
static async getAllProjects(organization: Organization, includeDeleted: boolean): Promise<ProjectPreview[]> {
4444
const projects = includeDeleted
4545
? await prisma.project.findMany({
4646
where: { wbsElement: { organizationId: organization.organizationId } },
47-
...getProjectQueryArgs(organization.organizationId)
47+
...getProjectManyQueryArgs(organization.organizationId)
4848
})
4949
: await prisma.project.findMany({
5050
where: { wbsElement: { dateDeleted: null, organizationId: organization.organizationId } },
51-
...getProjectQueryArgs(organization.organizationId)
51+
...getProjectManyQueryArgs(organization.organizationId)
5252
});
5353

54-
return projects.map(projectTransformer);
54+
return projects.map(projectPreviewTransformer);
5555
}
5656

5757
static async getUsersLeadingProjects(user: User, organization: Organization): Promise<ProjectPreview[]> {
@@ -116,7 +116,7 @@ export default class ProjectsService {
116116
}
117117

118118
static async getSingleProjectWithQueryArgs(wbsNumber: WbsNumber, organization: Organization) {
119-
if (!isProject(wbsNumber)) throw new HttpException(400, `${wbsPipe(wbsNumber)} is not a valid project WBS #!`);
119+
if (!isProjectWbs(wbsNumber)) throw new HttpException(400, `${wbsPipe(wbsNumber)} is not a valid project WBS #!`);
120120

121121
const { carNumber, projectNumber, workPackageNumber } = wbsNumber;
122122

@@ -346,7 +346,7 @@ export default class ProjectsService {
346346
* @throws if the project isn't found, the team isn't found, or the user doesn't have access
347347
*/
348348
static async setProjectTeam(user: User, wbsNumber: WbsNumber, teamId: string, organization: Organization): Promise<void> {
349-
if (!isProject(wbsNumber)) throw new HttpException(400, `${wbsPipe(wbsNumber)} is not a valid project WBS #!`);
349+
if (!isProjectWbs(wbsNumber)) throw new HttpException(400, `${wbsPipe(wbsNumber)} is not a valid project WBS #!`);
350350

351351
// find the associated project
352352
const project = await ProjectsService.getSingleProjectWithQueryArgs(wbsNumber, organization);

0 commit comments

Comments
 (0)