Skip to content

Commit da6d5b9

Browse files
authored
Merge pull request #1710 from Northeastern-Electric-Racing/#1510-delete-assembly-endpoint2
#1510 Created delete assembly endpoint
2 parents 556347e + 7224d94 commit da6d5b9

4 files changed

Lines changed: 75 additions & 0 deletions

File tree

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,18 @@ export default class ProjectsController {
213213
next(error);
214214
}
215215
}
216+
217+
static async deleteAssemblyType(req: Request, res: Response, next: NextFunction) {
218+
try {
219+
const { assemblyId } = req.params;
220+
const user = await getCurrentUser(res);
221+
const deletedAssembly = await ProjectsService.deleteAssembly(assemblyId, user);
222+
res.status(200).json(deletedAssembly);
223+
} catch (error: unknown) {
224+
next(error);
225+
}
226+
}
227+
216228
static async deleteMaterialType(req: Request, res: Response, next: NextFunction) {
217229
try {
218230
const { materialTypeId } = req.params;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,6 @@ projectRouter.post(
103103

104104
projectRouter.delete('/bom/material-type/:materialTypeId/delete', ProjectsController.deleteMaterialType);
105105

106+
projectRouter.delete('/bom/assembly/:assemblyId/delete', ProjectsController.deleteAssemblyType);
107+
106108
export default projectRouter;

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,38 @@ export default class ProjectsService {
843843
return newMaterialType;
844844
}
845845

846+
/**
847+
* Deletes an assembly type
848+
* @param assemblyId the name of the assembly
849+
* @param submitter the user who is deleting the assembly type
850+
* @throws if the user is not an admin/head, the assembly does not exist, or has already been deleted
851+
* @returns
852+
*/
853+
static async deleteAssembly(assemblyId: string, submitter: User): Promise<Assembly> {
854+
if (!isAdmin(submitter.role) || !isHead(submitter.role))
855+
throw new AccessDeniedException('Only an Admin or a head can delete an Assembly');
856+
857+
const assembly = await prisma.assembly.findUnique({
858+
where: {
859+
assemblyId
860+
}
861+
});
862+
863+
if (!assembly) throw new NotFoundException('Assembly', assemblyId);
864+
if (assembly.dateDeleted) throw new DeletedException('Assembly', assemblyId);
865+
866+
const deletedAssembly = await prisma.assembly.update({
867+
where: {
868+
assemblyId
869+
},
870+
data: {
871+
dateDeleted: new Date()
872+
}
873+
});
874+
875+
return deletedAssembly;
876+
}
877+
846878
/**
847879
* Deletes a material type based on the given Id
848880
* @param submitter the user who is deleting the material type

src/backend/tests/projects.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,35 @@ describe('Projects', () => {
685685
});
686686
});
687687

688+
describe('Delete Assembly', () => {
689+
test('Deleteing assembly fails because user is not an admin or head', async () => {
690+
await expect(ProjectsService.deleteAssembly('New Assembly', theVisitor)).rejects.toThrow(
691+
new AccessDeniedException('Only an Admin or a head can delete an Assembly')
692+
);
693+
});
694+
695+
test('Deleting assembly fails if assembly does not exist', async () => {
696+
await expect(ProjectsService.deleteAssembly('New Assembly', batman)).rejects.toThrow(
697+
new NotFoundException('Assembly', 'New Assembly')
698+
);
699+
});
700+
701+
test('Deleting assembly fails if assemly has already been deleted', async () => {
702+
vi.spyOn(prisma.assembly, 'findUnique').mockResolvedValue({ ...prismaAssembly1, dateDeleted: new Date() });
703+
await expect(ProjectsService.deleteAssembly('New Assembly', batman)).rejects.toThrow(
704+
new DeletedException('Assembly', 'New Assembly')
705+
);
706+
});
707+
708+
test('Deleting assembly works', async () => {
709+
vi.spyOn(prisma.assembly, 'findUnique').mockResolvedValue(prismaAssembly1);
710+
vi.spyOn(prisma.assembly, 'update').mockResolvedValue({ ...prismaAssembly1, dateDeleted: new Date() });
711+
const deletedAssembly = await ProjectsService.deleteAssembly('New Assembly', batman);
712+
expect(deletedAssembly.name).toBe('New Assembly');
713+
expect(prisma.assembly.update).toBeCalledTimes(1);
714+
});
715+
});
716+
688717
describe('Deleting material type', () => {
689718
test('Delete Material Type does not work if user is not an admin or head', async () => {
690719
await expect(ProjectsService.deleteMaterialType('NERSoftwareTools', theVisitor)).rejects.toThrow(

0 commit comments

Comments
 (0)