Skip to content

Commit 0cdc977

Browse files
authored
Merge pull request #1619 from Northeastern-Electric-Racing/#1096-workpackage-leads-add-tasks
#1096 work package leads can create tasks
2 parents 172907a + 7a72a21 commit 0cdc977

3 files changed

Lines changed: 27 additions & 4 deletions

File tree

src/backend/src/services/tasks.services.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ export default class TasksService {
3737
): Promise<Task> {
3838
const requestedWbsElement = await prisma.wBS_Element.findUnique({
3939
where: { wbsNumber: wbsNum },
40-
include: { project: { include: { teams: { ...teamQueryArgs }, wbsElement: true } } }
40+
include: {
41+
project: {
42+
include: { teams: { ...teamQueryArgs }, wbsElement: true, workPackages: { include: { wbsElement: true } } }
43+
}
44+
}
4145
});
4246
if (!requestedWbsElement) throw new NotFoundException('WBS Element', wbsPipe(wbsNum));
4347
if (requestedWbsElement.dateDeleted) throw new DeletedException('WBS Element', wbsPipe(wbsNum));
@@ -51,9 +55,23 @@ export default class TasksService {
5155
const isProjectLeadOrManager =
5256
createdBy.userId === requestedWbsElement.projectLeadId || createdBy.userId === requestedWbsElement.projectManagerId;
5357

54-
if (!isLeadership(createdBy.role) && !isProjectLeadOrManager && !teams.some((team) => isUserOnTeam(team, createdBy))) {
58+
const curWorkPackages = project.workPackages;
59+
60+
const isWorkPackageLeadOrManager = curWorkPackages.some((workPackage) => {
61+
return (
62+
workPackage.wbsElement.projectLeadId === createdBy.userId ||
63+
workPackage.wbsElement.projectManagerId === createdBy.userId
64+
);
65+
});
66+
67+
if (
68+
!isLeadership(createdBy.role) &&
69+
!isProjectLeadOrManager &&
70+
!isWorkPackageLeadOrManager &&
71+
!teams.some((team) => isUserOnTeam(team, createdBy))
72+
) {
5573
throw new AccessDeniedException(
56-
'Only admins, app-admins, project leads, project managers, or current team users can create tasks'
74+
'Only admins, app-admins, project leads, project managers, work package leads, work package managers, or current team users can create tasks'
5775
);
5876
}
5977

src/backend/tests/tasks.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ describe('Tasks', () => {
6363
TasksService.createTask(theVisitor, mockWBSNum, 'hellow world', '', mockDate, 'HIGH', 'DONE', [])
6464
).rejects.toThrow(
6565
new AccessDeniedException(
66-
'Only admins, app-admins, project leads, project managers, or current team users can create tasks'
66+
'Only admins, app-admins, project leads, project managers, work package leads, work package managers, or current team users can create tasks'
6767
)
6868
);
6969

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/TaskList/TaskList.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,14 @@ const TaskList = ({ project }: TaskListProps) => {
6666
const { user } = auth;
6767
if (!user) return <LoadingIndicator />;
6868

69+
const isWorkPackageLeadOrManager = project.workPackages.some((workPackage) => {
70+
return workPackage.projectLead?.userId === user.userId || workPackage.projectManager?.userId === user.userId;
71+
});
72+
6973
const createTaskPermissions =
7074
isLeadership(user.role) ||
7175
project.projectLead?.userId === user.userId ||
76+
isWorkPackageLeadOrManager ||
7277
project.projectManager?.userId === user.userId ||
7378
project.teams.some((team) => team.head.userId === user.userId) ||
7479
project.teams.some((team) => team.leads.map((lead) => lead.userId).includes(user.userId));

0 commit comments

Comments
 (0)