11import _ from 'lodash' ;
22import moment from 'moment' ;
33import 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 } ) ;
0 commit comments