Skip to content

Commit 93a1ff2

Browse files
committed
support transaction for creating timeline so filing creating milestones or statusHistory reverts timeline too
small code improvements
1 parent dcfe7da commit 93a1ff2

File tree

3 files changed

+43
-43
lines changed

3 files changed

+43
-43
lines changed

src/constants.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ export const TIMELINE_REFERENCES = {
165165
PRODUCT: 'product',
166166
};
167167

168+
export const STATUS_HISTORY_REFERENCES = {
169+
MILESTONE: 'milestone',
170+
};
171+
168172
export const MILESTONE_TEMPLATE_REFERENCES = {
169173
PRODUCT_TEMPLATE: 'productTemplate',
170174
};

src/models/milestone.js

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,43 @@
11
import _ from 'lodash';
22
import moment from 'moment';
33
import models from '../models';
4+
import { STATUS_HISTORY_REFERENCES } from '../constants';
45
/* eslint-disable valid-jsdoc */
56

67
/**
78
* Populate and map milestone model with statusHistory
89
* NOTE that this function mutates milestone
9-
* @param {Object} milestone the milestone
10+
*
11+
* @param {Array|Object} milestone one milestone or list of milestones
12+
*
1013
* @returns {Promise} promise
1114
*/
12-
const mapWithStatusHistory = async (milestone) => {
15+
const populateWithStatusHistory = async (milestone) => {
1316
if (Array.isArray(milestone)) {
14-
try {
15-
const allStatusHistory = await models.StatusHistory.findAll({
16-
where: {
17-
referenceId: { $in: milestone.map(m => m.dataValues.id) },
18-
reference: 'milestone',
19-
},
20-
order: [['createdAt', 'desc']],
21-
raw: true,
22-
});
23-
return milestone.map((m, index) => {
24-
const statusHistory = allStatusHistory.filter(s => s.referenceId === m.dataValues.id);
25-
return _.merge(milestone[index], { dataValues: { statusHistory } });
26-
});
27-
} catch (err) {
28-
return milestone.map((m, index) => _.merge(milestone[index], { dataValues: { statusHistory: [] } }));
29-
}
30-
} else {
31-
try {
32-
const statusHistory = await models.StatusHistory.findAll({
33-
where: {
34-
referenceId: milestone.dataValues.id,
35-
reference: 'milestone',
36-
},
37-
order: [['createdAt', 'desc']],
38-
raw: true,
39-
});
40-
return _.merge(milestone, { dataValues: { statusHistory } });
41-
} catch (err) {
42-
return _.merge(milestone, { dataValues: { statusHistory: [] } });
43-
}
17+
const allStatusHistory = await models.StatusHistory.findAll({
18+
where: {
19+
referenceId: { $in: milestone.map(m => m.dataValues.id) },
20+
reference: 'milestone',
21+
},
22+
order: [['createdAt', 'desc']],
23+
raw: true,
24+
});
25+
26+
return milestone.map((m, index) => {
27+
const statusHistory = allStatusHistory.filter(s => s.referenceId === m.dataValues.id);
28+
return _.merge(milestone[index], { dataValues: { statusHistory } });
29+
});
4430
}
31+
32+
const statusHistory = await models.StatusHistory.findAll({
33+
where: {
34+
referenceId: milestone.dataValues.id,
35+
reference: 'milestone',
36+
},
37+
order: [['createdAt', 'desc']],
38+
raw: true,
39+
});
40+
return _.merge(milestone, { dataValues: { statusHistory } });
4541
};
4642

4743
/**
@@ -127,19 +123,19 @@ module.exports = (sequelize, DataTypes) => {
127123
},
128124
hooks: {
129125
afterCreate: (milestone, options) => models.StatusHistory.create({
130-
reference: 'milestone',
126+
reference: STATUS_HISTORY_REFERENCES.MILESTONE,
131127
referenceId: milestone.id,
132128
status: milestone.status,
133129
comment: null,
134130
createdBy: milestone.createdBy,
135131
updatedBy: milestone.updatedBy,
136132
}, {
137133
transaction: options.transaction,
138-
}).then(() => mapWithStatusHistory(milestone)),
134+
}).then(() => populateWithStatusHistory(milestone)),
139135

140136
afterBulkCreate: (milestones, options) => {
141137
const listStatusHistory = milestones.map(({ dataValues }) => ({
142-
reference: 'milestone',
138+
reference: STATUS_HISTORY_REFERENCES.MILESTONE,
143139
referenceId: dataValues.id,
144140
status: dataValues.status,
145141
comment: null,
@@ -149,28 +145,28 @@ module.exports = (sequelize, DataTypes) => {
149145

150146
return models.StatusHistory.bulkCreate(listStatusHistory, {
151147
transaction: options.transaction,
152-
}).then(() => mapWithStatusHistory(milestones));
148+
}).then(() => populateWithStatusHistory(milestones));
153149
},
154150

155151
afterUpdate: (milestone, options) => {
156152
if (milestone.changed().includes('status')) {
157153
return models.StatusHistory.create({
158-
reference: 'milestone',
154+
reference: STATUS_HISTORY_REFERENCES.MILESTONE,
159155
referenceId: milestone.id,
160156
status: milestone.status,
161157
comment: options.comment || null,
162158
createdBy: milestone.createdBy,
163159
updatedBy: milestone.updatedBy,
164160
}, {
165161
transaction: options.transaction,
166-
}).then(() => mapWithStatusHistory(milestone));
162+
}).then(() => populateWithStatusHistory(milestone));
167163
}
168-
return mapWithStatusHistory(milestone);
164+
return populateWithStatusHistory(milestone);
169165
},
170166

171167
afterFind: (milestone) => {
172168
if (!milestone) return Promise.resolve();
173-
return mapWithStatusHistory(milestone);
169+
return populateWithStatusHistory(milestone);
174170
},
175171
},
176172
});

src/routes/timelines/create.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ module.exports = [
5151

5252
let result;
5353
// Save to DB
54-
models.sequelize.transaction(() => {
54+
models.sequelize.transaction((tx) => {
5555
req.log.debug('Started transaction');
56-
return models.Timeline.create(entity)
56+
return models.Timeline.create(entity, { transaction: tx })
5757
.then((createdEntity) => {
5858
// Omit deletedAt, deletedBy
5959
result = _.omit(createdEntity.toJSON(), 'deletedAt', 'deletedBy');
@@ -97,7 +97,7 @@ module.exports = [
9797
}
9898
return milestone;
9999
});
100-
return models.Milestone.bulkCreate(milestones, { returning: true })
100+
return models.Milestone.bulkCreate(milestones, { returning: true, transaction: tx })
101101
.then((createdMilestones) => {
102102
req.log.debug('Milestones created for timeline with template id %d', templateId);
103103
result.milestones = _.map(createdMilestones, cm => _.omit(cm.toJSON(), 'deletedAt', 'deletedBy'));

0 commit comments

Comments
 (0)