Skip to content

Commit ffa28d5

Browse files
authored
Merge pull request #1712 from Northeastern-Electric-Racing/#1520-get-all-material-types-endpoint
#1520: added get all material types endpoint with the tests
2 parents 1df2238 + fa576a9 commit ffa28d5

9 files changed

Lines changed: 110 additions & 8 deletions

File tree

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Project, validateWBS, WbsNumber, wbsPipe } from 'shared';
1+
import { Manufacturer, MaterialType, Project, validateWBS, WbsNumber, wbsPipe } from 'shared';
22
import { NextFunction, Request, Response } from 'express';
3-
import { Manufacturer, User } from '@prisma/client';
3+
import { User } from '@prisma/client';
44
import { getCurrentUser } from '../utils/auth.utils';
55
import ProjectsService from '../services/projects.services';
66

@@ -197,7 +197,7 @@ export default class ProjectsController {
197197
try {
198198
const user: User = await getCurrentUser(res);
199199
const { manufacturerName } = req.params;
200-
const deletedManufacturer: Manufacturer = await ProjectsService.deleteManufacturer(user, manufacturerName);
200+
const deletedManufacturer = await ProjectsService.deleteManufacturer(user, manufacturerName);
201201
res.status(200).json(deletedManufacturer);
202202
} catch (error: unknown) {
203203
next(error);
@@ -214,6 +214,16 @@ export default class ProjectsController {
214214
}
215215
}
216216

217+
static async getAllMaterialTypes(req: Request, res: Response, next: NextFunction) {
218+
try {
219+
const user = await getCurrentUser(res);
220+
const materialTypes: MaterialType[] = await ProjectsService.getAllMaterialTypes(user);
221+
return res.status(200).json(materialTypes);
222+
} catch (error: unknown) {
223+
next(error);
224+
}
225+
}
226+
217227
static async createMaterialType(req: Request, res: Response, next: NextFunction) {
218228
try {
219229
const { name } = req.body;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* This file is part of NER's FinishLine and licensed under GNU AGPLv3.
3+
* See the LICENSE file in the repository root folder for details.
4+
*/
5+
6+
import { Prisma } from '@prisma/client';
7+
8+
const materialTypeQueryArgs = Prisma.validator<Prisma.Material_TypeArgs>()({
9+
include: {
10+
materials: true
11+
}
12+
});
13+
14+
export default materialTypeQueryArgs;

src/backend/src/prisma/seed.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { seedProject } from './seed-data/projects.seed';
2929
import { seedWorkPackage } from './seed-data/work-packages.seed';
3030
import ReimbursementRequestService from '../services/reimbursement-requests.services';
3131
import { writeFileSync } from 'fs';
32+
import ProjectsService from '../services/projects.services';
3233

3334
const prisma = new PrismaClient();
3435

@@ -839,6 +840,10 @@ const performSeed: () => Promise<void> = async () => {
839840
[joeShmoe.userId]
840841
);
841842

843+
/**
844+
* Reimbursements
845+
*/
846+
842847
const vendor = await ReimbursementRequestService.createVendor(thomasEmrax, 'Tesla');
843848
const vendor2 = await ReimbursementRequestService.createVendor(thomasEmrax, 'Amazon');
844849
const vendor3 = await ReimbursementRequestService.createVendor(thomasEmrax, 'Google');
@@ -869,6 +874,12 @@ const performSeed: () => Promise<void> = async () => {
869874
expenseType.expenseTypeId,
870875
100
871876
);
877+
878+
/**
879+
* Bill of Materials
880+
*/
881+
await ProjectsService.createManufacturer(thomasEmrax, 'Digikey');
882+
await ProjectsService.createMaterialType('Resistor', thomasEmrax);
872883
};
873884

874885
performSeed()

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ projectRouter.post(
5858
);
5959
projectRouter.delete('/bom/manufacturer/:manufacturerName/delete', ProjectsController.deleteManufacturer);
6060
projectRouter.get('/bom/manufacturer', ProjectsController.getAllManufacturers);
61+
projectRouter.get('/bom/material-type', ProjectsController.getAllMaterialTypes);
6162
projectRouter.post('/bom/material-type/create', nonEmptyString(body('name')), ProjectsController.createMaterialType);
6263
projectRouter.post(
6364
'/bom/assembly/:wbsNum/create',

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Role, Material_Type, User, Assembly, Material_Status, Material } from '@prisma/client';
12
import {
23
isAdmin,
34
isGuest,
@@ -6,11 +7,12 @@ import {
67
isProject,
78
LinkCreateArgs,
89
LinkType,
10+
Manufacturer,
11+
MaterialType,
912
Project,
1013
WbsNumber,
1114
wbsPipe
1215
} from 'shared';
13-
import { Manufacturer, Role, Material_Type, User, Assembly, Material_Status, Material } from '@prisma/client';
1416
import projectQueryArgs from '../prisma-query-args/projects.query-args';
1517
import prisma from '../prisma/prisma';
1618
import projectTransformer from '../transformers/projects.transformer';
@@ -40,10 +42,12 @@ import {
4042
import linkQueryArgs from '../prisma-query-args/links.query-args';
4143
import linkTypeQueryArgs from '../prisma-query-args/link-types.query-args';
4244
import manufacturerQueryArgs from '../prisma-query-args/manufacturers.query-args';
45+
import materialTypeQueryArgs from '../prisma-query-args/material-type.query-args';
4346
import { linkTypeTransformer } from '../transformers/links.transformer';
4447
import { updateLinks, linkToChangeListValue } from '../utils/links.utils';
4548
import { manufacturerTransformer } from '../transformers/manufacturer.transformer';
4649
import { isUserPartOfTeams } from '../utils/teams.utils';
50+
import { materialTypeTransformer } from '../transformers/material-type.transformer';
4751

4852
export default class ProjectsService {
4953
/**
@@ -773,7 +777,7 @@ export default class ProjectsService {
773777
return assembly;
774778
}
775779

776-
/*
780+
/**
777781
* Creates a new Manufacturer
778782
* @param submitter the user who's creating the manufacturer
779783
* @param name the name of the manufacturer
@@ -836,6 +840,7 @@ export default class ProjectsService {
836840
}
837841
/**
838842
* Get all the manufacturers in the database.
843+
* @param submitter the user who's getting all manufacturers
839844
* @returns all the manufacturers
840845
*/
841846
static async getAllManufacturers(submitter: User): Promise<Manufacturer[]> {
@@ -850,6 +855,23 @@ export default class ProjectsService {
850855
).map(manufacturerTransformer);
851856
}
852857

858+
/**
859+
* Get all the material types in the database.
860+
* @param submitter the user who's getting all material types
861+
* @returns all the material types
862+
*/
863+
static async getAllMaterialTypes(submitter: User): Promise<MaterialType[]> {
864+
if (submitter.role === Role.GUEST) {
865+
throw new AccessDeniedGuestException('Get Material Types');
866+
}
867+
868+
return (
869+
await prisma.material_Type.findMany({
870+
...materialTypeQueryArgs
871+
})
872+
).map(materialTypeTransformer);
873+
}
874+
853875
/**
854876
* Create a new material type
855877
* @param name the name of the new material type

src/backend/src/transformers/manufacturer.transformer.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
* See the LICENSE file in the repository root folder for details.
44
*/
55

6-
import { Manufacturer, Prisma } from '@prisma/client';
6+
import { Prisma } from '@prisma/client';
77
import manufacturerQueryArgs from '../prisma-query-args/manufacturers.query-args';
8+
import { Manufacturer } from 'shared';
89

910
export const manufacturerTransformer = (
1011
manufacturer: Prisma.ManufacturerGetPayload<typeof manufacturerQueryArgs>
@@ -13,6 +14,6 @@ export const manufacturerTransformer = (
1314
name: manufacturer.name,
1415
dateCreated: manufacturer.dateCreated,
1516
creatorId: manufacturer.creatorId,
16-
dateDeleted: manufacturer.dateDeleted
17+
dateDeleted: manufacturer.dateDeleted ?? undefined
1718
};
1819
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* This file is part of NER's FinishLine and licensed under GNU AGPLv3.
3+
* See the LICENSE file in the repository root folder for details.
4+
*/
5+
6+
import { Prisma } from '@prisma/client';
7+
import materialTypeQueryArgs from '../prisma-query-args/material-type.query-args';
8+
import { MaterialType } from 'shared';
9+
10+
export const materialTypeTransformer = (
11+
materialType: Prisma.Material_TypeGetPayload<typeof materialTypeQueryArgs>
12+
): MaterialType => {
13+
return {
14+
name: materialType.name,
15+
dateCreated: materialType.dateCreated,
16+
creatorId: materialType.creatorId,
17+
dateDeleted: materialType.dateDeleted ?? undefined
18+
};
19+
};

src/backend/tests/projects.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,23 @@ describe('Projects', () => {
724724
expect(materialType.name).toBe('NERSoftwareTools');
725725
expect(prisma.material_Type.create).toBeCalledTimes(1);
726726
});
727+
728+
test('Get all Material Types fails from guest', async () => {
729+
vi.spyOn(prisma.material_Type, 'findMany').mockResolvedValue([]);
730+
731+
await expect(ProjectsService.getAllMaterialTypes(theVisitor)).rejects.toThrow(
732+
new AccessDeniedGuestException('Get Material Types')
733+
);
734+
});
735+
736+
test('Get all Material Types works', async () => {
737+
vi.spyOn(prisma.material_Type, 'findMany').mockResolvedValue([]);
738+
739+
const res = await ProjectsService.getAllMaterialTypes(batman);
740+
741+
expect(prisma.material_Type.findMany).toHaveBeenCalledTimes(1);
742+
expect(res).toStrictEqual([]);
743+
});
727744
});
728745

729746
describe('assigning material assemblies', () => {

src/shared/src/types/project-types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,14 @@ export interface Manufacturer {
118118
name: string;
119119
dateCreated: Date;
120120
creatorId: number;
121-
materials: Material[];
121+
dateDeleted?: Date;
122+
}
123+
124+
export interface MaterialType {
125+
name: string;
126+
dateCreated: Date;
127+
creatorId: number;
128+
dateDeleted?: Date;
122129
}
123130

124131
export enum MaterialStatus {

0 commit comments

Comments
 (0)