Skip to content

Commit f554bbe

Browse files
committed
improve milestone hooks and change referenceId in milestone to BIGINT
1 parent be9dd0e commit f554bbe

File tree

13 files changed

+100
-183
lines changed

13 files changed

+100
-183
lines changed

src/models/milestone.js

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,42 @@ import models from '../models';
55

66
/**
77
* Populate and map milestone model with statusHistory
8+
* NOTE that this function mutates milestone
89
* @param {Object} milestone the milestone
910
* @returns {Promise} promise
1011
*/
1112
const mapWithStatusHistory = async (milestone) => {
12-
try {
13-
const statusHistory = await models.StatusHistory.findAll({
14-
where: {
15-
referenceId: milestone.id.toString(),
16-
reference: 'milestone',
17-
},
18-
order: [['createdAt', 'desc']],
19-
raw: true,
20-
});
21-
return _.merge(milestone, { dataValues: { statusHistory } });
22-
} catch (err) {
23-
return _.merge(milestone, { dataValues: { statusHistory: [] } });
13+
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+
}
2444
}
2545
};
2646

@@ -117,6 +137,21 @@ module.exports = (sequelize, DataTypes) => {
117137
transaction: options.transaction,
118138
}).then(() => mapWithStatusHistory(milestone)),
119139

140+
afterBulkCreate: (milestones, options) => {
141+
const listStatusHistory = milestones.map(({ dataValues }) => ({
142+
reference: 'milestone',
143+
referenceId: dataValues.id,
144+
status: dataValues.status,
145+
comment: null,
146+
createdBy: dataValues.createdBy,
147+
updatedBy: dataValues.updatedBy,
148+
}));
149+
150+
return models.StatusHistory.bulkCreate(listStatusHistory, {
151+
transaction: options.transaction,
152+
}).then(() => mapWithStatusHistory(milestones));
153+
},
154+
120155
afterUpdate: (milestone, options) => {
121156
if (milestone.changed().includes('status')) {
122157
return models.StatusHistory.create({
@@ -135,10 +170,6 @@ module.exports = (sequelize, DataTypes) => {
135170

136171
afterFind: (milestone) => {
137172
if (!milestone) return Promise.resolve();
138-
139-
if (Array.isArray(milestone)) {
140-
return Promise.all(milestone.map(mapWithStatusHistory));
141-
}
142173
return mapWithStatusHistory(milestone);
143174
},
144175
},

src/models/statusHistory.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module.exports = function defineStatusHistory(sequelize, DataTypes) {
77
const StatusHistory = sequelize.define('StatusHistory', {
88
id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true },
99
reference: { type: DataTypes.STRING, allowNull: false },
10-
referenceId: { type: DataTypes.STRING, allowNull: false },
10+
referenceId: { type: DataTypes.BIGINT, allowNull: false },
1111
status: {
1212
type: DataTypes.STRING,
1313
allowNull: false,

src/routes/milestones/create.spec.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ describe('CREATE milestone', () => {
142142
// Create milestones
143143
models.Milestone.bulkCreate([
144144
{
145+
id: 11,
145146
timelineId: 1,
146147
name: 'milestone 1',
147148
duration: 2,
@@ -164,6 +165,7 @@ describe('CREATE milestone', () => {
164165
updatedBy: 2,
165166
},
166167
{
168+
id: 12,
167169
timelineId: 1,
168170
name: 'milestone 2',
169171
duration: 3,
@@ -179,6 +181,7 @@ describe('CREATE milestone', () => {
179181
updatedBy: 3,
180182
},
181183
{
184+
id: 13,
182185
timelineId: 1,
183186
name: 'milestone 3',
184187
duration: 4,
@@ -526,9 +529,10 @@ describe('CREATE milestone', () => {
526529
// validate statusHistory
527530
should.exist(resJson.statusHistory);
528531
resJson.statusHistory.should.be.an('array');
532+
resJson.statusHistory.length.should.be.eql(1);
529533
resJson.statusHistory.forEach((statusHistory) => {
530534
statusHistory.reference.should.be.eql('milestone');
531-
statusHistory.referenceId.should.be.eql(`${resJson.id}`);
535+
statusHistory.referenceId.should.be.eql(resJson.id);
532536
});
533537

534538
// eslint-disable-next-line no-unused-expressions
@@ -538,11 +542,11 @@ describe('CREATE milestone', () => {
538542
models.Milestone.findAll({ where: { timelineId: 1 } })
539543
.then((milestones) => {
540544
_.each(milestones, (milestone) => {
541-
if (milestone.id === 1) {
545+
if (milestone.id === 11) {
542546
milestone.order.should.be.eql(1);
543-
} else if (milestone.id === 2) {
547+
} else if (milestone.id === 12) {
544548
milestone.order.should.be.eql(2 + 1);
545-
} else if (milestone.id === 3) {
549+
} else if (milestone.id === 13) {
546550
milestone.order.should.be.eql(3 + 1);
547551
}
548552
});

src/routes/milestones/delete.spec.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ describe('DELETE milestone', () => {
160160
// Create milestones
161161
models.Milestone.bulkCreate([
162162
{
163+
id: 1,
163164
timelineId: 1,
164165
name: 'milestone 1',
165166
duration: 2,
@@ -182,6 +183,7 @@ describe('DELETE milestone', () => {
182183
updatedBy: 2,
183184
},
184185
{
186+
id: 2,
185187
timelineId: 1,
186188
name: 'milestone 2',
187189
duration: 3,
@@ -197,6 +199,7 @@ describe('DELETE milestone', () => {
197199
updatedBy: 3,
198200
},
199201
{
202+
id: 3,
200203
timelineId: 1,
201204
name: 'milestone 3',
202205
duration: 4,

src/routes/milestones/get.spec.js

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -190,30 +190,7 @@ describe('GET milestone', () => {
190190
deletedAt: '2018-05-04T00:00:00.000Z',
191191
},
192192
])
193-
.then(() =>
194-
models.StatusHistory.bulkCreate([
195-
{
196-
reference: 'milestone',
197-
referenceId: '1',
198-
status: 'active',
199-
comment: 'comment',
200-
createdBy: 1,
201-
createdAt: '2018-05-15T00:00:00Z',
202-
updatedBy: 1,
203-
updatedAt: '2018-05-15T00:00:00Z',
204-
},
205-
{
206-
reference: 'milestone',
207-
referenceId: '1',
208-
status: 'active',
209-
comment: 'comment',
210-
createdBy: 1,
211-
createdAt: '2018-05-15T00:00:00Z',
212-
updatedBy: 1,
213-
updatedAt: '2018-05-15T00:00:00Z',
214-
},
215-
])
216-
.then(() => done()));
193+
.then(() => done());
217194
});
218195
});
219196
});
@@ -330,9 +307,10 @@ describe('GET milestone', () => {
330307
// validate statusHistory
331308
should.exist(resJson.statusHistory);
332309
resJson.statusHistory.should.be.an('array');
310+
resJson.statusHistory.length.should.be.eql(1);
333311
resJson.statusHistory.forEach((statusHistory) => {
334312
statusHistory.reference.should.be.eql('milestone');
335-
statusHistory.referenceId.should.be.eql(`${resJson.id}`);
313+
statusHistory.referenceId.should.be.eql(resJson.id);
336314
});
337315

338316
done();

src/routes/milestones/list.spec.js

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const milestones = [
5151
detail2: [1, 2, 3],
5252
},
5353
order: 1,
54+
hidden: false,
5455
plannedText: 'plannedText 1',
5556
activeText: 'activeText 1',
5657
completedText: 'completedText 1',
@@ -59,16 +60,6 @@ const milestones = [
5960
updatedBy: 2,
6061
createdAt: '2018-05-11T00:00:00.000Z',
6162
updatedAt: '2018-05-11T00:00:00.000Z',
62-
statusHistory: [{
63-
reference: 'milestone',
64-
referenceId: '1',
65-
status: 'active',
66-
comment: 'comment',
67-
createdBy: 1,
68-
createdAt: '2018-05-15T00:00:00Z',
69-
updatedBy: 1,
70-
updatedAt: '2018-05-15T00:00:00Z',
71-
}],
7263
},
7364
{
7465
id: 2,
@@ -79,6 +70,7 @@ const milestones = [
7970
status: 'open',
8071
type: 'type2',
8172
order: 2,
73+
hidden: false,
8274
plannedText: 'plannedText 2',
8375
activeText: 'activeText 2',
8476
completedText: 'completedText 2',
@@ -87,16 +79,6 @@ const milestones = [
8779
updatedBy: 3,
8880
createdAt: '2018-05-11T00:00:00.000Z',
8981
updatedAt: '2018-05-11T00:00:00.000Z',
90-
statusHistory: [{
91-
reference: 'milestone',
92-
referenceId: '2',
93-
status: 'active',
94-
comment: 'comment',
95-
createdBy: 1,
96-
createdAt: '2018-05-15T00:00:00Z',
97-
updatedBy: 1,
98-
updatedAt: '2018-05-15T00:00:00Z',
99-
}],
10082
},
10183
];
10284

@@ -186,13 +168,10 @@ describe('LIST timelines', () => {
186168
.then(() =>
187169
// Create timelines and milestones
188170
models.Timeline.bulkCreate(timelines)
189-
.then(() => {
190-
const mappedMilstones = milestones.map(milestone => _.omit(milestone, ['statusHistory']));
191-
return models.Milestone.bulkCreate(mappedMilstones);
192-
}))
193-
.then(() => {
171+
.then(() => models.Milestone.bulkCreate(milestones)))
172+
.then((mappedMilestones) => {
194173
// Index to ES
195-
timelines[0].milestones = milestones;
174+
timelines[0].milestones = mappedMilestones.map(({ dataValues }) => dataValues);
196175
timelines[0].projectId = 1;
197176
return server.services.es.index({
198177
index: ES_TIMELINE_INDEX,
@@ -268,12 +247,15 @@ describe('LIST timelines', () => {
268247

269248
resJson.forEach((milestone, index) => {
270249
milestone.statusHistory.should.be.an('array');
250+
milestone.statusHistory.length.should.be.eql(1);
271251
milestone.statusHistory.forEach((statusHistory) => {
272252
statusHistory.reference.should.be.eql('milestone');
273-
statusHistory.referenceId.should.be.eql(`${milestone.id}`);
253+
statusHistory.referenceId.should.be.eql(milestone.id);
274254
});
275255

276-
milestone.should.be.eql(milestones[index]);
256+
const m = _.omit(milestone, ['statusHistory']);
257+
258+
m.should.be.eql(milestones[index]);
277259
});
278260

279261
done();
@@ -349,8 +331,10 @@ describe('LIST timelines', () => {
349331
const resJson = res.body.result.content;
350332
resJson.should.have.length(2);
351333

352-
resJson[0].should.be.eql(milestones[1]);
353-
resJson[1].should.be.eql(milestones[0]);
334+
const m1 = _.omit(resJson[0], ['statusHistory']);
335+
const m2 = _.omit(resJson[1], ['statusHistory']);
336+
m1.should.be.eql(milestones[1]);
337+
m2.should.be.eql(milestones[0]);
354338

355339
done();
356340
});

src/routes/milestones/update.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ module.exports = [
170170
return Promise.reject(apiErr);
171171
}
172172
const statusHistory = await models.StatusHistory.findAll({
173-
where: { referenceId: milestone.id.toString() },
173+
where: { referenceId: milestone.id },
174174
order: [['createdAt', 'desc']],
175175
attributes: ['status'],
176176
limit: 2,

0 commit comments

Comments
 (0)