Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow multiple extension request #1563

Merged
merged 9 commits into from
Oct 14, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor code
  • Loading branch information
MayurLund committed Oct 10, 2023
commit 92ec6f11705d4c50f9f7b6e34649facd1c3bba78
67 changes: 28 additions & 39 deletions controllers/extensionRequests.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ const createTaskExtensionRequest = async (req, res) => {
return res.boom.badRequest("Task with this id or taskid doesn't exist.");
}
if (task.assignee !== assigneeUsername) {
return res.boom.badRequest("This task is assigned to some different user");
return res.boom.badRequest("This task is assigned to some different user.");
}
if (task.endsOn >= extensionBody.newEndsOn) {
return res.boom.badRequest("The value for newEndsOn should be greater than the previous ETA");
return res.boom.badRequest("New ETA must be later than the existing ETA.");
}
if (extensionBody.oldEndsOn !== task.endsOn) {
extensionBody.oldEndsOn = task.endsOn;
Expand All @@ -53,24 +53,14 @@ const createTaskExtensionRequest = async (req, res) => {
taskId: extensionBody.taskId,
});

if (latestExtensionRequest[0] && latestExtensionRequest[0].status === "PENDING") {
if (latestExtensionRequest && latestExtensionRequest.status === EXTENSION_REQUEST_STATUS.PENDING) {
return res.boom.badRequest("An extension request for this task already exists.");
}

// dont allow newETA<taskEndsOnETA
if (latestExtensionRequest[0]) {
if (latestExtensionRequest[0].status === "APPROVED" || latestExtensionRequest[0].status === "DENIED") {
if (extensionBody.newEndsOn < task.endsOn) {
return res.boom.badRequest("An extension request can't be equal to or lesser than taskEndsOn date");
}
}
}

// logic for extension request count
let requestNumber;
if (latestExtensionRequest[0] && latestExtensionRequest[0].userId === assigneeId) {
if (latestExtensionRequest[0].requestNumber !== undefined && latestExtensionRequest[0].requestNumber > 0) {
requestNumber = latestExtensionRequest[0].requestNumber + 1;
if (latestExtensionRequest && latestExtensionRequest.assigneeId === assigneeId) {
if (latestExtensionRequest.requestNumber && latestExtensionRequest.requestNumber > 0) {
requestNumber = latestExtensionRequest.requestNumber + 1;
extensionBody = { ...extensionBody, requestNumber };
} else {
extensionBody = { ...extensionBody, requestNumber: 2 };
Expand Down Expand Up @@ -225,45 +215,44 @@ const getExtensionRequest = async (req, res) => {
* @param res {Object} - Express response object
*/
const getSelfExtensionRequests = async (req, res) => {
// Inside dev flag it just shows
const dev = req.query.dev === "true";
if (dev) {
try {
const { id: userId } = req.userData;
const { taskId } = req.query;

if (userId) {
let allExtensionRequests = await extensionRequestsQuery.fetchLatestExtensionRequest({
try {
const { id: userId } = req.userData;
const { taskId, status } = req.query;

if (dev) {
if (taskId) {
const latestExtensionRequest = await extensionRequestsQuery.fetchLatestExtensionRequest({
taskId,
});

if (allExtensionRequests.length && allExtensionRequests[0].userId !== userId) {
allExtensionRequests = [];
if (latestExtensionRequest && latestExtensionRequest.assigneeId !== userId) {
return res.json({ message: "Extension Requests returned successfully!", allExtensionRequests: [] });
} else {
return res.json({
message: "Extension Requests returned successfully!",
allExtensionRequests: [latestExtensionRequest],
});
}
return res.json({ message: "Extension Requests returned successfully!", allExtensionRequests });
} else {
return res.boom.notFound("User doesn't exist");
}
return res.boom.notFound("User doesn't exist");
} catch (error) {
logger.error(`Error while fetching extension requests: ${error}`);
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
}
} else {
try {
const { id: userId } = req.userData;
const { taskId, status } = req.query;
} else {
if (userId) {
const allExtensionRequests = await extensionRequestsQuery.fetchExtensionRequests({
status,
taskId,
assignee: userId,
});
return res.json({ message: "Extension Requests returned successfully!", allExtensionRequests });
} else {
return res.boom.notFound("User doesn't exist");
}
return res.boom.notFound("User doesn't exist");
} catch (error) {
logger.error(`Error while fetching extension requests: ${error}`);
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
}
} catch (error) {
logger.error(`Error while fetching extension requests: ${error}`);
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
}
};

Expand Down
2 changes: 1 addition & 1 deletion models/extensionRequests.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ const fetchLatestExtensionRequest = async (ExtensionRequestQuery) => {

const request = buildExtensionRequests(extensionRequestSnapshot);
const updatedRequests = await formatExtensionRequest(request[0]);
return [updatedRequests];
return updatedRequests;
} catch (err) {
logger.error("error getting extension requests", err);
throw err;
Expand Down
76 changes: 34 additions & 42 deletions test/integration/multilpleExtensionRequest.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ describe("Multiple Extension Requests", function () {

expect(res).to.have.status(400);
expect(res.body).to.be.a("object");
expect(res.body.message).to.equal("This task is assigned to some different user");
expect(res.body.message).to.equal("This task is assigned to some different user.");
return done();
});
});
Expand Down Expand Up @@ -270,17 +270,15 @@ describe("Multiple Extension Requests", function () {
});

it("should handle the case when a previous extension request is pending so api should not allow and throw a proper message", async function () {
fetchLatestExtensionRequestStub.returns([
{
taskId: taskId1,
title: "change ETA",
assignee: user.id,
oldEndsOn: 1234,
newEndsOn: 1235,
reason: "family event",
status: "PENDING",
},
]);
fetchLatestExtensionRequestStub.returns({
taskId: taskId1,
title: "change ETA",
assignee: user.id,
oldEndsOn: 1234,
newEndsOn: 1235,
reason: "family event",
status: "PENDING",
});

const requestData = {
taskId: taskId1,
Expand Down Expand Up @@ -332,36 +330,32 @@ describe("Multiple Extension Requests", function () {
.set("cookie", `${cookieName}=${userJWT}`)
.send(requestData);
expect(res).to.have.status(400);
expect(res.body.message).to.equal("An extension request can't be equal to or lesser than taskEndsOn");
expect(res.body.message).to.equal("New ETA must be later than the existing ETA.");
});
});

let fetchLatestExtensionRequestStub;
describe("GET /extension-requests/self **when dev flag is true**", function () {
beforeEach(function () {
// Create a Sinon sandbox
fetchLatestExtensionRequestStub = sinon.stub(extensionRequests, "fetchLatestExtensionRequest");
});

afterEach(function () {
// Restore the stub after each test
fetchLatestExtensionRequestStub.restore();
});

it("Dev-flag true->should return success response and an empty array of extensionRequest if assignee is not same as latest one", function (done) {
fetchLatestExtensionRequestStub.returns([
{
taskId: taskId2,
title: "change ETA",
assignee: "mayur",
oldEndsOn: 1234,
newEndsOn: 1237,
reason: "family event",
status: "APPROVED",
requestNumber: 5,
userId: "ajdf",
},
]);
fetchLatestExtensionRequestStub.returns({
taskId: taskId2,
title: "change ETA",
assignee: "mayur",
oldEndsOn: 1234,
newEndsOn: 1237,
reason: "family event",
status: "APPROVED",
requestNumber: 5,
userId: "ajdf",
});
chai
.request(app)
.get(`/extension-requests/self`)
Expand All @@ -380,20 +374,18 @@ describe("Multiple Extension Requests", function () {
});
});

it("Dev-flag true->should return success response and an array of single extensionRequest if assignee same as latest one", function (done) {
fetchLatestExtensionRequestStub.returns([
{
taskId: taskId2,
title: "change ETA",
assignee: "mayur",
oldEndsOn: 1234,
newEndsOn: 1237,
reason: "family event",
status: "APPROVED",
requestNumber: 5,
userId: user.id,
},
]);
it("Dev-flag true->should return success response and a single latestExtensionRequest if assignee same as latest one", function (done) {
fetchLatestExtensionRequestStub.returns = {
taskId: taskId2,
title: "change ETA",
assignee: "mayur",
oldEndsOn: 1234,
newEndsOn: 1237,
reason: "family event",
status: "APPROVED",
requestNumber: 5,
userId: user.id,
};
chai
.request(app)
.get(`/extension-requests/self`)
Expand Down
9 changes: 4 additions & 5 deletions utils/extensionRequests.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,11 @@ const formatExtensionRequest = async (extensionRequest) => {
if (!extensionRequest) return extensionRequest;

let { timestamp, id, assignee, ...body } = extensionRequest;
const userId = assignee;
if (assignee) {
assignee = await getUsername(assignee);
const assigneeId = assignee;
if (assigneeId) {
assignee = await getUsername(assigneeId);
}

return { ...body, id, timestamp, assignee, userId };
return { ...body, id, timestamp, assignee, assigneeId };
};

const transformQuery = (size, status, dev = false) => {
Expand Down
Loading