Skip to content

Commit 850fb1e

Browse files
committed
Revert "#1330: redesigned the create wp endpoint"
This reverts commit 63599e2.
1 parent 63599e2 commit 850fb1e

7 files changed

Lines changed: 74 additions & 125 deletions

File tree

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export default class WorkPackagesController {
3232
// Create a work package with the given details
3333
static async createWorkPackage(req: Request, res: Response, next: NextFunction) {
3434
try {
35-
const { name, crId, startDate, duration, blockedBy, expectedActivities, deliverables } = req.body;
35+
const { projectWbsNum, name, crId, startDate, duration, blockedBy, expectedActivities, deliverables } = req.body;
3636

3737
let { stage } = req.body;
3838
if (stage === 'NONE') {
@@ -43,6 +43,7 @@ export default class WorkPackagesController {
4343

4444
const wbsString: string = await WorkPackagesService.createWorkPackage(
4545
user,
46+
projectWbsNum,
4647
name,
4748
crId,
4849
stage,

src/backend/src/prisma/seed-data/work-packages.seed.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { descBulletConverter } from '../../utils/description-bullets.utils';
1818
*/
1919
export const seedWorkPackage = async (
2020
creator: User,
21+
projectWbsNumber: WbsNumber,
2122
name: string,
2223
changeRequestId: number,
2324
stage: WorkPackageStage | null,
@@ -36,6 +37,7 @@ export const seedWorkPackage = async (
3637
}> => {
3738
const workPackage1WbsString = await WorkPackagesService.createWorkPackage(
3839
creator,
40+
projectWbsNumber,
3941
name,
4042
changeRequestId,
4143
stage,

src/backend/src/prisma/seed.ts

Lines changed: 10 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -316,60 +316,15 @@ const performSeed: () => Promise<void> = async () => {
316316
joeBlow.userId
317317
);
318318

319-
/**
320-
* Make approved change requests that has project 1 and 5 as wbs element
321-
*/
322-
323-
const changeRequest2Id = await ChangeRequestsService.createStandardChangeRequest(
324-
thomasEmrax,
325-
project1WbsNumber.carNumber,
326-
project1WbsNumber.projectNumber,
327-
project1WbsNumber.workPackageNumber,
328-
CR_Type.DEFINITION_CHANGE,
329-
'Remove the uncessary rule',
330-
[{ type: Scope_CR_Why_Type.DESIGN, explain: 'The rule has changed' }]
331-
);
332-
333-
const proposedSolution2Id = await ChangeRequestsService.addProposedSolution(
334-
thomasEmrax,
335-
changeRequest2Id,
336-
50,
337-
'Remove the rule',
338-
1,
339-
'n/a'
340-
);
341-
342-
await ChangeRequestsService.reviewChangeRequest(joeShmoe, changeRequest2Id, 'LGTM', true, proposedSolution2Id);
343-
344-
const changeRequest3Id = await ChangeRequestsService.createStandardChangeRequest(
345-
thomasEmrax,
346-
project5WbsNumber.carNumber,
347-
project5WbsNumber.projectNumber,
348-
project5WbsNumber.workPackageNumber,
349-
CR_Type.ISSUE,
350-
'Change the wire material',
351-
[{ type: Scope_CR_Why_Type.MAINTENANCE, explain: 'It would be better to maintain' }]
352-
);
353-
354-
const proposedSolution3Id = await ChangeRequestsService.addProposedSolution(
355-
thomasEmrax,
356-
changeRequest3Id,
357-
50,
358-
'Change to better wire material',
359-
1,
360-
'n/a'
361-
);
362-
363-
await ChangeRequestsService.reviewChangeRequest(joeShmoe, changeRequest3Id, 'LGTM', true, proposedSolution3Id);
364-
365319
/**
366320
* Work Packages
367321
*/
368322
/** Work Package 1 */
369323
const { workPackageWbsNumber: workPackage1WbsNumber, workPackage: workPackage1 } = await seedWorkPackage(
370324
joeShmoe,
325+
project1WbsNumber,
371326
'Bodywork Concept of Design',
372-
changeRequest2Id,
327+
changeRequest1Id,
373328
WorkPackageStage.Design,
374329
'01/01/2023',
375330
3,
@@ -408,8 +363,9 @@ const performSeed: () => Promise<void> = async () => {
408363
/** Work Package 2 */
409364
const { workPackageWbsNumber: workPackage2WbsNumber, workPackage: workPackage2 } = await seedWorkPackage(
410365
thomasEmrax,
366+
project1WbsNumber,
411367
'Adhesive Shear Strength Test',
412-
changeRequest2Id,
368+
changeRequest1Id,
413369
WorkPackageStage.Research,
414370
'01/22/2023',
415371
5,
@@ -431,8 +387,9 @@ const performSeed: () => Promise<void> = async () => {
431387
/** Work Package 3 */
432388
const workPackage3WbsString = await WorkPackagesService.createWorkPackage(
433389
thomasEmrax,
390+
project5WbsNumber,
434391
'Manufacture Wiring Harness',
435-
changeRequest3Id,
392+
changeRequest1Id,
436393
WorkPackageStage.Manufacturing,
437394
'02/01/2023',
438395
3,
@@ -459,7 +416,7 @@ const performSeed: () => Promise<void> = async () => {
459416
true
460417
);
461418

462-
const changeRequest4Id = await ChangeRequestsService.createStandardChangeRequest(
419+
const changeRequest2Id = await ChangeRequestsService.createStandardChangeRequest(
463420
thomasEmrax,
464421
project2WbsNumber.carNumber,
465422
project2WbsNumber.projectNumber,
@@ -471,16 +428,16 @@ const performSeed: () => Promise<void> = async () => {
471428
{ type: Scope_CR_Why_Type.ESTIMATION, explain: 'I estimate that it would be really pretty' }
472429
]
473430
);
474-
await ChangeRequestsService.addProposedSolution(thomasEmrax, changeRequest4Id, 50, 'Buy hot pink paint', 1, 'n/a');
431+
await ChangeRequestsService.addProposedSolution(thomasEmrax, changeRequest2Id, 50, 'Buy hot pink paint', 1, 'n/a');
475432
await ChangeRequestsService.addProposedSolution(
476433
thomasEmrax,
477-
changeRequest4Id,
434+
changeRequest2Id,
478435
40,
479436
'Buy slightly cheaper but lower quality hot pink paint',
480437
1,
481438
'n/a'
482439
);
483-
await ChangeRequestsService.reviewChangeRequest(joeShmoe, changeRequest4Id, 'What the hell Thomas', false, null);
440+
await ChangeRequestsService.reviewChangeRequest(joeShmoe, changeRequest2Id, 'What the hell Thomas', false, null);
484441

485442
await ChangeRequestsService.createActivationChangeRequest(
486443
thomasEmrax,

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ workPackagesRouter.post(
1111
'/create',
1212
intMinZero(body('crId')),
1313
nonEmptyString(body('name')),
14+
intMinZero(body('projectWbsNum.carNumber')),
15+
intMinZero(body('projectWbsNum.projectNumber')),
16+
intMinZero(body('projectWbsNum.workPackageNumber')),
1417
isWorkPackageStageOrNone(body('stage')),
1518
isDate(body('startDate')),
1619
intMinZero(body('duration')),

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

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export default class WorkPackagesService {
111111
/**
112112
* Creates a Work_Package in the database
113113
* @param user the user creating the work package
114+
* @param projectWbsNum the WBS number of the attached project
114115
* @param name the name of the new work package
115116
* @param crId the id of the change request creating this work package
116117
* @param stage the stage of the work package
@@ -124,6 +125,7 @@ export default class WorkPackagesService {
124125
*/
125126
static async createWorkPackage(
126127
user: User,
128+
projectWbsNum: WbsNumber,
127129
name: string,
128130
crId: number,
129131
stage: WorkPackageStage | null,
@@ -135,11 +137,30 @@ export default class WorkPackagesService {
135137
): Promise<string> {
136138
if (isGuest(user.role)) throw new AccessDeniedGuestException('create work packages');
137139

138-
const changeRequest = await validateChangeRequestAccepted(crId);
140+
await validateChangeRequestAccepted(crId);
141+
142+
// get the corresponding project so we can find the next wbs number
143+
// and what number work package this should be
144+
const { carNumber, projectNumber, workPackageNumber } = projectWbsNum;
145+
146+
if (workPackageNumber !== 0) {
147+
throw new HttpException(
148+
400,
149+
`Given WBS Number ${carNumber}.${projectNumber}.${workPackageNumber} is not for a project.`
150+
);
151+
}
152+
153+
if (blockedBy.find((dep: WbsNumber) => equalsWbsNumber(dep, projectWbsNum))) {
154+
throw new HttpException(400, 'A Work Package cannot have its own project as a blocker');
155+
}
139156

140157
const wbsElem = await prisma.wBS_Element.findUnique({
141158
where: {
142-
wbsElementId: changeRequest.wbsElementId
159+
wbsNumber: {
160+
carNumber,
161+
projectNumber,
162+
workPackageNumber
163+
}
143164
},
144165
include: {
145166
project: {
@@ -150,32 +171,10 @@ export default class WorkPackagesService {
150171
}
151172
});
152173

153-
if (!wbsElem) throw new NotFoundException('WBS Element', changeRequest.wbsElementId);
154-
155-
// get the corresponding project so we can find the next wbs number
156-
// and what number work package this should be
157-
const { carNumber, projectNumber, workPackageNumber } = wbsElem;
158-
159-
const projectWbsNum: WbsNumber = {
160-
carNumber,
161-
projectNumber,
162-
workPackageNumber
163-
};
164-
174+
if (!wbsElem) throw new NotFoundException('WBS Element', `${carNumber}.${projectNumber}.${workPackageNumber}`);
165175
if (wbsElem.dateDeleted)
166176
throw new DeletedException('WBS Element', wbsPipe({ carNumber, projectNumber, workPackageNumber }));
167177

168-
if (workPackageNumber !== 0) {
169-
throw new HttpException(
170-
400,
171-
`Given WBS Number ${carNumber}.${projectNumber}.${workPackageNumber} is not for a project.`
172-
);
173-
}
174-
175-
if (blockedBy.find((dep: WbsNumber) => equalsWbsNumber(dep, projectWbsNum))) {
176-
throw new HttpException(400, 'A Work Package cannot have its own project as a blocker');
177-
}
178-
179178
const { project } = wbsElem;
180179

181180
if (!project) throw new NotFoundException('Project', `${carNumber}.${projectNumber}.${workPackageNumber}`);

src/backend/tests/test-data/wbs-element.test-data.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,3 @@ export const prismaWbsElement1: PrismaWbsElement = {
1313
projectLeadId: 4,
1414
projectManagerId: 5
1515
};
16-
17-
export const prismaWbsElement2: PrismaWbsElement = {
18-
wbsElementId: 1,
19-
status: PrismaWBSElementStatus.ACTIVE,
20-
carNumber: 1,
21-
projectNumber: 2,
22-
workPackageNumber: 2,
23-
dateCreated: new Date(),
24-
dateDeleted: null,
25-
name: 'car',
26-
deletedByUserId: null,
27-
projectLeadId: 4,
28-
projectManagerId: 5
29-
};

src/backend/tests/work-packages.test.ts

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import prisma from '../src/prisma/prisma';
22
import { batman, wonderwoman } from './test-data/users.test-data';
3-
import { prismaWbsElement1, prismaWbsElement2 } from './test-data/wbs-element.test-data';
3+
import { prismaWbsElement1 } from './test-data/wbs-element.test-data';
44
import { prismaChangeRequest1 } from './test-data/change-requests.test-data';
55
import { calculateWorkPackageProgress } from '../src/utils/work-packages.utils';
66
import {
@@ -41,17 +41,18 @@ describe('Work Packages', () => {
4141
const expectedActivities = ['ayo'];
4242
const deliverables = ['ajdhjakfjafja'];
4343
const stage = WorkPackageStage.Design;
44-
const createWorkPackageArgs: [User, string, number, WorkPackageStage, string, number, WbsNumber[], string[], string[]] = [
45-
batman,
46-
name,
47-
crId,
48-
stage,
49-
startDate,
50-
duration,
51-
blockedBy,
52-
expectedActivities,
53-
deliverables
54-
];
44+
const createWorkPackageArgs: [
45+
User,
46+
WbsNumber,
47+
string,
48+
number,
49+
WorkPackageStage,
50+
string,
51+
number,
52+
WbsNumber[],
53+
string[],
54+
string[]
55+
] = [batman, projectWbsNum, name, crId, stage, startDate, duration, blockedBy, expectedActivities, deliverables];
5556
/*********************************************************/
5657

5758
afterEach(() => {
@@ -72,12 +73,16 @@ describe('Work Packages', () => {
7273

7374
describe('createWorkPackage', () => {
7475
test('createWorkPackage fails if WBS number does not represent a project', async () => {
75-
vi.spyOn(prisma.wBS_Element, 'findUnique').mockResolvedValue(prismaWbsElement2);
7676
vi.spyOn(prisma.change_Request, 'findUnique').mockResolvedValue(prismaChangeRequest1);
7777

7878
const callCreateWP = async () => {
7979
return await WorkPackageService.createWorkPackage(
8080
batman,
81+
{
82+
carNumber: 1,
83+
projectNumber: 2,
84+
workPackageNumber: 2
85+
},
8186
name,
8287
crId,
8388
stage,
@@ -110,12 +115,12 @@ describe('Work Packages', () => {
110115
});
111116

112117
test('createWorkPackage fails if user does not have access', async () => {
113-
vi.spyOn(prisma.wBS_Element, 'findUnique').mockResolvedValue(prismaWbsElement2);
114118
vi.spyOn(prisma.change_Request, 'findUnique').mockResolvedValue(prismaChangeRequest1);
115119

116120
const callCreateWP = async () => {
117121
return await WorkPackageService.createWorkPackage(
118122
wonderwoman,
123+
projectWbsNum,
119124
name,
120125
crId,
121126
stage,
@@ -151,9 +156,7 @@ describe('Work Packages', () => {
151156
return await WorkPackageService.createWorkPackage.apply(null, createWorkPackageArgs);
152157
};
153158

154-
await expect(callCreateWP).rejects.toThrowError(
155-
new NotFoundException('WBS Element', prismaChangeRequest1.wbsElementId.toString())
156-
);
159+
await expect(callCreateWP).rejects.toThrowError(new NotFoundException('WBS Element', '1.2.0'));
157160
});
158161

159162
test('createWorkPackage fails if the associated wbsElem does not have a project object', async () => {
@@ -164,24 +167,22 @@ describe('Work Packages', () => {
164167
return await WorkPackageService.createWorkPackage.apply(null, createWorkPackageArgs);
165168
};
166169

167-
await expect(callCreateWP).rejects.toThrowError(
168-
new NotFoundException('WBS Element', prismaChangeRequest1.wbsElementId.toString())
169-
);
170+
await expect(callCreateWP).rejects.toThrowError(new NotFoundException('WBS Element', '1.2.0'));
170171
});
171172

172173
test("fails if the blocked by include the work package's own project", async () => {
173-
vi.spyOn(prisma.wBS_Element, 'findUnique').mockResolvedValueOnce(prismaWbsElement1);
174-
const argsToTest: [User, string, number, WorkPackageStage, string, number, WbsNumber[], string[], string[]] = [
175-
batman,
176-
name,
177-
crId,
178-
stage,
179-
startDate,
180-
duration,
181-
[projectWbsNum],
182-
expectedActivities,
183-
deliverables
184-
];
174+
const argsToTest: [
175+
User,
176+
WbsNumber,
177+
string,
178+
number,
179+
WorkPackageStage,
180+
string,
181+
number,
182+
WbsNumber[],
183+
string[],
184+
string[]
185+
] = [batman, projectWbsNum, name, crId, stage, startDate, duration, [projectWbsNum], expectedActivities, deliverables];
185186

186187
const callCreateWP = async () => {
187188
return await WorkPackageService.createWorkPackage.apply(null, argsToTest);

0 commit comments

Comments
 (0)