Skip to content

Commit 1cf19fc

Browse files
authored
Merge pull request #1070 from Real-Dev-Squad/task-dependency-v2
Task dependency
2 parents 3676073 + c2287e9 commit 1cf19fc

File tree

4 files changed

+71
-7
lines changed

4 files changed

+71
-7
lines changed

controllers/tasks.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const { addOrUpdate, getRdsUserInfoByGitHubUsername } = require("../models/users
66
const { OLD_ACTIVE, OLD_BLOCKED, OLD_PENDING } = TASK_STATUS_OLD;
77
const { IN_PROGRESS, BLOCKED, SMOKE_TESTING, ASSIGNED } = TASK_STATUS;
88
const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
9+
const dependencyModel = require("../models/tasks");
910
/**
1011
* Creates new task
1112
*
@@ -16,17 +17,25 @@ const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../constants/er
1617
const addNewTask = async (req, res) => {
1718
try {
1819
const { id: createdBy } = req.userData;
20+
const dependsOn = req.body.dependsOn;
1921
const body = {
2022
...req.body,
2123
createdBy,
2224
};
23-
24-
const task = await tasks.updateTask(body);
25-
25+
delete body.dependsOn;
26+
const { taskId, taskDetails } = await tasks.updateTask(body);
27+
const data = {
28+
taskId,
29+
dependsOn,
30+
};
31+
const taskDependency = dependsOn && (await dependencyModel.addDependency(data));
2632
return res.json({
2733
message: "Task created successfully!",
28-
task: task.taskDetails,
29-
id: task.taskId,
34+
task: {
35+
...taskDetails,
36+
...(taskDependency && { dependsOn: taskDependency }),
37+
id: taskId,
38+
},
3039
});
3140
} catch (err) {
3241
logger.error(`Error while creating new task: ${err}`);

models/tasks.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const firestore = require("../utils/firestore");
22
const tasksModel = firestore.collection("tasks");
33
const ItemModel = firestore.collection("itemTags");
4+
const dependencyModel = firestore.collection("taskDependencies");
45
const userUtils = require("../utils/users");
56
const { fromFirestoreData, toFirestoreData, buildTasks } = require("../utils/tasks");
67
const { TASK_TYPE, TASK_STATUS, TASK_STATUS_OLD } = require("../constants/tasks");
@@ -32,13 +33,34 @@ const updateTask = async (taskData, taskId = null) => {
3233
taskId: taskInfo.id,
3334
taskDetails: await fromFirestoreData(taskData),
3435
};
35-
3636
return result;
3737
} catch (err) {
3838
logger.error("Error in updating task", err);
3939
throw err;
4040
}
4141
};
42+
const addDependency = async (data) => {
43+
try {
44+
const { taskId, dependsOn } = data;
45+
const batch = firestore.batch();
46+
if (dependsOn.length > 500) {
47+
throw new Error("Error cannot add more than 500 taskId");
48+
}
49+
for (const dependsId of dependsOn) {
50+
const taskDependOn = {
51+
taskId,
52+
dependsId,
53+
};
54+
const docid = dependencyModel.doc();
55+
batch.set(docid, taskDependOn);
56+
}
57+
await batch.commit();
58+
return data.dependsOn;
59+
} catch (err) {
60+
logger.error("Error in creating dependency");
61+
throw err;
62+
}
63+
};
4264

4365
/**
4466
* Fetch all tasks
@@ -352,5 +374,6 @@ module.exports = {
352374
fetchSelfTask,
353375
fetchSkillLevelTask,
354376
overdueTasks,
377+
addDependency,
355378
fetchTaskByIssueId,
356379
};

test/integration/tasks.test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ describe("Tasks", function () {
9898
lossRate: { [DINERO]: 1 },
9999
assignee: appOwner.username,
100100
participants: [],
101+
dependsOn: [],
101102
})
102103
.end((err, res) => {
103104
if (err) {
@@ -106,11 +107,12 @@ describe("Tasks", function () {
106107
expect(res).to.have.status(200);
107108
expect(res.body).to.be.a("object");
108109
expect(res.body.message).to.equal("Task created successfully!");
109-
expect(res.body.id).to.be.a("string");
110110
expect(res.body.task).to.be.a("object");
111+
expect(res.body.task.id).to.be.a("string");
111112
expect(res.body.task.createdBy).to.equal(appOwner.username);
112113
expect(res.body.task.assignee).to.equal(appOwner.username);
113114
expect(res.body.task.participants).to.be.a("array");
115+
expect(res.body.task.dependsOn).to.be.a("array");
114116
return done();
115117
});
116118
});

test/unit/models/tasks.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ const { expect } = chai;
1010
const cleanDb = require("../../utils/cleanDb");
1111
const tasksData = require("../../fixtures/tasks/tasks")();
1212
const tasks = require("../../../models/tasks");
13+
const { addDependency } = require("../../../models/tasks");
14+
const firestore = require("../../../utils/firestore");
15+
const dependencyModel = firestore.collection("TaskDependencies");
1316

1417
describe("tasks", function () {
1518
afterEach(async function () {
@@ -40,4 +43,31 @@ describe("tasks", function () {
4043
});
4144
});
4245
});
46+
47+
describe("addDependency", function () {
48+
it("should add dependencies to firestore and return dependsOn array", async function () {
49+
const data = {
50+
taskId: "taskId1",
51+
dependsOn: ["taskId2", "taskId3"],
52+
};
53+
const result = await addDependency(data);
54+
expect(result).to.deep.equal(data.dependsOn);
55+
});
56+
57+
it("should throw an error if there is an error while creating dependencies", async function () {
58+
const data = {
59+
taskId: "taskId1",
60+
dependsOn: ["taskId2", "taskId3"],
61+
};
62+
const expectedError = new Error("test error");
63+
dependencyModel.doc = () => {
64+
throw expectedError;
65+
};
66+
try {
67+
await addDependency(data);
68+
} catch (err) {
69+
expect(err).to.deep.equal(expectedError);
70+
}
71+
});
72+
});
4373
});

0 commit comments

Comments
 (0)