Skip to content

Commit 390eb4d

Browse files
committed
Merge branch 'develop' into #1527-Delete-Material-Endpoint
2 parents d488aaf + ffa28d5 commit 390eb4d

53 files changed

Lines changed: 1560 additions & 102 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/run-tests.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ jobs:
2020
steps:
2121
- name: Checkout repository
2222
uses: actions/checkout@v3
23+
- name: Set env variables
24+
run: touch .env && echo "FINANCE_TEAM_ID=0" >> .env
2325
- name: Set up Node.js
2426
uses: actions/setup-node@v3
2527
with:

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

Lines changed: 110 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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';
33
import { User } from '@prisma/client';
44
import { getCurrentUser } from '../utils/auth.utils';
@@ -167,14 +167,14 @@ export default class ProjectsController {
167167
manufacturerName,
168168
manufacturerPartNumber,
169169
quantity,
170-
unitName,
171170
price,
172171
subtotal,
173172
linkUrl,
174173
notes,
175174
wbsNum,
176175
assemblyId,
177-
pdmFileName
176+
pdmFileName,
177+
unitName
178178
);
179179
return res.status(200).json(material);
180180
} catch (error: unknown) {
@@ -193,6 +193,37 @@ export default class ProjectsController {
193193
}
194194
}
195195

196+
static async deleteManufacturer(req: Request, res: Response, next: NextFunction) {
197+
try {
198+
const user: User = await getCurrentUser(res);
199+
const { manufacturerName } = req.params;
200+
const deletedManufacturer = await ProjectsService.deleteManufacturer(user, manufacturerName);
201+
res.status(200).json(deletedManufacturer);
202+
} catch (error: unknown) {
203+
next(error);
204+
}
205+
}
206+
207+
static async getAllManufacturers(req: Request, res: Response, next: NextFunction) {
208+
try {
209+
const user = await getCurrentUser(res);
210+
const manufacturers: Manufacturer[] = await ProjectsService.getAllManufacturers(user);
211+
return res.status(200).json(manufacturers);
212+
} catch (error: unknown) {
213+
next(error);
214+
}
215+
}
216+
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+
196227
static async createMaterialType(req: Request, res: Response, next: NextFunction) {
197228
try {
198229
const { name } = req.body;
@@ -203,4 +234,80 @@ export default class ProjectsController {
203234
next(error);
204235
}
205236
}
237+
238+
static async assignMaterialAssembly(req: Request, res: Response, next: NextFunction) {
239+
try {
240+
const { materialId } = req.params;
241+
const { assemblyId } = req.body;
242+
const user = await getCurrentUser(res);
243+
const updatedMaterial = await ProjectsService.assignMaterialAssembly(user, materialId, assemblyId);
244+
res.status(200).json(updatedMaterial);
245+
} catch (error: unknown) {
246+
next(error);
247+
}
248+
}
249+
250+
static async deleteAssemblyType(req: Request, res: Response, next: NextFunction) {
251+
try {
252+
const { assemblyId } = req.params;
253+
const user = await getCurrentUser(res);
254+
const deletedAssembly = await ProjectsService.deleteAssembly(assemblyId, user);
255+
res.status(200).json(deletedAssembly);
256+
} catch (error: unknown) {
257+
next(error);
258+
}
259+
}
260+
261+
static async deleteMaterialType(req: Request, res: Response, next: NextFunction) {
262+
try {
263+
const { materialTypeId } = req.params;
264+
const user = await getCurrentUser(res);
265+
const deletedMaterial = await ProjectsService.deleteMaterialType(materialTypeId, user);
266+
res.status(200).json(deletedMaterial);
267+
} catch (error: unknown) {
268+
next(error);
269+
}
270+
}
271+
272+
static async editMaterial(req: Request, res: Response, next: NextFunction) {
273+
try {
274+
const user = await getCurrentUser(res);
275+
const { materialId } = req.params;
276+
const {
277+
name,
278+
assemblyId,
279+
status,
280+
materialTypeName,
281+
manufacturerName,
282+
manufacturerPartNumber,
283+
pdmFileName,
284+
quantity,
285+
unitName,
286+
price,
287+
subtotal,
288+
linkUrl,
289+
notes
290+
} = req.body;
291+
const updatedMaterial = await ProjectsService.editMaterial(
292+
user,
293+
materialId,
294+
name,
295+
status,
296+
materialTypeName,
297+
manufacturerName,
298+
manufacturerPartNumber,
299+
quantity,
300+
price,
301+
subtotal,
302+
linkUrl,
303+
notes,
304+
unitName,
305+
assemblyId,
306+
pdmFileName
307+
);
308+
res.status(200).json(updatedMaterial);
309+
} catch (error: unknown) {
310+
next(error);
311+
}
312+
}
206313
}

src/backend/src/controllers/reimbursement-requests.controllers.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,17 @@ export default class ReimbursementRequestsController {
230230
}
231231
}
232232

233+
static async denyReimbursementRequest(req: Request, res: Response, next: NextFunction) {
234+
try {
235+
const { requestId } = req.params;
236+
const user = await getCurrentUser(res);
237+
const reimbursementStatus = await ReimbursementRequestService.denyReimbursementRequest(requestId, user);
238+
res.status(200).json(reimbursementStatus);
239+
} catch (error: unknown) {
240+
next(error);
241+
}
242+
}
243+
233244
static async markReimbursementRequestAsDelivered(req: Request, res: Response, next: NextFunction) {
234245
try {
235246
const { requestId } = req.params;

src/backend/src/controllers/work-packages.controllers.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ export default class WorkPackagesController {
2929
}
3030
}
3131

32+
static async getManyWorkPackages(req: Request, res: Response, next: NextFunction) {
33+
try {
34+
const { wbsNums } = req.body;
35+
const workPackages: WorkPackage[] = await WorkPackagesService.getManyWorkPackages(wbsNums);
36+
res.status(200).json(workPackages);
37+
} catch (error: unknown) {
38+
next(error);
39+
}
40+
}
41+
3242
// Create a work package with the given details
3343
static async createWorkPackage(req: Request, res: Response, next: NextFunction) {
3444
try {
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;
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;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterEnum
2+
ALTER TYPE "Reimbursement_Status_Type" ADD VALUE 'DENIED';

src/backend/src/prisma/migrations/20231024124220_add_bom/migration.sql renamed to src/backend/src/prisma/migrations/20231119081759_add_bom/migration.sql

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ CREATE TABLE "Material" (
5151
CREATE TABLE "Material_Type" (
5252
"name" TEXT NOT NULL,
5353
"dateCreated" TIMESTAMP(3) NOT NULL,
54+
"dateDeleted" TIMESTAMP(3),
5455
"creatorId" INTEGER NOT NULL,
5556

5657
CONSTRAINT "Material_Type_pkey" PRIMARY KEY ("name")
@@ -61,16 +62,14 @@ CREATE TABLE "Manufacturer" (
6162
"name" TEXT NOT NULL,
6263
"dateCreated" TIMESTAMP(3) NOT NULL,
6364
"creatorId" INTEGER NOT NULL,
65+
"dateDeleted" TIMESTAMP(3),
6466

6567
CONSTRAINT "Manufacturer_pkey" PRIMARY KEY ("name")
6668
);
6769

6870
-- CreateIndex
6971
CREATE UNIQUE INDEX "Assembly_name_key" ON "Assembly"("name");
7072

71-
-- CreateIndex
72-
CREATE UNIQUE INDEX "Material_name_key" ON "Material"("name");
73-
7473
-- AddForeignKey
7574
ALTER TABLE "Assembly" ADD CONSTRAINT "Assembly_userDeletedId_fkey" FOREIGN KEY ("userDeletedId") REFERENCES "User"("userId") ON DELETE SET NULL ON UPDATE CASCADE;
7675

src/backend/src/prisma/schema.prisma

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ enum Reimbursement_Status_Type {
364364
SABO_SUBMITTED
365365
ADVISOR_APPROVED
366366
REIMBURSED
367+
DENIED
367368
}
368369

369370
model Reimbursement_Status {
@@ -490,7 +491,7 @@ model Material {
490491
materialId String @id @default(uuid())
491492
assembly Assembly? @relation(fields: [assemblyId], references: [assemblyId])
492493
assemblyId String?
493-
name String @unique
494+
name String
494495
wbsElement WBS_Element @relation(fields: [wbsElementId], references: [wbsElementId])
495496
wbsElementId Int
496497
dateDeleted DateTime?
@@ -518,6 +519,7 @@ model Material {
518519
model Material_Type {
519520
name String @id
520521
dateCreated DateTime
522+
dateDeleted DateTime?
521523
creatorId Int
522524
materials Material[]
523525
}
@@ -526,5 +528,6 @@ model Manufacturer {
526528
name String @id
527529
dateCreated DateTime
528530
creatorId Int
531+
dateDeleted DateTime?
529532
materials Material[]
530533
}

src/backend/src/prisma/seed.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ import ChangeRequestsService from '../services/change-requests.services';
2222
import projectQueryArgs from '../prisma-query-args/projects.query-args';
2323
import TeamsService from '../services/teams.services';
2424
import WorkPackagesService from '../services/work-packages.services';
25-
import { ChangeRequest, ClubAccount, StandardChangeRequest, validateWBS, WbsElementStatus, WorkPackageStage } from 'shared';
25+
import { ClubAccount, StandardChangeRequest, validateWBS, WbsElementStatus, WorkPackageStage } from 'shared';
2626
import TasksService from '../services/tasks.services';
2727
import DescriptionBulletsService from '../services/description-bullets.services';
2828
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

@@ -208,15 +209,12 @@ const performSeed: () => Promise<void> = async () => {
208209
batman,
209210
justiceLeague.teamId,
210211
[
211-
wonderwoman,
212212
flash,
213213
aquaman,
214214
superman,
215215
hawkMan,
216216
hawkWoman,
217-
cyborg,
218217
greenLantern,
219-
martianManhunter,
220218
lexLuther,
221219
hawkgirl,
222220
elongatedMan,
@@ -227,6 +225,11 @@ const performSeed: () => Promise<void> = async () => {
227225
hankHeywood
228226
].map((user) => user.userId)
229227
);
228+
await TeamsService.setTeamLeads(
229+
batman,
230+
justiceLeague.teamId,
231+
[wonderwoman, cyborg, martianManhunter].map((user) => user.userId)
232+
);
230233
await TeamsService.setTeamMembers(
231234
aang,
232235
avatarBenders.teamId,
@@ -837,6 +840,10 @@ const performSeed: () => Promise<void> = async () => {
837840
[joeShmoe.userId]
838841
);
839842

843+
/**
844+
* Reimbursements
845+
*/
846+
840847
const vendor = await ReimbursementRequestService.createVendor(thomasEmrax, 'Tesla');
841848
const vendor2 = await ReimbursementRequestService.createVendor(thomasEmrax, 'Amazon');
842849
const vendor3 = await ReimbursementRequestService.createVendor(thomasEmrax, 'Google');
@@ -867,6 +874,12 @@ const performSeed: () => Promise<void> = async () => {
867874
expenseType.expenseTypeId,
868875
100
869876
);
877+
878+
/**
879+
* Bill of Materials
880+
*/
881+
await ProjectsService.createManufacturer(thomasEmrax, 'Digikey');
882+
await ProjectsService.createMaterialType('Resistor', thomasEmrax);
870883
};
871884

872885
performSeed()

0 commit comments

Comments
 (0)