Skip to content

Commit cd7ec29

Browse files
committed
#1528 - get unassign working
1 parent 64b1950 commit cd7ec29

2 files changed

Lines changed: 45 additions & 24 deletions

File tree

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

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { linkTypeTransformer } from '../transformers/links.transformer';
4444
import { updateLinks, linkToChangeListValue } from '../utils/links.utils';
4545
import { manufacturerTransformer } from '../transformers/manufacturer.transformer';
4646
import { isUserPartOfTeams } from '../utils/teams.utils';
47+
import { disconnect } from 'process';
4748

4849
export default class ProjectsService {
4950
/**
@@ -888,7 +889,10 @@ export default class ProjectsService {
888889
* @returns the updated material
889890
*/
890891
static async assignMaterialAssembly(submitter: User, materialId: string, assemblyId?: string) {
891-
const material = await prisma.material.findUnique({ where: { materialId } });
892+
const material = await prisma.material.findUnique({
893+
where: { materialId },
894+
include: { wbsElement: true, assembly: true }
895+
});
892896
if (!material) throw new NotFoundException('Material', materialId);
893897

894898
const project = await prisma.project.findFirst({
@@ -903,7 +907,9 @@ export default class ProjectsService {
903907

904908
// Permission: leadership and up, anyone on project team
905909
if (!(isLeadership(submitter.role) || isUserPartOfTeams(project.teams, submitter)))
906-
throw new AccessDeniedException('Only leadership or above can assign materials to assemblies');
910+
throw new AccessDeniedException(
911+
`Only leadership or above, or someone on the project's team can assign materials to assemblies`
912+
);
907913

908914
if (assemblyId) {
909915
const assembly = await prisma.assembly.findUnique({
@@ -916,14 +922,33 @@ export default class ProjectsService {
916922
if (material.wbsElementId !== assembly.wbsElementId)
917923
throw new HttpException(
918924
400,
919-
`The WBS element of the material (${material.wbsElementId}) and assembly (${assembly.wbsElementId}) do not match`
925+
`The WBS element of the material (${wbsPipe(material.wbsElement)}) and assembly (${wbsPipe(
926+
assembly.wbsElement
927+
)}) do not match`
920928
);
929+
const updatedMaterial = await prisma.material.update({
930+
where: { materialId },
931+
data: { assemblyId }
932+
});
933+
934+
return updatedMaterial;
921935
}
936+
if (material.assemblyId) {
937+
// Assign a material on a project to a different assembly
938+
await prisma.assembly.update({
939+
where: { assemblyId: material.assemblyId },
940+
data: { materials: { disconnect: { materialId } } },
941+
include: { materials: true }
942+
});
922943

923-
// Assign a material on a project to a different assembly
924-
const updatedMaterial = await prisma.material.update({ where: { materialId }, data: { assemblyId } });
944+
const updatedMaterial = await prisma.material.findUnique({
945+
where: { materialId },
946+
include: { wbsElement: true, assembly: true }
947+
});
925948

926-
return updatedMaterial;
949+
return updatedMaterial;
950+
}
951+
return material;
927952
}
928953

929954
/**

src/backend/tests/projects.test.ts

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,9 @@ describe('Projects', () => {
734734
vi.spyOn(prisma.project, 'findFirst').mockResolvedValue(project);
735735

736736
await expect(ProjectsService.assignMaterialAssembly(theVisitor, 'mid', 'aid')).rejects.toThrow(
737-
new AccessDeniedException('Only leadership or above can assign materials to assemblies')
737+
new AccessDeniedException(
738+
`Only leadership or above, or someone on the project's team can assign materials to assemblies`
739+
)
738740
);
739741
});
740742

@@ -754,10 +756,18 @@ describe('Projects', () => {
754756
});
755757

756758
test('assignment fails because the wbsElements do not match', async () => {
757-
vi.spyOn(prisma.material, 'findUnique').mockResolvedValue({ ...prismaMaterial1, wbsElementId: 1 });
758-
vi.spyOn(prisma.assembly, 'findUnique').mockResolvedValue({ ...prismaAssembly1, wbsElementId: 2 });
759+
vi.spyOn(prisma.material, 'findUnique').mockResolvedValue({
760+
...prismaMaterial1,
761+
wbsElementId: 1,
762+
wbsElement: prismaWbsElement1
763+
});
764+
vi.spyOn(prisma.assembly, 'findUnique').mockResolvedValue({
765+
...prismaAssembly1,
766+
wbsElementId: 2,
767+
wbsElement: { ...prismaWbsElement1, wbsElementId: 2, projectNumber: 1 }
768+
});
759769
await expect(ProjectsService.assignMaterialAssembly(superman, 'mid', 'aid')).rejects.toThrow(
760-
new HttpException(400, `The WBS element of the material (1) and assembly (2) do not match`)
770+
new HttpException(400, `The WBS element of the material (1.2.0) and assembly (1.1.0) do not match`)
761771
);
762772
});
763773

@@ -775,20 +785,6 @@ describe('Projects', () => {
775785
const updatedMaterial = await ProjectsService.assignMaterialAssembly(aquaman, 'mid', 'updated-aid');
776786
expect(updatedMaterial).toBe(expectedUpdatedToolMaterial);
777787
});
778-
779-
test('unassigning material from assebly works', async () => {
780-
vi.spyOn(prisma.material, 'findUnique').mockResolvedValue(prismaMaterial1);
781-
vi.spyOn(prisma.project, 'findFirst').mockResolvedValue(prismaProject1);
782-
783-
const expectedUpdatedToolMaterial: Material = {
784-
...prismaMaterial1,
785-
assemblyId: null
786-
};
787-
vi.spyOn(prisma.material, 'update').mockResolvedValue(expectedUpdatedToolMaterial);
788-
789-
const updatedMaterial = await ProjectsService.assignMaterialAssembly(aquaman, 'mid', undefined);
790-
expect(updatedMaterial).toBe(expectedUpdatedToolMaterial);
791-
});
792788
});
793789
describe('Delete Assembly', () => {
794790
test('Deleteing assembly fails because user is not an admin or head', async () => {

0 commit comments

Comments
 (0)