Skip to content

Commit bbe25ce

Browse files
authored
Merge pull request #1675 from Northeastern-Electric-Racing/#1519-get-all-manufacturers-endpoint
#1519 get all manufacturers endpoint
2 parents 179e566 + e573697 commit bbe25ce

7 files changed

Lines changed: 104 additions & 2 deletions

File tree

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

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

@@ -193,6 +193,16 @@ export default class ProjectsController {
193193
}
194194
}
195195

196+
static async getAllManufacturers(req: Request, res: Response, next: NextFunction) {
197+
try {
198+
const user = await getCurrentUser(res);
199+
const manufacturers: Manufacturer[] = await ProjectsService.getAllManufacturers(user);
200+
return res.status(200).json(manufacturers);
201+
} catch (error: unknown) {
202+
next(error);
203+
}
204+
}
205+
196206
static async createMaterialType(req: Request, res: Response, next: NextFunction) {
197207
try {
198208
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 manufacturerQueryArgs = Prisma.validator<Prisma.ManufacturerArgs>()({
9+
include: {
10+
materials: true
11+
}
12+
});
13+
14+
export default manufacturerQueryArgs;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ projectRouter.post(
5656
validateInputs,
5757
ProjectsController.createManufacturer
5858
);
59+
projectRouter.get('/bom/manufacturer', ProjectsController.getAllManufacturers);
5960
projectRouter.post('/bom/material-type/create', nonEmptyString(body('name')), ProjectsController.createMaterialType);
6061
projectRouter.post(
6162
'/bom/assembly/:wbsNum/create',

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Material_Type, User, Assembly, Material_Status, Material } from '@prisma/client';
1+
import { Manufacturer, Role, Material_Type, User, Assembly, Material_Status, Material } 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';
@@ -28,8 +28,10 @@ import {
2828
} from '../utils/description-bullets.utils';
2929
import linkQueryArgs from '../prisma-query-args/links.query-args';
3030
import linkTypeQueryArgs from '../prisma-query-args/link-types.query-args';
31+
import manufacturerQueryArgs from '../prisma-query-args/manufacturers.query-args';
3132
import { linkTypeTransformer } from '../transformers/links.transformer';
3233
import { updateLinks, linkToChangeListValue } from '../utils/links.utils';
34+
import { manufacturerTransformer } from '../transformers/manufacturer.transformer';
3335
import { isUserPartOfTeams } from '../utils/teams.utils';
3436

3537
export default class ProjectsService {
@@ -783,6 +785,22 @@ export default class ProjectsService {
783785
return newManufacturer;
784786
}
785787

788+
/**
789+
* Get all the manufacturers in the database.
790+
* @returns all the manufacturers
791+
*/
792+
static async getAllManufacturers(submitter: User): Promise<Manufacturer[]> {
793+
if (submitter.role === Role.GUEST) {
794+
throw new AccessDeniedGuestException('Get Manufacturers');
795+
}
796+
797+
return (
798+
await prisma.manufacturer.findMany({
799+
...manufacturerQueryArgs
800+
})
801+
).map(manufacturerTransformer);
802+
}
803+
786804
/**
787805
* Create a new material type
788806
* @param name the name of the new material type
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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 { Manufacturer, Prisma } from '@prisma/client';
7+
import manufacturerQueryArgs from '../prisma-query-args/manufacturers.query-args';
8+
9+
export const manufacturerTransformer = (
10+
manufacturer: Prisma.ManufacturerGetPayload<typeof manufacturerQueryArgs>
11+
): Manufacturer => {
12+
return {
13+
name: manufacturer.name,
14+
dateCreated: manufacturer.dateCreated,
15+
creatorId: manufacturer.creatorId
16+
};
17+
};

src/backend/tests/projects.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,23 @@ describe('Projects', () => {
640640
expect(manufacturer.name).toBe(prismaManufacturer1.name);
641641
expect(manufacturer.creatorId).toBe(prismaManufacturer1.creatorId);
642642
});
643+
644+
test('Get all Manufacturer works', async () => {
645+
vi.spyOn(prisma.manufacturer, 'findMany').mockResolvedValue([]);
646+
647+
const res = await ProjectsService.getAllManufacturers(batman);
648+
649+
expect(prisma.manufacturer.findMany).toHaveBeenCalledTimes(1);
650+
expect(res).toStrictEqual([]);
651+
});
652+
653+
test('Get all Manufacturer fails from guest', async () => {
654+
vi.spyOn(prisma.manufacturer, 'findMany').mockResolvedValue([]);
655+
656+
await expect(ProjectsService.getAllManufacturers(theVisitor)).rejects.toThrow(
657+
new AccessDeniedGuestException('Get Manufacturers')
658+
);
659+
});
643660
});
644661

645662
describe('materialType', () => {

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,31 @@ export interface LinkCreateArgs {
9696
url: string;
9797
}
9898

99+
export interface Material {
100+
materialId: String;
101+
name: String;
102+
wbsElement: WbsElement;
103+
wbsElementId: number;
104+
dateCreated: Date;
105+
userCreated: User;
106+
userCreatedId: number;
107+
materialTypeName: String;
108+
manufacturerName: String;
109+
manufacturerPartNumber: String;
110+
quantity: number;
111+
price: number;
112+
subtotal: number;
113+
linkUrl: String;
114+
notes: String;
115+
}
116+
117+
export interface Manufacturer {
118+
name: string;
119+
dateCreated: Date;
120+
creatorId: number;
121+
materials: Material[];
122+
}
123+
99124
export enum MaterialStatus {
100125
Ordered = 'ORDERED',
101126
Received = 'RECEIVED',

0 commit comments

Comments
 (0)