From 3b9f2ca7c2fffa230bb0c6d4254a88deb9fbb023 Mon Sep 17 00:00:00 2001 From: Justin Reynolds Date: Thu, 5 Sep 2019 12:29:45 -0500 Subject: [PATCH] Fixes #2596 incorrect date types for created & updated --- models/accountSettings.js | 2 ++ models/actions.js | 10 ++++++ models/activities.js | 6 ++++ models/announcements.js | 2 ++ models/boards.js | 2 ++ models/cardComments.js | 2 ++ models/cards.js | 2 ++ models/checklistItems.js | 2 ++ models/checklists.js | 2 ++ models/customFields.js | 2 ++ models/integrations.js | 2 ++ models/invitationCodes.js | 2 ++ models/lists.js | 2 ++ models/org.js | 2 ++ models/orgUser.js | 2 ++ models/rules.js | 2 ++ models/settings.js | 2 ++ models/swimlanes.js | 2 ++ models/triggers.js | 10 ++++++ models/unsavedEdits.js | 2 ++ models/users.js | 2 ++ server/migrations.js | 74 ++++++++++++++++++++++----------------- 22 files changed, 103 insertions(+), 33 deletions(-) diff --git a/models/accountSettings.js b/models/accountSettings.js index ed1087cad..f61614b8c 100644 --- a/models/accountSettings.js +++ b/models/accountSettings.js @@ -20,6 +20,8 @@ AccountSettings.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/actions.js b/models/actions.js index e9fa91142..8995d1015 100644 --- a/models/actions.js +++ b/models/actions.js @@ -14,6 +14,16 @@ Actions.allow({ }, }); +Actions.before.insert((userId, doc) => { + doc.createdAt = new Date(); + doc.modifiedAt = doc.createdAt; +}); + +Actions.before.update((userId, doc, fieldNames, modifier) => { + modifier.$set = modifier.$set || {}; + modifier.$set.modifiedAt = new Date(); +}); + Actions.helpers({ description() { return this.desc; diff --git a/models/activities.js b/models/activities.js index 3ecd5c8c8..8f7e12852 100644 --- a/models/activities.js +++ b/models/activities.js @@ -62,8 +62,14 @@ Activities.helpers({ //}, }); +Activities.before.update((userId, doc, fieldNames, modifier) => { + modifier.$set = modifier.$set || {}; + modifier.$set.modifiedAt = new Date(); +}); + Activities.before.insert((userId, doc) => { doc.createdAt = new Date(); + doc.modifiedAt = doc.createdAt; }); Activities.after.insert((userId, doc) => { diff --git a/models/announcements.js b/models/announcements.js index c08710b88..7fdf8d8bd 100644 --- a/models/announcements.js +++ b/models/announcements.js @@ -25,6 +25,8 @@ Announcements.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/boards.js b/models/boards.js index b5f8b01b9..af7685ae9 100644 --- a/models/boards.js +++ b/models/boards.js @@ -55,6 +55,8 @@ Boards.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/cardComments.js b/models/cardComments.js index 407235827..39477e14a 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -34,6 +34,8 @@ CardComments.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/cards.js b/models/cards.js index d92d003c8..1414f6d74 100644 --- a/models/cards.js +++ b/models/cards.js @@ -107,6 +107,8 @@ Cards.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/checklistItems.js b/models/checklistItems.js index e6451fbfb..7f3ab0953 100644 --- a/models/checklistItems.js +++ b/models/checklistItems.js @@ -44,6 +44,8 @@ ChecklistItems.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/checklists.js b/models/checklists.js index f139192e9..7ad9cae55 100644 --- a/models/checklists.js +++ b/models/checklists.js @@ -35,6 +35,8 @@ Checklists.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/customFields.js b/models/customFields.js index 6b5697c1e..cc798b168 100644 --- a/models/customFields.js +++ b/models/customFields.js @@ -78,6 +78,8 @@ CustomFields.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/integrations.js b/models/integrations.js index 0b2e08c66..41334744f 100644 --- a/models/integrations.js +++ b/models/integrations.js @@ -63,6 +63,8 @@ Integrations.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/invitationCodes.js b/models/invitationCodes.js index 75db57082..abb30f328 100644 --- a/models/invitationCodes.js +++ b/models/invitationCodes.js @@ -18,6 +18,8 @@ InvitationCodes.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/lists.js b/models/lists.js index e57849d77..9136c337c 100644 --- a/models/lists.js +++ b/models/lists.js @@ -45,6 +45,8 @@ Lists.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/org.js b/models/org.js index ce6f377eb..a24d829db 100644 --- a/models/org.js +++ b/models/org.js @@ -98,6 +98,8 @@ Org.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/orgUser.js b/models/orgUser.js index b671cb41a..f310fa9ce 100644 --- a/models/orgUser.js +++ b/models/orgUser.js @@ -49,6 +49,8 @@ OrgUser.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/rules.js b/models/rules.js index 202071fc1..2e6729ccf 100644 --- a/models/rules.js +++ b/models/rules.js @@ -27,6 +27,8 @@ Rules.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/settings.js b/models/settings.js index 4a0359d54..8eb02c5b1 100644 --- a/models/settings.js +++ b/models/settings.js @@ -60,6 +60,8 @@ Settings.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/swimlanes.js b/models/swimlanes.js index 769aaed3d..46e410da2 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -38,6 +38,8 @@ Swimlanes.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/triggers.js b/models/triggers.js index 45f5e6fc2..a95b1235b 100644 --- a/models/triggers.js +++ b/models/triggers.js @@ -12,6 +12,16 @@ Triggers.mutations({ }, }); +Triggers.before.insert((userId, doc) => { + doc.createdAt = new Date(); + doc.updatedAt = doc.createdAt; +}); + +Triggers.before.update((userId, doc, fieldNames, modifier) => { + modifier.$set = modifier.$set || {}; + modifier.$set.updatedAt = new Date(); +}); + Triggers.allow({ insert(userId, doc) { return allowIsBoardAdmin(userId, Boards.findOne(doc.boardId)); diff --git a/models/unsavedEdits.js b/models/unsavedEdits.js index 89418bfbb..813315982 100644 --- a/models/unsavedEdits.js +++ b/models/unsavedEdits.js @@ -29,6 +29,8 @@ UnsavedEditCollection.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/models/users.js b/models/users.js index 55d85e075..ee53c7ab7 100644 --- a/models/users.js +++ b/models/users.js @@ -54,6 +54,8 @@ Users.attachSchema( autoValue() { if (this.isInsert) { return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; } else { this.unset(); } diff --git a/server/migrations.js b/server/migrations.js index f3776edd5..836220f39 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -684,39 +684,6 @@ Migrations.add('mutate-boardIds-in-customfields', () => { }); }); -const firstBatchOfDbsToAddCreatedAndUpdated = [ - AccountSettings, - Actions, - Activities, - Announcements, - Boards, - CardComments, - Cards, - ChecklistItems, - Checklists, - CustomFields, - Integrations, - InvitationCodes, - Lists, - Rules, - Settings, - Swimlanes, - Triggers, - UnsavedEdits, -]; - -firstBatchOfDbsToAddCreatedAndUpdated.forEach(db => { - db.before.insert((userId, doc) => { - doc.createdAt = Date.now(); - doc.updatedAt = doc.createdAt; - }); - - db.before.update((userId, doc, fieldNames, modifier) => { - modifier.$set = modifier.$set || {}; - modifier.$set.updatedAt = new Date(); - }); -}); - const modifiedAtTables = [ AccountSettings, Actions, @@ -769,3 +736,44 @@ Migrations.add('add-missing-created-and-modified', () => { console.error(e); }); }); + +Migrations.add('fix-incorrect-dates', () => { + const tables = [ + AccountSettings, + Actions, + Activities, + Announcements, + Boards, + CardComments, + Cards, + ChecklistItems, + Checklists, + CustomFields, + Integrations, + InvitationCodes, + Lists, + Rules, + Settings, + Swimlanes, + Triggers, + UnsavedEdits, + ]; + + // Dates were previously created with Date.now() which is a number, not a date + tables.forEach(t => + t + .rawCollection() + .find({ $or: [{ createdAt: { $type: 1 } }, { updatedAt: { $type: 1 } }] }) + .forEach(({ _id, createdAt, updatedAt }) => { + t.rawCollection().update( + { _id }, + { + $set: { + createdAt: new Date(createdAt), + updatedAt: new Date(updatedAt), + }, + }, + ); + }), + ); +});