Skip to content

Commit 29f64b4

Browse files
committed
#1509 Made pdmFileName optional, and updated tests
1 parent fdc0617 commit 29f64b4

6 files changed

Lines changed: 88 additions & 44 deletions

File tree

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,11 @@ export default class ProjectsController {
129129
}
130130

131131
static async createAssembly(req: Request, res: Response, next: NextFunction) {
132-
const user: User = await getCurrentUser(res);
133-
const wbsNum: WbsNumber = validateWBS(req.params.wbsNum);
134-
const { name, pdmFileName } = req.body;
135132
try {
136-
const createAssembly = await ProjectsService.createAssembly(name, pdmFileName, user, wbsNum);
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);
137137
res.status(200).json(createAssembly);
138138
} catch (error: unknown) {
139139
next(error);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Assembly" ALTER COLUMN "pdmFileName" DROP 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/services/projects.services.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -616,9 +616,9 @@ export default class ProjectsService {
616616
*/
617617
static async createAssembly(
618618
name: string,
619-
pdmFileName: string | '',
620619
userCreated: User,
621-
wbsNumber: WbsNumber
620+
wbsNumber: WbsNumber,
621+
pdmFileName?: string
622622
): Promise<Assembly> {
623623
if (!isProject(wbsNumber)) throw new HttpException(400, `${wbsPipe(wbsNumber)} is not a valid project WBS #!`);
624624
const { carNumber, projectNumber, workPackageNumber } = wbsNumber;
@@ -647,10 +647,10 @@ export default class ProjectsService {
647647
const assembly = await prisma.assembly.create({
648648
data: {
649649
name,
650-
pdmFileName,
651650
dateCreated: new Date(),
652651
userCreatedId,
653-
wbsElementId
652+
wbsElementId,
653+
pdmFileName
654654
}
655655
});
656656

src/backend/src/utils/teams.utils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ export const areUsersPartOfTeams = (teams: Prisma.TeamGetPayload<typeof teamQuer
4040
return users.every((user) => teams.some((team) => isUserOnTeam(team, user)));
4141
};
4242

43+
/**
44+
* Validates that the given user is part of at least one of the given teams
45+
*
46+
* @param teams the teams to check the users are on
47+
* @param user the user to check
48+
* @returns if all of the users are part of at least one of ther teams
49+
*/
4350
export const isUserPartOfTeams = (teams: Prisma.TeamGetPayload<typeof teamQueryArgsMembersOnly>[], user: User) => {
4451
return teams.some((team) => isUserOnTeam(team, user));
4552
};

src/backend/tests/projects.test.ts

Lines changed: 70 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -267,23 +267,33 @@ describe('Projects', () => {
267267
test('createAssembly fails given invalid project wbs number', async () => {
268268
await expect(
269269
async () =>
270-
await ProjectsService.createAssembly('new assembly', 'file.txt', batman, {
271-
carNumber: 1,
272-
projectNumber: 1,
273-
workPackageNumber: 1
274-
})
270+
await ProjectsService.createAssembly(
271+
'new assembly',
272+
batman,
273+
{
274+
carNumber: 1,
275+
projectNumber: 1,
276+
workPackageNumber: 1
277+
},
278+
'file.txt'
279+
)
275280
).rejects.toThrow(new HttpException(400, `1.1.1 is not a valid project WBS #!`));
276281
});
277282

278283
test('createAssembly fails when associated wbsElement doesnt exist', async () => {
279284
vi.spyOn(prisma.project, 'findFirst').mockResolvedValue(null);
280285
await expect(
281286
async () =>
282-
await ProjectsService.createAssembly('new assembly', 'file.txt', batman, {
283-
carNumber: 1,
284-
projectNumber: 1,
285-
workPackageNumber: 0
286-
})
287+
await ProjectsService.createAssembly(
288+
'new assembly',
289+
batman,
290+
{
291+
carNumber: 1,
292+
projectNumber: 1,
293+
workPackageNumber: 0
294+
},
295+
'file.txt'
296+
)
287297
).rejects.toThrow(new NotFoundException('Project', '1.1.0'));
288298
});
289299

@@ -295,11 +305,16 @@ describe('Projects', () => {
295305
} as any);
296306
await expect(
297307
async () =>
298-
await ProjectsService.createAssembly('new assembly', 'file.txt', batman, {
299-
carNumber: 1,
300-
projectNumber: 1,
301-
workPackageNumber: 0
302-
})
308+
await ProjectsService.createAssembly(
309+
'new assembly',
310+
batman,
311+
{
312+
carNumber: 1,
313+
projectNumber: 1,
314+
workPackageNumber: 0
315+
},
316+
'file.txt'
317+
)
303318
).rejects.toThrow(new DeletedException('Project', prismaProject1.projectId));
304319
});
305320

@@ -311,11 +326,16 @@ describe('Projects', () => {
311326
} as any);
312327
await expect(
313328
async () =>
314-
await ProjectsService.createAssembly('new assembly', 'file.txt', wonderwoman, {
315-
carNumber: 1,
316-
projectNumber: 1,
317-
workPackageNumber: 0
318-
})
329+
await ProjectsService.createAssembly(
330+
'new assembly',
331+
wonderwoman,
332+
{
333+
carNumber: 1,
334+
projectNumber: 1,
335+
workPackageNumber: 0
336+
},
337+
'file.txt'
338+
)
319339
).rejects.toThrow(new AccessDeniedException(`Users must be admin, or assigned to the team to create assemblies`));
320340
});
321341

@@ -327,11 +347,16 @@ describe('Projects', () => {
327347
} as any);
328348
await expect(
329349
async () =>
330-
await ProjectsService.createAssembly('new assembly', 'file.txt', aquaman, {
331-
carNumber: 1,
332-
projectNumber: 1,
333-
workPackageNumber: 0
334-
})
350+
await ProjectsService.createAssembly(
351+
'new assembly',
352+
aquaman,
353+
{
354+
carNumber: 1,
355+
projectNumber: 1,
356+
workPackageNumber: 0
357+
},
358+
'file.txt'
359+
)
335360
).rejects.toThrow(new AccessDeniedException(`Users must be admin, or assigned to the team to create assemblies`));
336361
});
337362

@@ -344,11 +369,16 @@ describe('Projects', () => {
344369
vi.spyOn(prisma.assembly, 'create').mockResolvedValue(prismaAssembly1);
345370

346371
// no error, no return value
347-
await ProjectsService.createAssembly('new assembly', 'file.txt', batman, {
348-
carNumber: 1,
349-
projectNumber: 1,
350-
workPackageNumber: 0
351-
});
372+
await ProjectsService.createAssembly(
373+
'new assembly',
374+
batman,
375+
{
376+
carNumber: 1,
377+
projectNumber: 1,
378+
workPackageNumber: 0
379+
},
380+
'file.txt'
381+
);
352382
});
353383

354384
test('createAssembly works if the submitter is on the team', async () => {
@@ -357,11 +387,16 @@ describe('Projects', () => {
357387
vi.spyOn(prisma.project, 'findFirst').mockResolvedValue(prismaProject1);
358388

359389
// no error, no return value
360-
await ProjectsService.createAssembly('new assembly', 'file.txt', superman, {
361-
carNumber: 1,
362-
projectNumber: 1,
363-
workPackageNumber: 0
364-
});
390+
await ProjectsService.createAssembly(
391+
'new assembly',
392+
superman,
393+
{
394+
carNumber: 1,
395+
projectNumber: 1,
396+
workPackageNumber: 0
397+
},
398+
'file.txt'
399+
);
365400
});
366401
});
367402

0 commit comments

Comments
 (0)