1
1
module . exports = sails => {
2
2
const Sequelize = require ( 'sequelize' ) ;
3
3
4
+ // keep a ref to the original sails model loader function
5
+ const originalLoadModels = sails . modules . loadModels ;
6
+
4
7
return {
5
8
defaults : {
6
9
__configKey__ : {
@@ -14,11 +17,52 @@ module.exports = sails => {
14
17
if ( typeof cls === 'string' && cls !== '' ) {
15
18
Sequelize . useCLS ( require ( 'continuation-local-storage' ) . createNamespace ( cls ) ) ;
16
19
}
20
+
21
+ if ( sails . config [ this . configKey ] . exposeToGlobal ) {
22
+ sails . log . verbose ( 'Exposing Sequelize globally' ) ;
23
+ global [ 'Sequelize' ] = Sequelize ;
24
+ }
25
+
26
+ // Override sails internal loadModels function
27
+ // needs to be done in configure()
28
+ sails . modules . loadModels = function load ( cb ) {
29
+
30
+ // call the original sails loadModels function so we have access to it's returned models
31
+ originalLoadModels ( ( err , modelDefs ) => {
32
+ // modelDefs = all the model files from models directory - sails does this
33
+ // now modify / return own models for sails to boot
34
+ const models = { } ;
35
+
36
+ sails . log . verbose ( 'Detecting Waterline models' ) ;
37
+ Object . entries ( modelDefs ) . forEach ( ( entry ) => {
38
+ const [ key , model ] = entry ;
39
+
40
+ if ( typeof ( model . options ) === 'undefined' || typeof ( model . options . tableName ) === 'undefined' ) {
41
+ sails . log . verbose ( 'Loading Waterline model \'' + model . globalId + '\'' ) ;
42
+ models [ key ] = model ;
43
+ }
44
+ } ) ;
45
+
46
+ // return the models that the sails orm hook will bootstrap
47
+ cb ( err , models ) ;
48
+ } ) ;
49
+ } ;
17
50
} ,
18
51
initialize ( next ) {
19
- this . initAdapters ( ) ;
20
- this . initModels ( ) ;
21
- this . reload ( next ) ;
52
+
53
+ if ( sails . config . hooks . orm === false ) {
54
+ this . initAdapters ( ) ;
55
+ this . initModels ( ) ;
56
+ this . reload ( next ) ;
57
+ } else {
58
+ sails . on ( 'hook:orm:loaded' , ( ) => {
59
+
60
+ this . initAdapters ( ) ;
61
+ this . initModels ( ) ;
62
+ this . reload ( next ) ;
63
+
64
+ } ) ;
65
+ }
22
66
} ,
23
67
24
68
reload ( next ) {
@@ -28,12 +72,11 @@ module.exports = sails => {
28
72
connections = this . initConnections ( ) ;
29
73
30
74
if ( sails . config [ this . configKey ] . exposeToGlobal ) {
31
- sails . log . verbose ( 'Exposing Sequelize and Sequelize connections globally' ) ;
32
- global [ 'Sequelize' ] = Sequelize ;
75
+ sails . log . verbose ( 'Exposing Sequelize connections globally' ) ;
33
76
global [ 'SequelizeConnections' ] = connections ;
34
77
}
35
78
36
- return sails . modules . loadModels ( ( err , models ) => {
79
+ return originalLoadModels ( ( err , models ) => {
37
80
38
81
if ( err ) {
39
82
return next ( err ) ;
@@ -118,7 +161,7 @@ module.exports = sails => {
118
161
continue ;
119
162
}
120
163
121
- sails . log . verbose ( 'Loading model \'' + modelDef . globalId + '\'' ) ;
164
+ sails . log . verbose ( 'Loading Sequelize model \'' + modelDef . globalId + '\'' ) ;
122
165
connectionName = modelDef . connection || modelDef . datastore || defaultConnection ;
123
166
modelClass = connections [ connectionName ] . define ( modelDef . globalId , modelDef . attributes , modelDef . options ) ;
124
167
@@ -172,7 +215,7 @@ module.exports = sails => {
172
215
} ,
173
216
174
217
migrateSchema ( next , connections , models ) {
175
- let connectionDescription , connectionName , migrate , forceSync ;
218
+ let connectionDescription , connectionName , migrate , forceSyncFlag , alterFlag ;
176
219
const syncTasks = [ ] ;
177
220
178
221
// Try to read settings from old Sails then from the new.
@@ -186,7 +229,19 @@ module.exports = sails => {
186
229
if ( migrate === 'safe' ) {
187
230
return next ( ) ;
188
231
} else {
189
- forceSync = migrate === 'drop' ;
232
+ switch ( migrate ) {
233
+ case 'drop' :
234
+ forceSyncFlag = true ;
235
+ alterFlag = false ;
236
+ break ;
237
+ case 'alter' :
238
+ forceSyncFlag = false ;
239
+ alterFlag = true ;
240
+ break ;
241
+ default :
242
+ forceSyncFlag = false ;
243
+ alterFlag = false ;
244
+ }
190
245
191
246
for ( connectionName in datastores ) {
192
247
connectionDescription = datastores [ connectionName ] ;
@@ -213,11 +268,11 @@ module.exports = sails => {
213
268
}
214
269
}
215
270
216
- return connections [ connectionName ] . sync ( { force : forceSync } ) ;
271
+ return connections [ connectionName ] . sync ( { force : forceSyncFlag , alter : alterFlag } ) ;
217
272
} ) ) ;
218
273
219
274
} else {
220
- syncTasks . push ( connections [ connectionName ] . sync ( { force : forceSync } ) ) ;
275
+ syncTasks . push ( connections [ connectionName ] . sync ( { force : forceSyncFlag , alter : alterFlag } ) ) ;
221
276
}
222
277
}
223
278
0 commit comments