Skip to content

Commit 93c06df

Browse files
Update migration script to update createdAt and updatedAt only if it exists (#1719)
* feat: avoid update if field already present * test: add test to check if field update is happening again
1 parent a6fefcb commit 93c06df

File tree

2 files changed

+57
-21
lines changed

2 files changed

+57
-21
lines changed

services/tasks.js

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ const updateTaskStatusToDone = async (tasksData) => {
3232

3333
const addTaskCreatedAtAndUpdatedAtFields = async () => {
3434
const operationStats = {
35-
failedTasksIds: [],
36-
totalFailedTasks: 0,
3735
totalTasks: 0,
36+
totalTaskToBeUpdate: 0,
37+
totalTasksUpdated: 0,
38+
totalFailedTasks: 0,
39+
failedTasksIds: [],
3840
};
3941
const updatedTasks = [];
4042
const tasks = await tasksModel.get();
@@ -45,31 +47,39 @@ const addTaskCreatedAtAndUpdatedAtFields = async () => {
4547

4648
operationStats.totalTasks = tasks.size;
4749

48-
tasks.forEach(async (task) => {
50+
tasks.forEach((task) => {
4951
const taskData = task.data();
50-
taskData.createdAt = task.createTime.seconds;
51-
taskData.updatedAt = task.updateTime.seconds;
52-
updatedTasks.push({ id: task.id, data: taskData });
52+
let didAddField = false;
53+
if (!taskData.createdAt) {
54+
taskData.createdAt = task.createTime.seconds;
55+
didAddField = true;
56+
}
57+
if (!taskData.updatedAt) {
58+
taskData.updatedAt = task.updateTime.seconds;
59+
didAddField = true;
60+
}
61+
if (didAddField) {
62+
updatedTasks.push({ id: task.id, data: taskData });
63+
}
5364
});
5465

55-
const multipleTasksUpdateBatch = [];
66+
operationStats.totalTaskToBeUpdate = updatedTasks.length;
67+
5668
const chunkedTasks = chunks(updatedTasks, FIRESTORE_BATCH_OPERATIONS_LIMIT);
5769

58-
chunkedTasks.forEach(async (tasks) => {
70+
chunkedTasks.forEach((tasks) => {
5971
const batch = firestore.batch();
6072
tasks.forEach(({ id, data }) => {
6173
batch.update(tasksModel.doc(id), data);
6274
});
6375
try {
64-
await batch.commit();
65-
multipleTasksUpdateBatch.push(batch);
76+
batch.commit();
77+
operationStats.totalTasksUpdated += tasks.length;
6678
} catch (error) {
6779
operationStats.totalFailedTasks += tasks.length;
6880
tasks.forEach(({ id }) => operationStats.failedTasksIds.push(id));
6981
}
7082
});
71-
72-
await Promise.allSettled(multipleTasksUpdateBatch);
7383
return operationStats;
7484
};
7585

test/integration/tasks.test.js

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,12 +1196,12 @@ describe("Tasks", function () {
11961196
jwt = authService.generateAuthToken({ userId });
11971197
superUserJwt = authService.generateAuthToken({ userId: superUserId });
11981198
// Add the active task
1199-
taskId = (await tasks.updateTask(tasksData[0])).taskId;
1200-
taskId = (await tasks.updateTask(tasksData[1])).taskId;
1201-
taskId = (await tasks.updateTask(tasksData[3])).taskId;
1202-
taskId = (await tasks.updateTask(tasksData[4])).taskId;
1203-
taskId = (await tasks.updateTask(tasksData[5])).taskId;
1204-
taskId = (await tasks.updateTask(tasksData[6])).taskId;
1199+
await tasks.updateTask(tasksData[0]);
1200+
await tasks.updateTask(tasksData[1]);
1201+
await tasks.updateTask(tasksData[3]);
1202+
await tasks.updateTask(tasksData[4]);
1203+
await tasks.updateTask(tasksData[5]);
1204+
await tasks.updateTask(tasksData[6]);
12051205
});
12061206
afterEach(async function () {
12071207
await cleanDb();
@@ -1213,17 +1213,41 @@ describe("Tasks", function () {
12131213

12141214
// TASK createdAt and updatedAt migration script
12151215
it("Should update status createdAt and updatedAt", async function () {
1216+
// Add new tasks with createdAt and updatedAt present
1217+
await tasks.updateTask({ ...tasksData[7], createdAt: null, updatedAt: null });
1218+
await tasks.updateTask({ ...tasksData[8], createdAt: null, updatedAt: null });
1219+
await tasks.updateTask({ ...tasksData[9], updatedAt: null });
1220+
await tasks.updateTask({ ...tasksData[10], createdAt: null });
12161221
const res = await chai.request(app).post("/tasks/migration").set("cookie", `${cookieName}=${superUserJwt}`).send({
12171222
action: "ADD",
12181223
field: "CREATED_AT+UPDATED_AT",
12191224
});
12201225
expect(res).to.have.status(200);
1226+
expect(res.body.totalTasks).to.be.equal(10);
1227+
expect(res.body.totalTaskToBeUpdate).to.be.equal(4);
1228+
expect(res.body.totalTasksUpdated).to.be.equal(4);
12211229
expect(res.body.totalFailedTasks).to.be.equal(0);
1230+
expect(res.body.failedTasksIds).to.deep.equal([]);
1231+
});
1232+
1233+
it("Should update status createdAt and updatedAt, if filed doesn't exists", async function () {
1234+
const res = await chai.request(app).post("/tasks/migration").set("cookie", `${cookieName}=${superUserJwt}`).send({
1235+
action: "ADD",
1236+
field: "CREATED_AT+UPDATED_AT",
1237+
});
1238+
expect(res).to.have.status(200);
12221239
expect(res.body.totalTasks).to.be.equal(6);
1240+
expect(res.body.totalTaskToBeUpdate).to.be.equal(0);
1241+
expect(res.body.totalTasksUpdated).to.be.equal(0);
1242+
expect(res.body.totalFailedTasks).to.be.equal(0);
12231243
expect(res.body.failedTasksIds).to.deep.equal([]);
12241244
});
12251245

12261246
it("should return failed stats if firestore batch operations fail for adding createdAt and updatedAt", async function () {
1247+
await tasks.updateTask({ ...tasksData[7], createdAt: null, updatedAt: null });
1248+
await tasks.updateTask({ ...tasksData[8], createdAt: null, updatedAt: null });
1249+
await tasks.updateTask({ ...tasksData[9], updatedAt: null });
1250+
await tasks.updateTask({ ...tasksData[10], createdAt: null });
12271251
const stub = sinon.stub(firestore, "batch");
12281252
stub.returns({
12291253
update: function () {},
@@ -1236,9 +1260,11 @@ describe("Tasks", function () {
12361260
field: "CREATED_AT+UPDATED_AT",
12371261
});
12381262
expect(res).to.have.status(200);
1239-
expect(res.body.totalFailedTasks).to.be.equal(6);
1240-
expect(res.body.totalTasks).to.be.equal(6);
1241-
expect(res.body.failedTasksIds.length).to.equal(6);
1263+
expect(res.body.totalTasks).to.be.equal(10);
1264+
expect(res.body.totalTaskToBeUpdate).to.be.equal(4);
1265+
expect(res.body.totalTasksUpdated).to.be.equal(0);
1266+
expect(res.body.totalFailedTasks).to.be.equal(4);
1267+
expect(res.body.failedTasksIds.length).to.equal(4);
12421268
});
12431269
});
12441270
});

0 commit comments

Comments
 (0)