diff --git a/controllers/extensionRequests.js b/controllers/extensionRequests.js index 15b2e1a19..1d8ef60eb 100644 --- a/controllers/extensionRequests.js +++ b/controllers/extensionRequests.js @@ -236,6 +236,74 @@ const updateExtensionRequestStatus = async (req, res) => { } }; +/** + * Create ETA extension Request by Admin + * + * @param req {Object} - Express request object + * @param res {Object} - Express response object + */ +const createTaskExtensionRequestAdmin = async (req, res) => { + try { + const extensionBody = req.body; + + if (!req.userData.roles?.super_user) { + return res.boom.forbidden("Only Super User can create an extension request for this task."); + } + + const assigneeUsername = extensionBody.assignee; + const assigneeId = await getUserId(extensionBody.assignee); + extensionBody.assignee = assigneeId; + const { taskData: task } = await tasks.fetchTask(extensionBody.taskId); + if (!task) { + return res.boom.badRequest("Task with this id or taskid doesn't exist."); + } + if (task.endsOn >= extensionBody.newEndsOn) { + return res.boom.badRequest("The value for newEndsOn should be greater than the previous ETA"); + } + if (extensionBody.oldEndsOn !== task.endsOn) { + extensionBody.oldEndsOn = task.endsOn; + } + if (task.assignee !== assigneeUsername) { + return res.boom.badRequest("This task is assigned to some different user"); + } + + const prevExtensionRequest = await extensionRequestsQuery.fetchExtensionRequests({ + taskId: extensionBody.taskId, + assignee: extensionBody.assignee, + }); + if (prevExtensionRequest.length) { + return res.boom.forbidden("An extension request for this task already exists."); + } + + const extensionRequest = await extensionRequestsQuery.createExtensionRequest(extensionBody); + + const extensionLog = { + type: "extensionRequests", + meta: { + taskId: extensionBody.taskId, + createdBy: req.userData.id, + }, + body: { + extensionRequestId: extensionRequest.id, + oldEndsOn: task.endsOn, + newEndsOn: extensionBody.newEndsOn, + assignee: extensionBody.assignee, + status: EXTENSION_REQUEST_STATUS.PENDING, + }, + }; + + await addLog(extensionLog.type, extensionLog.meta, extensionLog.body); + + return res.json({ + message: "Extension Request created successfully!", + extensionRequest: { ...extensionBody, id: extensionRequest.id }, + }); + } catch (err) { + logger.error(`Error while creating new extension request: ${err}`); + return res.boom.badImplementation(INTERNAL_SERVER_ERROR); + } +}; + module.exports = { createTaskExtensionRequest, fetchExtensionRequests, @@ -243,4 +311,5 @@ module.exports = { getSelfExtensionRequests, updateExtensionRequest, updateExtensionRequestStatus, + createTaskExtensionRequestAdmin, }; diff --git a/controllers/tasks.js b/controllers/tasks.js index 13db0e631..0d440da71 100644 --- a/controllers/tasks.js +++ b/controllers/tasks.js @@ -428,7 +428,9 @@ const currentOverdueTasks = async (req, res) => { try { const overdueTasks = await tasks.getAllOverDueTasks(); const overdueTasksStatus = [MERGED, COMPLETED, RELEASED, VERIFIED, AVAILABLE]; - const overdueTasksFiltered = overdueTasks.filter((task) => !overdueTasksStatus.includes(task.status)); + const overdueTasksFiltered = overdueTasks.filter( + (task) => !overdueTasksStatus.includes(task.status) && task.assignee + ); return res.json({ message: "Overdue Tasks returned successfully!", overdueTasks: overdueTasksFiltered, diff --git a/routes/extensionRequests.js b/routes/extensionRequests.js index 91fd05f07..d4d8606a4 100644 --- a/routes/extensionRequests.js +++ b/routes/extensionRequests.js @@ -11,6 +11,13 @@ const { } = require("../middlewares/validators/extensionRequests"); router.post("/", authenticate, createExtensionRequest, extensionRequests.createTaskExtensionRequest); +router.post( + "/admin", + authenticate, + authorizeRoles([SUPERUSER]), + createExtensionRequest, + extensionRequests.createTaskExtensionRequestAdmin +); router.get("/", authenticate, authorizeRoles([SUPERUSER, APPOWNER]), extensionRequests.fetchExtensionRequests); router.get("/self", authenticate, extensionRequests.getSelfExtensionRequests); router.get("/:id", authenticate, authorizeRoles([SUPERUSER, APPOWNER]), extensionRequests.getExtensionRequest);