Skip to content

Commit 1a3ba73

Browse files
authored
Merge pull request #2750 from zeripath/issue-2691
chore(server): Update to sequelize 4
2 parents 9524734 + 02f0385 commit 1a3ba73

File tree

5 files changed

+135
-137
lines changed

5 files changed

+135
-137
lines changed

Diff for: templates/app/_package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
"mongoose": "^5.1.5",
3434
"bluebird": "^3.3.3",
3535
"connect-mongo": "^2.0.1",<% } %><% if(filters.sequelize) { %>
36-
"sequelize": "^3.23.6",
37-
"sqlite3": "~4.0.1",
38-
"connect-session-sequelize": "^4.1.0",<% } %><% if(filters.auth) { %>
36+
"sequelize": "^4.38.0",
37+
"sqlite3": "~4.0.2",
38+
"connect-session-sequelize": "^5.2.2",<% } %><% if(filters.auth) { %>
3939
"jsonwebtoken": "^8.3.0",
4040
"express-jwt": "^5.0.0",
4141
"passport": "~0.4.0",

Diff for: templates/app/server/api/user(auth)/user.model(sequelizeModels).js

+129-134
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var validatePresenceOf = function(value) {
66
};
77

88
export default function(sequelize, DataTypes) {
9-
return sequelize.define('User', {
9+
const User = sequelize.define('User', {
1010
_id: {
1111
type: DataTypes.INTEGER,
1212
allowNull: false,
@@ -65,158 +65,153 @@ export default function(sequelize, DataTypes) {
6565
* Pre-save hooks
6666
*/
6767
hooks: {
68-
beforeBulkCreate(users, fields, fn) {
69-
var totalUpdated = 0;
70-
users.forEach(user => {
71-
user.updatePassword(err => {
72-
if(err) {
73-
return fn(err);
74-
}
75-
totalUpdated += 1;
76-
if(totalUpdated === users.length) {
77-
return fn();
78-
}
79-
});
80-
});
68+
beforeBulkCreate(users, fields) {
69+
var promises = [];
70+
users.forEach(user => promises.push(user.updatePassword()));
71+
return Promise.all(promises);
8172
},
82-
beforeCreate(user, fields, fn) {
83-
user.updatePassword(fn);
73+
beforeCreate(user, fields) {
74+
return user.updatePassword();
8475
},
85-
beforeUpdate(user, fields, fn) {
76+
beforeUpdate(user, fields) {
8677
if(user.changed('password')) {
87-
return user.updatePassword(fn);
78+
return user.updatePassword();
8879
}
89-
fn();
80+
return Promise.resolve(user);
9081
}
9182
},
9283

93-
/**
94-
* Instance Methods
95-
*/
96-
instanceMethods: {
97-
/**
98-
* Authenticate - check if the passwords are the same
99-
*
100-
* @param {String} password
101-
* @param {Function} callback
102-
* @return {Boolean}
103-
* @api public
104-
*/
105-
authenticate(password, callback) {
106-
if(!callback) {
107-
return this.password === this.encryptPassword(password);
108-
}
84+
});
10985

110-
var _this = this;
111-
this.encryptPassword(password, function(err, pwdGen) {
112-
if(err) {
113-
callback(err);
114-
}
86+
/**
87+
* Instance Methods
88+
*/
89+
90+
/**
91+
* Authenticate - check if the passwords are the same
92+
*
93+
* @param {String} password
94+
* @param {Function} callback
95+
* @return {Boolean}
96+
* @api public
97+
*/
98+
User.prototype.authenticate = function(password, callback) {
99+
if(!callback) {
100+
return this.password === this.encryptPassword(password);
101+
}
115102

116-
if(_this.password === pwdGen) {
117-
callback(null, true);
118-
}
119-
else {
120-
callback(null, false);
121-
}
122-
});
123-
},
103+
var _this = this;
104+
this.encryptPassword(password, function(err, pwdGen) {
105+
if(err) {
106+
callback(err);
107+
}
124108

125-
/**
126-
* Make salt
127-
*
128-
* @param {Number} [byteSize] - Optional salt byte size, default to 16
129-
* @param {Function} callback
130-
* @return {String}
131-
* @api public
132-
*/
133-
makeSalt(...args) {
134-
let byteSize;
135-
let callback;
136-
let defaultByteSize = 16;
137-
138-
if(typeof args[0] === 'function') {
139-
callback = args[0];
140-
byteSize = defaultByteSize;
141-
} else if(typeof args[1] === 'function') {
142-
callback = args[1];
143-
} else {
144-
throw new Error('Missing Callback');
145-
}
109+
if(_this.password === pwdGen) {
110+
callback(null, true);
111+
} else {
112+
callback(null, false);
113+
}
114+
});
115+
};
116+
117+
/**
118+
* Make salt
119+
*
120+
* @param {Number} [byteSize] - Optional salt byte size, default to 16
121+
* @param {Function} callback
122+
* @return {String}
123+
* @api public
124+
*/
125+
User.prototype.makeSalt = function(...args) {
126+
let byteSize;
127+
let callback;
128+
let defaultByteSize = 16;
129+
130+
if(typeof args[0] === 'function') {
131+
callback = args[0];
132+
byteSize = defaultByteSize;
133+
} else if(typeof args[1] === 'function') {
134+
callback = args[1];
135+
} else {
136+
throw new Error('Missing Callback');
137+
}
146138

147-
if(!byteSize) {
148-
byteSize = defaultByteSize;
149-
}
139+
if(!byteSize) {
140+
byteSize = defaultByteSize;
141+
}
150142

151-
return crypto.randomBytes(byteSize, function(err, salt) {
152-
if(err) {
153-
callback(err);
154-
}
155-
return callback(null, salt.toString('base64'));
156-
});
157-
},
143+
return crypto.randomBytes(byteSize, function(err, salt) {
144+
if(err) {
145+
callback(err);
146+
}
147+
return callback(null, salt.toString('base64'));
148+
});
149+
};
150+
151+
/**
152+
* Encrypt password
153+
*
154+
* @param {String} password
155+
* @param {Function} callback
156+
* @return {String}
157+
* @api public
158+
*/
159+
User.prototype.encryptPassword = function(password, callback) {
160+
if(!password || !this.salt) {
161+
return callback ? callback(null) : null;
162+
}
158163

159-
/**
160-
* Encrypt password
161-
*
162-
* @param {String} password
163-
* @param {Function} callback
164-
* @return {String}
165-
* @api public
166-
*/
167-
encryptPassword(password, callback) {
168-
if(!password || !this.salt) {
169-
return callback ? callback(null) : null;
170-
}
164+
var defaultIterations = 10000;
165+
var defaultKeyLength = 64;
166+
var salt = new Buffer(this.salt, 'base64');
171167

172-
var defaultIterations = 10000;
173-
var defaultKeyLength = 64;
174-
var salt = new Buffer(this.salt, 'base64');
168+
if(!callback) {
169+
return crypto.pbkdf2Sync(password, salt, defaultIterations, defaultKeyLength, 'sha256')
170+
.toString('base64');
171+
}
175172

176-
if(!callback) {
177-
return crypto.pbkdf2Sync(password, salt, defaultIterations, defaultKeyLength, 'sha256')
178-
.toString('base64');
173+
return crypto.pbkdf2(password, salt, defaultIterations, defaultKeyLength, 'sha256',
174+
function(err, key) {
175+
if(err) {
176+
callback(err);
179177
}
178+
return callback(null, key.toString('base64'));
179+
});
180+
};
181+
182+
/**
183+
* Update password field
184+
*
185+
* @param {Function} fn
186+
* @return {String}
187+
* @api public
188+
*/
189+
User.prototype.updatePassword = function() {
190+
return new Promise((resolve, reject) => {
191+
if (!this.password) {
192+
return resolve(user);
193+
}
180194

181-
return crypto.pbkdf2(password, salt, defaultIterations, defaultKeyLength, 'sha256',
182-
function(err, key) {
183-
if(err) {
184-
callback(err);
185-
}
186-
return callback(null, key.toString('base64'));
187-
});
188-
},
195+
if (!validatePresenceOf(this.password)<% if(filters.oauth) { %> && authTypes.indexOf(this.provider) === -1<% } %>) {
196+
return reject(new Error('Invalid password'));
197+
}
189198

190-
/**
191-
* Update password field
192-
*
193-
* @param {Function} fn
194-
* @return {String}
195-
* @api public
196-
*/
197-
updatePassword(fn) {
198-
// Handle new/update passwords
199-
if(!this.password) return fn(null);
200-
201-
if(!validatePresenceOf(this.password)<% if(filters.oauth) { %> && authTypes.indexOf(this.provider) === -1<% } %>) {
202-
fn(new Error('Invalid password'));
199+
// Make salt with a callback
200+
return this.makeSalt((saltErr, salt) => {
201+
if (saltErr) {
202+
return reject(saltErr);
203203
}
204-
205-
// Make salt with a callback
206-
this.makeSalt((saltErr, salt) => {
207-
if(saltErr) {
208-
return fn(saltErr);
204+
this.salt = salt;
205+
return this.encryptPassword(this.password, (encryptErr, hashedPassword) => {
206+
if (encryptErr) {
207+
return reject(encryptErr);
209208
}
210-
this.salt = salt;
211-
this.encryptPassword(this.password, (encryptErr, hashedPassword) => {
212-
if(encryptErr) {
213-
fn(encryptErr);
214-
}
215-
this.password = hashedPassword;
216-
fn(null);
217-
});
209+
this.password = hashedPassword;
210+
return resolve(this);
218211
});
219-
}
220-
}
221-
});
212+
});
213+
});
214+
};
215+
216+
return User;
222217
};

Diff for: templates/app/server/config/environment/development.js

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module.exports = {<% if (filters.mongoose) { %>
1414
uri: 'sqlite://',
1515
options: {
1616
logging: false,
17+
operatorsAliases: false,
1718
storage: 'dev.sqlite',
1819
define: {
1920
timestamps: false

Diff for: templates/app/server/config/environment/production.js

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ module.exports = {
2727
|| 'sqlite://',
2828
options: {
2929
logging: false,
30+
operatorsAliases: false,
3031
storage: 'dist.sqlite',
3132
define: {
3233
timestamps: false

Diff for: templates/app/server/config/environment/test.js

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module.exports = {
1212
uri: 'sqlite://',
1313
options: {
1414
logging: false,
15+
operatorsAliases: false,
1516
storage: 'test.sqlite',
1617
define: {
1718
timestamps: false

0 commit comments

Comments
 (0)