Skip to content

Commit 75ba13d

Browse files
committed
Merge pull request #714 from sigriston/feature-sequelize
feat(server): add support for sequelize
2 parents 422b264 + 943120e commit 75ba13d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+974
-240
lines changed

app/index.js

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,38 @@ var AngularFullstackGenerator = yeoman.generators.Base.extend({
145145
this.log('\n# Server\n');
146146

147147
this.prompt([{
148-
type: 'confirm',
149-
name: 'mongoose',
150-
message: 'Would you like to use mongoDB with Mongoose for data modeling?'
148+
type: 'checkbox',
149+
name: 'odms',
150+
message: 'What would you like to use for data modeling?',
151+
choices: [
152+
{
153+
value: 'mongoose',
154+
name: 'Mongoose (MongoDB)',
155+
checked: true
156+
},
157+
{
158+
value: 'sequelize',
159+
name: 'Sequelize (MySQL, SQLite, MariaDB, PostgreSQL)',
160+
checked: false
161+
}
162+
]
163+
}, {
164+
type: 'list',
165+
name: 'models',
166+
message: 'What would you like to use for the default models?',
167+
choices: [ 'Mongoose', 'Sequelize' ],
168+
filter: function( val ) {
169+
return val.toLowerCase();
170+
},
171+
when: function(answers) {
172+
return answers.odms && answers.odms.length > 1;
173+
}
151174
}, {
152175
type: 'confirm',
153176
name: 'auth',
154177
message: 'Would you scaffold out an authentication boilerplate?',
155178
when: function (answers) {
156-
return answers.mongoose;
179+
return answers.odms && answers.odms.length !== 0;
157180
}
158181
}, {
159182
type: 'checkbox',
@@ -183,15 +206,29 @@ var AngularFullstackGenerator = yeoman.generators.Base.extend({
183206
type: 'confirm',
184207
name: 'socketio',
185208
message: 'Would you like to use socket.io?',
186-
// to-do: should not be dependent on mongoose
209+
// to-do: should not be dependent on ODMs
187210
when: function (answers) {
188-
return answers.mongoose;
211+
return answers.odms && answers.odms.length !== 0;
189212
},
190213
default: true
191214
}], function (answers) {
192215
if(answers.socketio) this.filters.socketio = true;
193-
if(answers.mongoose) this.filters.mongoose = true;
194216
if(answers.auth) this.filters.auth = true;
217+
if(answers.odms.length > 0) {
218+
var models;
219+
if(!answers.models) {
220+
models = answers.odms[0];
221+
} else {
222+
models = answers.models;
223+
}
224+
this.filters.models = true;
225+
this.filters[models + 'Models'] = true;
226+
answers.odms.forEach(function(odm) {
227+
this.filters[odm] = true;
228+
}.bind(this));
229+
} else {
230+
this.filters.noModels = true;
231+
}
195232
if(answers.oauth) {
196233
if(answers.oauth.length) this.filters.oauth = true;
197234
answers.oauth.forEach(function(oauthStrategy) {
@@ -265,6 +302,10 @@ var AngularFullstackGenerator = yeoman.generators.Base.extend({
265302
this.config.set('registerSocketsFile', 'server/config/socketio.js');
266303
this.config.set('socketsNeedle', '// Insert sockets below');
267304

305+
this.config.set('insertModels', true);
306+
this.config.set('registerModelsFile', 'server/sqldb/index.js');
307+
this.config.set('modelsNeedle', '// Insert models below');
308+
268309
this.config.set('filters', this.filters);
269310
this.config.forceSave();
270311
},

app/templates/_package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,18 @@
1616
"jade": "~1.2.0",<% } %><% if (filters.html) { %>
1717
"ejs": "~0.8.4",<% } %><% if (filters.mongoose) { %>
1818
"mongoose": "~3.8.8",
19-
"mongoose-bird": "~0.0.1",<% } %><% if (filters.auth) { %>
19+
"mongoose-bird": "~0.0.1",<% } %><% if (filters.sequelize) { %>
20+
"sequelize": "^2.0.0-rc2",
21+
"sqlite3": "~3.0.2",<% } %><% if (filters.auth) { %>
2022
"jsonwebtoken": "^0.3.0",
2123
"express-jwt": "^0.1.3",
2224
"passport": "~0.2.0",
2325
"passport-local": "~0.1.6",<% } %><% if (filters.facebookAuth) { %>
2426
"passport-facebook": "latest",<% } %><% if (filters.twitterAuth) { %>
2527
"passport-twitter": "latest",<% } %><% if (filters.googleAuth) { %>
2628
"passport-google-oauth": "latest",<% } %>
27-
"composable-middleware": "^0.3.0",
28-
"connect-mongo": "^0.4.1"<% if (filters.socketio) { %>,
29+
"composable-middleware": "^0.3.0"<% if (filters.mongoose) { %>,
30+
"connect-mongo": "^0.4.1"<% } %><% if (filters.socketio) { %>,
2931
"socket.io": "^1.0.6",
3032
"socket.io-client": "^1.0.6",
3133
"socketio-jwt": "^2.0.2"<% } %>

app/templates/client/app/account(auth)/signup/signup.controller(coffee).coffee

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,17 @@ angular.module '<%= scriptAppName %>'
2020
.catch (err) ->
2121
err = err.data
2222
$scope.errors = {}
23-
23+
<% if (filters.mongooseModels) { %>
2424
# Update validity of form fields that match the mongoose errors
2525
angular.forEach err.errors, (error, field) ->
2626
form[field].$setValidity 'mongoose', false
27-
$scope.errors[field] = error.message
27+
$scope.errors[field] = error.message<% }
28+
if (filters.sequelizeModels) { %>
29+
# Update validity of form fields that match the sequelize errors
30+
if err.name
31+
angular.forEach err.fields, (field) ->
32+
form[field].$setValidity 'mongoose', false
33+
$scope.errors[field] = err.message<% } %>
2834
<% if (filters.oauth) {%>
2935
$scope.loginOauth = (provider) ->
3036
$window.location.href = '/auth/' + provider<% } %>

app/templates/client/app/account(auth)/signup/signup.controller(js).js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,20 @@ angular.module('<%= scriptAppName %>')
2121
.catch(function(err) {
2222
err = err.data;
2323
$scope.errors = {};
24-
24+
<% if (filters.mongooseModels) { %>
2525
// Update validity of form fields that match the mongoose errors
2626
angular.forEach(err.errors, function(error, field) {
2727
form[field].$setValidity('mongoose', false);
2828
$scope.errors[field] = error.message;
29-
});
29+
});<% }
30+
if (filters.sequelizeModels) { %>
31+
// Update validity of form fields that match the sequelize errors
32+
if (err.name) {
33+
angular.forEach(err.fields, function(field) {
34+
form[field].$setValidity('mongoose', false);
35+
$scope.errors[field] = err.message;
36+
});
37+
}<% } %>
3038
});
3139
}
3240
};

app/templates/client/app/main/main.controller(coffee).coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ angular.module '<%= scriptAppName %>'
77
$http.get('/api/things').success (awesomeThings) ->
88
$scope.awesomeThings = awesomeThings
99
<% if (filters.socketio) { %>socket.syncUpdates 'thing', $scope.awesomeThings<% } %>
10-
<% if (filters.mongoose) { %>
10+
<% if (filters.models) { %>
1111
$scope.addThing = ->
1212
return if $scope.newThing is ''
1313
$http.post '/api/things',

app/templates/client/app/main/main.controller(js).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ angular.module('<%= scriptAppName %>')
88
$scope.awesomeThings = awesomeThings;<% if (filters.socketio) { %>
99
socket.syncUpdates('thing', $scope.awesomeThings);<% } %>
1010
});
11-
<% if (filters.mongoose) { %>
11+
<% if (filters.models) { %>
1212
$scope.addThing = function() {
1313
if ($scope.newThing === '') {
1414
return;

app/templates/e2e/account(auth)/login/login.spec(jasmine).js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
22

3-
var config = protractor.getInstance().params;
4-
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');
3+
var config = protractor.getInstance().params;<% if (filters.mongooseModels) { %>
4+
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');<% } %><% if (filters.sequelizeModels) { %>
5+
var UserModel = require(config.serverConfig.root + '/server/sqldb').User;<% } %>
56

67
describe('Login View', function() {
78
var page;
@@ -18,9 +19,11 @@ describe('Login View', function() {
1819
};
1920

2021
beforeEach(function(done) {
21-
UserModel.removeAsync()
22+
<% if (filters.mongooseModels) { %>UserModel.removeAsync()<% }
23+
if (filters.sequelizeModels) { %>UserModel.destroy()<% } %>
2224
.then(function() {
23-
return UserModel.createAsync(testUser);
25+
<% if (filters.mongooseModels) { %>return UserModel.createAsync(testUser);<% }
26+
if (filters.sequelizeModels) { %>return UserModel.create(testUser);<% } %>
2427
})
2528
.then(loadPage)
2629
.finally(done);

app/templates/e2e/account(auth)/login/login.spec(mocha).js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
22

3-
var config = protractor.getInstance().params;
4-
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');
3+
var config = protractor.getInstance().params;<% if (filters.mongooseModels) { %>
4+
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');<% } %><% if (filters.sequelizeModels) { %>
5+
var UserModel = require(config.serverConfig.root + '/server/sqldb').User;<% } %>
56

67
describe('Login View', function() {
78
var page;
@@ -19,15 +20,18 @@ describe('Login View', function() {
1920

2021
before(function() {
2122
return UserModel
22-
.removeAsync()
23+
<% if (filters.mongooseModels) { %>.removeAsync()<% }
24+
if (filters.sequelizeModels) { %>.destroy()<% } %>
2325
.then(function() {
24-
return UserModel.createAsync(testUser);
26+
<% if (filters.mongooseModels) { %>return UserModel.createAsync(testUser);<% }
27+
if (filters.sequelizeModels) { %>return UserModel.create(testUser);<% } %>
2528
})
2629
.then(loadPage);
2730
});
2831

2932
after(function() {
30-
return UserModel.removeAsync();
33+
<% if (filters.mongooseModels) { %>return UserModel.removeAsync();<% }
34+
if (filters.sequelizeModels) { %>return UserModel.destroy();<% } %>
3135
});
3236

3337
it('should include login form with correct inputs and submit button', function() {

app/templates/e2e/account(auth)/logout/logout.spec(jasmine).js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
22

3-
var config = protractor.getInstance().params;
4-
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');
3+
var config = protractor.getInstance().params;<% if (filters.mongooseModels) { %>
4+
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');<% } %><% if (filters.sequelizeModels) { %>
5+
var UserModel = require(config.serverConfig.root + '/server/sqldb').User;<% } %>
56

67
describe('Logout View', function() {
78
var login = function(user) {
@@ -16,9 +17,11 @@ describe('Logout View', function() {
1617
};
1718

1819
beforeEach(function(done) {
19-
UserModel.removeAsync()
20+
<% if (filters.mongooseModels) { %>UserModel.removeAsync()<% }
21+
if (filters.sequelizeModels) { %>UserModel.destroy()<% } %>
2022
.then(function() {
21-
return UserModel.createAsync(testUser);
23+
<% if (filters.mongooseModels) { %>return UserModel.createAsync(testUser);<% }
24+
if (filters.sequelizeModels) { %>return UserModel.create(testUser);<% } %>
2225
})
2326
.then(function() {
2427
return login(testUser);

app/templates/e2e/account(auth)/logout/logout.spec(mocha).js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use strict';
22

3-
var config = protractor.getInstance().params;
4-
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');
3+
var config = protractor.getInstance().params;<% if (filters.mongooseModels) { %>
4+
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');<% } %><% if (filters.sequelizeModels) { %>
5+
var UserModel = require(config.serverConfig.root + '/server/sqldb').User;<% } %>
56

67
describe('Logout View', function() {
78
var login = function(user) {
@@ -17,17 +18,20 @@ describe('Logout View', function() {
1718

1819
beforeEach(function() {
1920
return UserModel
20-
.removeAsync()
21+
<% if (filters.mongooseModels) { %>.removeAsync()<% }
22+
if (filters.sequelizeModels) { %>.destroy()<% } %>
2123
.then(function() {
22-
return UserModel.createAsync(testUser);
24+
<% if (filters.mongooseModels) { %>return UserModel.createAsync(testUser);<% }
25+
if (filters.sequelizeModels) { %>return UserModel.create(testUser);<% } %>
2326
})
2427
.then(function() {
2528
return login(testUser);
2629
});
2730
});
2831

2932
after(function() {
30-
return UserModel.removeAsync();
33+
<% if (filters.mongooseModels) { %>return UserModel.removeAsync();<% }
34+
if (filters.sequelizeModels) { %>return UserModel.destroy();<% } %>
3135
})
3236

3337
describe('with local auth', function() {

0 commit comments

Comments
 (0)