Skip to content

Commit 649747f

Browse files
authored
Merge branch 'develop' into #1668-VidyuthRamkumar-credits
2 parents b6d5305 + 3c37f8f commit 649747f

21 files changed

Lines changed: 510 additions & 69 deletions

File tree

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,18 @@ export default class ProjectsController {
128128
}
129129
}
130130

131+
static async createAssembly(req: Request, res: Response, next: NextFunction) {
132+
try {
133+
const user: User = await getCurrentUser(res);
134+
const wbsNum: WbsNumber = validateWBS(req.params.wbsNum);
135+
const { name, pdmFileName } = req.body;
136+
const createAssembly = await ProjectsService.createAssembly(name, user, wbsNum, pdmFileName);
137+
res.status(200).json(createAssembly);
138+
} catch (error: unknown) {
139+
next(error);
140+
}
141+
}
142+
131143
static async createManufacturer(req: Request, res: Response, next: NextFunction) {
132144
try {
133145
const { name } = req.body;

src/backend/src/controllers/work-packages.controllers.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ export default class WorkPackagesController {
7272
blockedBy,
7373
expectedActivities,
7474
deliverables,
75-
projectLead,
76-
projectManager
75+
projectLeadId,
76+
projectManagerId
7777
} = req.body;
7878

7979
let { stage } = req.body;
@@ -94,8 +94,8 @@ export default class WorkPackagesController {
9494
blockedBy,
9595
expectedActivities,
9696
deliverables,
97-
projectLead,
98-
projectManager
97+
projectLeadId,
98+
projectManagerId
9999
);
100100
return res.status(200).json({ message: 'Work package updated successfully' });
101101
} catch (error: unknown) {

src/backend/src/prisma/migrations/20231019013832_add_bom/migration.sql renamed to src/backend/src/prisma/migrations/20231024124220_add_bom/migration.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ CREATE TABLE "Unit" (
1212
CREATE TABLE "Assembly" (
1313
"assemblyId" TEXT NOT NULL,
1414
"name" TEXT NOT NULL,
15-
"pdmFileName" TEXT NOT NULL,
15+
"pdmFileName" TEXT,
1616
"dateDeleted" TIMESTAMP(3),
1717
"userDeletedId" INTEGER,
1818
"dateCreated" TIMESTAMP(3) NOT NULL,

src/backend/src/prisma/schema.prisma

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ model Unit {
474474
model Assembly {
475475
assemblyId String @id @default(uuid())
476476
name String @unique
477-
pdmFileName String
477+
pdmFileName String?
478478
dateDeleted DateTime?
479479
userDeleted User? @relation(fields: [userDeletedId], references: [userId], name: "assemblyDeleter")
480480
userDeletedId Int?

src/backend/src/prisma/seed-data/teams.seed.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ const justiceLeague = (headId: number): Prisma.TeamCreateArgs => {
4848
};
4949
};
5050

51+
const plLegends = (headId: number): Prisma.TeamCreateArgs => {
52+
return {
53+
data: {
54+
teamName: 'PlTeams',
55+
slackId: 'Pl',
56+
headId
57+
}
58+
};
59+
};
60+
5161
const huskies = (headId: number): Prisma.TeamCreateArgs => {
5262
return {
5363
data: {
@@ -60,4 +70,4 @@ const huskies = (headId: number): Prisma.TeamCreateArgs => {
6070
};
6171
};
6272

63-
export const dbSeedAllTeams = { ravens, orioles, justiceLeague, huskies };
73+
export const dbSeedAllTeams = { ravens, orioles, justiceLeague, huskies, plLegends };

src/backend/src/prisma/seed-data/users.seed.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,102 @@ const reidChandler: Prisma.UserCreateInput = {
308308
role: Role.HEAD
309309
};
310310

311+
const cristianoRonaldo: Prisma.UserCreateInput = {
312+
firstName: 'Cristiano',
313+
lastName: 'Ronaldo',
314+
email: 'cronaldo@united.com',
315+
googleAuthId: 'Winger',
316+
role: Role.HEAD
317+
};
318+
319+
const thierryHenry: Prisma.UserCreateInput = {
320+
firstName: 'Thierry',
321+
lastName: 'Henry',
322+
email: 'thenry@arsenal.com',
323+
googleAuthId: 'InvincibleStriker',
324+
role: Role.MEMBER
325+
};
326+
327+
const frankLampard: Prisma.UserCreateInput = {
328+
firstName: 'Frank',
329+
lastName: 'Lampard',
330+
email: 'flampard@chelsea.com',
331+
googleAuthId: 'MidfieldMaestro',
332+
role: Role.MEMBER
333+
};
334+
335+
const stevenGerrard: Prisma.UserCreateInput = {
336+
firstName: 'Steven',
337+
lastName: 'Gerrard',
338+
email: 'sgerrard@liverpool.com',
339+
googleAuthId: 'RedCaptain',
340+
role: Role.MEMBER
341+
};
342+
343+
const ryanGiggs: Prisma.UserCreateInput = {
344+
firstName: 'Ryan',
345+
lastName: 'Giggs',
346+
email: 'rgiggs@united.com',
347+
googleAuthId: 'WingWizard',
348+
role: Role.MEMBER
349+
};
350+
351+
const alanShearer: Prisma.UserCreateInput = {
352+
firstName: 'Alan',
353+
lastName: 'Shearer',
354+
email: 'ashearer@blackburn.com',
355+
googleAuthId: 'GoalMachine',
356+
role: Role.MEMBER
357+
};
358+
359+
const paulScholes: Prisma.UserCreateInput = {
360+
firstName: 'Paul',
361+
lastName: 'Scholes',
362+
email: 'pscholes@united.com',
363+
googleAuthId: 'PassMaster',
364+
role: Role.MEMBER
365+
};
366+
367+
const ericCantona: Prisma.UserCreateInput = {
368+
firstName: 'Eric',
369+
lastName: 'Cantona',
370+
email: 'ecantona@united.com',
371+
googleAuthId: 'KingEric',
372+
role: Role.MEMBER
373+
};
374+
375+
const didierDrogba: Prisma.UserCreateInput = {
376+
firstName: 'Didier',
377+
lastName: 'Drogba',
378+
email: 'ddrogba@chelsea.com',
379+
googleAuthId: 'ClutchStriker',
380+
role: Role.MEMBER
381+
};
382+
383+
const patrickVieira: Prisma.UserCreateInput = {
384+
firstName: 'Patrick',
385+
lastName: 'Vieira',
386+
email: 'pvieira@arsenal.com',
387+
googleAuthId: 'MidfieldAnchor',
388+
role: Role.MEMBER
389+
};
390+
391+
const johnTerry: Prisma.UserCreateInput = {
392+
firstName: 'John',
393+
lastName: 'Terry',
394+
email: 'jterry@chelsea.com',
395+
googleAuthId: 'DefensiveRock',
396+
role: Role.MEMBER
397+
};
398+
399+
const dennisBergkamp: Prisma.UserCreateInput = {
400+
firstName: 'Dennis',
401+
lastName: 'Bergkamp',
402+
email: 'dbergkamp@arsenal.com',
403+
googleAuthId: 'DutchMaster',
404+
role: Role.MEMBER
405+
};
406+
311407
const brooksRobinson: Prisma.UserCreateInput = {
312408
firstName: 'Brooks',
313409
lastName: 'Robinson',
@@ -405,6 +501,18 @@ export const dbSeedAllUsers = {
405501
ryanHowe,
406502
anthonyBernardi,
407503
reidChandler,
504+
cristianoRonaldo,
505+
thierryHenry,
506+
frankLampard,
507+
stevenGerrard,
508+
ryanGiggs,
509+
paulScholes,
510+
alanShearer,
511+
ericCantona,
512+
patrickVieira,
513+
didierDrogba,
514+
johnTerry,
515+
dennisBergkamp,
408516
jkDobbins,
409517
davidOjabo,
410518
markAndrews,

src/backend/src/prisma/seed.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ const performSeed: () => Promise<void> = async () => {
6060
const ryanHowe = await prisma.user.create({ data: dbSeedAllUsers.ryanHowe });
6161
const anthonyBernardi = await prisma.user.create({ data: dbSeedAllUsers.anthonyBernardi });
6262
const reidChandler = await prisma.user.create({ data: dbSeedAllUsers.reidChandler });
63+
const cristianoRonaldo = await prisma.user.create({ data: dbSeedAllUsers.cristianoRonaldo });
64+
const thierryHenry = await prisma.user.create({ data: dbSeedAllUsers.thierryHenry });
65+
const frankLampard = await prisma.user.create({ data: dbSeedAllUsers.frankLampard });
66+
const stevenGerrard = await prisma.user.create({ data: dbSeedAllUsers.stevenGerrard });
67+
const ryanGiggs = await prisma.user.create({ data: dbSeedAllUsers.ryanGiggs });
68+
const paulScholes = await prisma.user.create({ data: dbSeedAllUsers.paulScholes });
69+
const alanShearer = await prisma.user.create({ data: dbSeedAllUsers.alanShearer });
70+
const ericCantona = await prisma.user.create({ data: dbSeedAllUsers.ericCantona });
71+
const patrickVieira = await prisma.user.create({ data: dbSeedAllUsers.patrickVieira });
72+
const didierDrogba = await prisma.user.create({ data: dbSeedAllUsers.didierDrogba });
73+
const johnTerry = await prisma.user.create({ data: dbSeedAllUsers.johnTerry });
74+
const dennisBergkamp = await prisma.user.create({ data: dbSeedAllUsers.dennisBergkamp });
6375
const jkDobbins = await prisma.user.create({ data: dbSeedAllUsers.jkDobbins });
6476
const davidOjabo = await prisma.user.create({ data: dbSeedAllUsers.davidOjabo });
6577
const markAndrews = await prisma.user.create({ data: dbSeedAllUsers.markAndrews });
@@ -141,6 +153,7 @@ const performSeed: () => Promise<void> = async () => {
141153
const ravens: Team = await prisma.team.create(dbSeedAllTeams.ravens(johnHarbaugh.userId));
142154
const orioles: Team = await prisma.team.create(dbSeedAllTeams.orioles(brandonHyde.userId));
143155
const huskies: Team = await prisma.team.create(dbSeedAllTeams.huskies(thomasEmrax.userId));
156+
const plLegends: Team = await prisma.team.create(dbSeedAllTeams.plLegends(cristianoRonaldo.userId));
144157

145158
/** Write to .env file the FINANCE_TEAM_ID as the justiceLeague TeamId */
146159
const financeTeamId = justiceLeague.teamId;
@@ -206,6 +219,24 @@ const performSeed: () => Promise<void> = async () => {
206219
[joeShmoe, joeBlow, reidChandler, nightwing].map((user) => user.userId)
207220
);
208221

222+
await TeamsService.setTeamMembers(
223+
cristianoRonaldo,
224+
plLegends.teamId,
225+
[
226+
thierryHenry,
227+
frankLampard,
228+
stevenGerrard,
229+
ryanGiggs,
230+
paulScholes,
231+
alanShearer,
232+
ericCantona,
233+
patrickVieira,
234+
didierDrogba,
235+
johnTerry,
236+
dennisBergkamp
237+
].map((user) => user.userId)
238+
);
239+
209240
/**
210241
* Projects
211242
*/

src/backend/src/routes/projects.routes.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,11 @@ projectRouter.post(
5656
ProjectsController.createManufacturer
5757
);
5858
projectRouter.post('/bom/material-type/create', nonEmptyString(body('name')), ProjectsController.createMaterialType);
59+
projectRouter.post(
60+
'/bom/assembly/:wbsNum/create',
61+
nonEmptyString(body('name')),
62+
nonEmptyString(body('pdmFileName')).optional(),
63+
ProjectsController.createAssembly
64+
);
5965

6066
export default projectRouter;

src/backend/src/routes/work-packages.routes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ workPackagesRouter.post(
4444
body('deliverables').isArray(),
4545
body('deliverables.*.id').isInt({ min: -1 }).not().isString(),
4646
nonEmptyString(body('deliverables.*.detail')),
47-
intMinZero(body('projectLead').optional()),
48-
intMinZero(body('projectManager').optional()),
47+
intMinZero(body('projectLeadId').optional()),
48+
intMinZero(body('projectManagerId').optional()),
4949
validateInputs,
5050
WorkPackagesController.editWorkPackage
5151
);

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

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Material_Type, User } from '@prisma/client';
1+
import { Material_Type, User, Assembly } from '@prisma/client';
22
import { isAdmin, isGuest, isLeadership, isProject, LinkCreateArgs, LinkType, Project, WbsNumber, wbsPipe } from 'shared';
33
import projectQueryArgs from '../prisma-query-args/projects.query-args';
44
import prisma from '../prisma/prisma';
@@ -30,6 +30,7 @@ import linkQueryArgs from '../prisma-query-args/links.query-args';
3030
import linkTypeQueryArgs from '../prisma-query-args/link-types.query-args';
3131
import { linkTypeTransformer } from '../transformers/links.transformer';
3232
import { updateLinks, linkToChangeListValue } from '../utils/links.utils';
33+
import { isUserPartOfTeams } from '../utils/teams.utils';
3334

3435
export default class ProjectsService {
3536
/**
@@ -605,6 +606,62 @@ export default class ProjectsService {
605606
}
606607

607608
/**
609+
* Create an assembly
610+
* @param name The name of the assembly to be created
611+
* @param userCreated The user creating the assembly
612+
* @param wbsElementId The
613+
* @param pdmFileName optional - The name of the file holding the assembly
614+
* @returns the project that the user has favorited/unfavorited
615+
* @throws if the project wbs doesn't exist or is not corresponding to a project
616+
*/
617+
static async createAssembly(
618+
name: string,
619+
userCreated: User,
620+
wbsNumber: WbsNumber,
621+
pdmFileName?: string
622+
): Promise<Assembly> {
623+
if (!isProject(wbsNumber)) throw new HttpException(400, `${wbsPipe(wbsNumber)} is not a valid project WBS #!`);
624+
const { carNumber, projectNumber, workPackageNumber } = wbsNumber;
625+
626+
const project = await prisma.project.findFirst({
627+
where: {
628+
wbsElement: {
629+
carNumber,
630+
projectNumber,
631+
workPackageNumber
632+
}
633+
},
634+
...projectQueryArgs
635+
});
636+
637+
if (!project) throw new NotFoundException('Project', wbsPipe(wbsNumber));
638+
if (project.wbsElement.dateDeleted) throw new DeletedException('Project', project.projectId);
639+
640+
const checkAssembly = await prisma.assembly.findUnique({ where: { name } });
641+
642+
if (checkAssembly) throw new HttpException(400, `${name} already exists as an assembly!`);
643+
644+
const { teams, wbsElementId } = project;
645+
646+
if (!isAdmin(userCreated.role) && !isUserPartOfTeams(teams, userCreated))
647+
throw new AccessDeniedException('Users must be admin, or assigned to the team to create assemblies');
648+
649+
const userCreatedId = userCreated.userId;
650+
651+
const assembly = await prisma.assembly.create({
652+
data: {
653+
name,
654+
dateCreated: new Date(),
655+
userCreatedId,
656+
wbsElementId,
657+
pdmFileName
658+
}
659+
});
660+
661+
return assembly;
662+
}
663+
664+
/*
608665
* Creates a new Manufacturer
609666
* @param submitter the user who's creating the manufacturer
610667
* @param name the name of the manufacturer

0 commit comments

Comments
 (0)