| 45 | }; |
| 46 | |
| 47 | const addTaskRequests = async (req, res) => { |
| 48 | try { |
| 49 | const taskRequestData = req.body; |
| 50 | const usernamePromise = usersUtils.getUsername(taskRequestData.userId); |
| 51 | if (req.userData.id !== taskRequestData.userId && !req.userData.roles?.super_user) { |
| 52 | return res.boom.forbidden("Not authorized to create the request"); |
| 53 | } |
| 54 | if (taskRequestData.proposedDeadline < taskRequestData.proposedStartDate) { |
| 55 | return res.boom.badRequest("Task deadline cannot be before the start date"); |
| 56 | } |
| 57 | switch (taskRequestData.requestType) { |
| 58 | case TASK_REQUEST_TYPE.ASSIGNMENT: { |
| 59 | const taskDataPromise = tasksModel.fetchTask(taskRequestData.taskId); |
| 60 | |
| 61 | const [{ taskData }, username] = await Promise.all([taskDataPromise, usernamePromise]); |
| 62 | taskRequestData.taskTitle = taskData?.title; |
| 63 | if (!username) { |
| 64 | return res.boom.badRequest("User not found"); |
| 65 | } |
| 66 | if (!taskData) { |
| 67 | return res.boom.badRequest("Task does not exist"); |
| 68 | } |
| 69 | break; |
| 70 | } |
| 71 | case TASK_REQUEST_TYPE.CREATION: { |
| 72 | let issuePromise; |
| 73 | try { |
| 74 | const url = new URL(taskRequestData.externalIssueUrl); |
| 75 | const issueUrlPaths = url.pathname.split("/"); |
| 76 | const repositoryName = issueUrlPaths[3]; |
| 77 | const issueNumber = issueUrlPaths[5]; |
| 78 | issuePromise = githubService.fetchIssuesById(repositoryName, issueNumber); |
| 79 | } catch (error) { |
| 80 | return res.boom.badRequest("External issue url is not valid"); |
| 81 | } |
| 82 | const [issueData, username] = await Promise.all([issuePromise, usernamePromise]); |
| 83 | taskRequestData.taskTitle = issueData?.title; |
| 84 | if (!username) { |
| 85 | return res.boom.badRequest("User not found"); |
| 86 | } |
| 87 | if (!issueData) { |
| 88 | return res.boom.badRequest("Issue does not exist"); |
| 89 | } |
| 90 | break; |
| 91 | } |
| 92 | } |
| 93 | const newTaskRequest = await taskRequestsModel.createRequest(taskRequestData, req.userData.id); |
| 94 | |
| 95 | if (newTaskRequest.isCreationRequestApproved) { |
| 96 | return res.boom.conflict("Task exists for the given issue."); |
| 97 | } |
| 98 | if (newTaskRequest.alreadyRequesting) { |
| 99 | return res.boom.badRequest("Task was already requested"); |
| 100 | } |
| 101 | |
| 102 | const taskRequestLog = { |
| 103 | type: "taskRequests", |
| 104 | meta: { |