1
1
import _ from 'lodash' ;
2
2
import moment from 'moment' ;
3
3
import models from '../models' ;
4
+ import { STATUS_HISTORY_REFERENCES } from '../constants' ;
4
5
/* eslint-disable valid-jsdoc */
5
6
6
7
/**
7
8
* Populate and map milestone model with statusHistory
8
9
* 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
+ *
10
13
* @returns {Promise } promise
11
14
*/
12
- const mapWithStatusHistory = async ( milestone ) => {
15
+ const populateWithStatusHistory = async ( milestone ) => {
13
16
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
+ } ) ;
44
30
}
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 } } ) ;
45
41
} ;
46
42
47
43
/**
@@ -127,19 +123,19 @@ module.exports = (sequelize, DataTypes) => {
127
123
} ,
128
124
hooks : {
129
125
afterCreate : ( milestone , options ) => models . StatusHistory . create ( {
130
- reference : 'milestone' ,
126
+ reference : STATUS_HISTORY_REFERENCES . MILESTONE ,
131
127
referenceId : milestone . id ,
132
128
status : milestone . status ,
133
129
comment : null ,
134
130
createdBy : milestone . createdBy ,
135
131
updatedBy : milestone . updatedBy ,
136
132
} , {
137
133
transaction : options . transaction ,
138
- } ) . then ( ( ) => mapWithStatusHistory ( milestone ) ) ,
134
+ } ) . then ( ( ) => populateWithStatusHistory ( milestone ) ) ,
139
135
140
136
afterBulkCreate : ( milestones , options ) => {
141
137
const listStatusHistory = milestones . map ( ( { dataValues } ) => ( {
142
- reference : 'milestone' ,
138
+ reference : STATUS_HISTORY_REFERENCES . MILESTONE ,
143
139
referenceId : dataValues . id ,
144
140
status : dataValues . status ,
145
141
comment : null ,
@@ -149,28 +145,28 @@ module.exports = (sequelize, DataTypes) => {
149
145
150
146
return models . StatusHistory . bulkCreate ( listStatusHistory , {
151
147
transaction : options . transaction ,
152
- } ) . then ( ( ) => mapWithStatusHistory ( milestones ) ) ;
148
+ } ) . then ( ( ) => populateWithStatusHistory ( milestones ) ) ;
153
149
} ,
154
150
155
151
afterUpdate : ( milestone , options ) => {
156
152
if ( milestone . changed ( ) . includes ( 'status' ) ) {
157
153
return models . StatusHistory . create ( {
158
- reference : 'milestone' ,
154
+ reference : STATUS_HISTORY_REFERENCES . MILESTONE ,
159
155
referenceId : milestone . id ,
160
156
status : milestone . status ,
161
157
comment : options . comment || null ,
162
158
createdBy : milestone . createdBy ,
163
159
updatedBy : milestone . updatedBy ,
164
160
} , {
165
161
transaction : options . transaction ,
166
- } ) . then ( ( ) => mapWithStatusHistory ( milestone ) ) ;
162
+ } ) . then ( ( ) => populateWithStatusHistory ( milestone ) ) ;
167
163
}
168
- return mapWithStatusHistory ( milestone ) ;
164
+ return populateWithStatusHistory ( milestone ) ;
169
165
} ,
170
166
171
167
afterFind : ( milestone ) => {
172
168
if ( ! milestone ) return Promise . resolve ( ) ;
173
- return mapWithStatusHistory ( milestone ) ;
169
+ return populateWithStatusHistory ( milestone ) ;
174
170
} ,
175
171
} ,
176
172
} ) ;
0 commit comments