Skip to content

Commit 943120e

Browse files
committed
feat(server): add support for sequelize
Closes angular-fullstack#414.
1 parent b986998 commit 943120e

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

Diff for: app/index.js

+48-7
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
},

Diff for: app/templates/_package.json

+5-3
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"<% } %>

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

+8-2
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<% } %>

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

+10-2
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
};

Diff for: app/templates/client/app/main/main.controller(coffee).coffee

+1-1
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',

Diff for: app/templates/client/app/main/main.controller(js).js

+1-1
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;

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

+7-4
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);

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

+9-5
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() {

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

+7-4
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);

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

+9-5
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() {

Diff for: app/templates/e2e/account(auth)/signup/signup.spec(jasmine).js

+5-3
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('Signup View', function() {
78
var page;
@@ -35,7 +36,8 @@ describe('Signup View', function() {
3536
describe('with local auth', function() {
3637

3738
it('should signup a new user, log them in, and redirecting to "/"', function(done) {
38-
UserModel.remove(function() {
39+
<% if (filters.mongooseModels) { %>UserModel.remove(function() {<% }
40+
if (filters.sequelizeModels) { %>UserModel.destroy().then(function() {<% } %>
3941
page.signup(testUser);
4042

4143
var navbar = require('../../components/navbar/navbar.po');

Diff for: app/templates/e2e/account(auth)/signup/signup.spec(mocha).js

+7-4
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('Signup View', function() {
78
var page;
@@ -22,7 +23,8 @@ describe('Signup View', function() {
2223
});
2324

2425
after(function() {
25-
return UserModel.removeAsync();
26+
<% if (filters.mongooseModels) { %>return UserModel.removeAsync();<% }
27+
if (filters.sequelizeModels) { %>return UserModel.destroy();<% } %>
2628
});
2729

2830
it('should include signup form with correct inputs and submit button', function() {
@@ -39,7 +41,8 @@ describe('Signup View', function() {
3941
describe('with local auth', function() {
4042

4143
it('should signup a new user, log them in, and redirecting to "/"', function(done) {
42-
UserModel.remove(function() {
44+
<% if (filters.mongooseModels) { %>UserModel.remove(function() {<% }
45+
if (filters.sequelizeModels) { %>UserModel.destroy().then(function() {<% } %>
4346
page.signup(testUser);
4447

4548
var navbar = require('../../components/navbar/navbar.po');

Diff for: app/templates/protractor.conf.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ var config = {
7575
);
7676
<% } %>
7777
var serverConfig = config.params.serverConfig;
78-
78+
<% if (filters.mongoose) { %>
7979
// Setup mongo for tests
8080
var mongoose = require('mongoose-bird')();
81-
mongoose.connect(serverConfig.mongo.uri, serverConfig.mongo.options); // Connect to database
81+
mongoose.connect(serverConfig.mongo.uri, serverConfig.mongo.options); // Connect to database<% } %>
8282
}
8383
};
8484

Diff for: app/templates/server/api/thing/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ var controller = require('./thing.controller');
55

66
var router = express.Router();
77

8-
router.get('/', controller.index);<% if (filters.mongoose) { %>
8+
router.get('/', controller.index);<% if (filters.models) { %>
99
router.get('/:id', controller.show);
1010
router.post('/', controller.create);
1111
router.put('/:id', controller.update);

Diff for: app/templates/server/api/thing/index.spec.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
var proxyquire = require('proxyquire').noPreserveCache();
44

55
var thingCtrlStub = {
6-
index: 'thingCtrl.index'<% if (filters.mongoose) { %>,
6+
index: 'thingCtrl.index'<% if (filters.models) { %>,
77
show: 'thingCtrl.show',
88
create: 'thingCtrl.create',
99
update: 'thingCtrl.update',
1010
destroy: 'thingCtrl.destroy'<% } %>
1111
};
1212

1313
var routerStub = {
14-
get: sinon.spy()<% if (filters.mongoose) { %>,
14+
get: sinon.spy()<% if (filters.models) { %>,
1515
put: sinon.spy(),
1616
patch: sinon.spy(),
1717
post: sinon.spy(),
@@ -42,7 +42,7 @@ describe('Thing API Router:', function() {
4242
.should.have.been.calledOnce;
4343
});
4444

45-
});<% if (filters.mongoose) { %>
45+
});<% if (filters.models) { %>
4646

4747
describe('GET /api/things/:id', function() {
4848

0 commit comments

Comments
 (0)