Skip to content

Commit 9528318

Browse files
committed
Merge pull request #1122 from kingcody/fix/endpoint-dynamic-path
Endpoint improvements
2 parents 08467ce + c18824a commit 9528318

15 files changed

+202
-116
lines changed

Diff for: app/index.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ var AngularFullstackGenerator = yeoman.generators.Base.extend({
316316

317317
saveSettings: function() {
318318
if(this.skipConfig) return;
319+
this.config.set('endpointDirectory', 'server/api/');
319320
this.config.set('insertRoutes', true);
320321
this.config.set('registerRoutesFile', 'server/routes.js');
321322
this.config.set('routesNeedle', '// Insert routes below');
@@ -399,11 +400,19 @@ var AngularFullstackGenerator = yeoman.generators.Base.extend({
399400
},
400401

401402
generateEndpoint: function() {
402-
var name = this.name = this.cameledName = 'thing';
403-
this.classedName = name.charAt(0).toUpperCase() + name.slice(1);
404-
this.route = '/api/' + name + 's';
405-
this.sourceRoot(path.join(__dirname, '..', 'endpoint', 'templates'));
406-
genUtils.processDirectory(this, '.', 'server/api/' + name);
403+
var models;
404+
if (this.filters.mongooseModels) {
405+
models = 'mongoose';
406+
} else if (this.filters.sequelizeModels) {
407+
models = 'sequelize';
408+
}
409+
this.composeWith('angular-fullstack:endpoint', {
410+
options: {
411+
route: '/api/things',
412+
models: models
413+
},
414+
args: ['thing']
415+
});
407416
}
408417

409418
},

Diff for: app/templates/_package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"mongoose": "~4.0.3",
2020
"mongoose-bird": "~0.0.1",
2121
"connect-mongo": "^0.8.1",<% } %><% if (filters.sequelize) { %>
22-
"sequelize": "^2.0.0-rc2",
22+
"sequelize": "^3.5.1",
2323
"sqlite3": "~3.0.2",<% } %><% if (filters.auth) { %>
2424
"jsonwebtoken": "^5.0.0",
2525
"express-jwt": "^3.0.0",

Diff for: app/templates/server/sqldb(sequelize)/index.js

+3-18
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,8 @@ var db = {
1313
Sequelize: Sequelize,
1414
sequelize: new Sequelize(config.sequelize.uri, config.sequelize.options)
1515
};
16-
<% if (filters.sequelizeModels) { %>
17-
db.Thing = db.sequelize.import(path.join(
18-
config.root,
19-
'server',
20-
'api',
21-
'thing',
22-
'thing.model'
23-
));
24-
<% if (filters.auth) { %>
25-
db.User = db.sequelize.import(path.join(
26-
config.root,
27-
'server',
28-
'api',
29-
'user',
30-
'user.model'
31-
));
32-
<% } %><% } %>
33-
// Insert models below
16+
17+
// Insert models below<% if (filters.sequelizeModels && filters.auth) { %>
18+
db.User = db.sequelize.import('../api/user/user.model');<% } %>
3419

3520
module.exports = db;

Diff for: endpoint/index.js

+81-49
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,59 @@ var ScriptBase = require('../script-base.js');
77

88
var Generator = module.exports = function Generator() {
99
ScriptBase.apply(this, arguments);
10+
11+
this.option('route', {
12+
desc: 'URL for the endpoint',
13+
type: String
14+
});
15+
16+
this.option('models', {
17+
desc: 'Specify which model(s) to use',
18+
type: String
19+
});
20+
21+
this.option('endpointDirectory', {
22+
desc: 'Parent directory for enpoints',
23+
type: String
24+
});
1025
};
1126

1227
util.inherits(Generator, ScriptBase);
1328

1429
Generator.prototype.prompting = function askFor() {
1530
var done = this.async();
31+
var promptCb = function (props) {
32+
if(props.route.charAt(0) !== '/') {
33+
props.route = '/' + props.route;
34+
}
35+
36+
this.route = props.route;
37+
38+
if (props.models) {
39+
delete this.filters.mongoose;
40+
delete this.filters.mongooseModels;
41+
delete this.filters.sequelize;
42+
delete this.filters.sequelizeModels;
43+
44+
this.filters[props.models] = true;
45+
this.filters[props.models + 'Models'] = true;
46+
}
47+
done();
48+
}.bind(this);
49+
50+
if (this.options.route) {
51+
if (this.filters.mongoose && this.filters.sequelize) {
52+
if (this.options.models) {
53+
return promptCb(this.options);
54+
}
55+
} else {
56+
if (this.filters.mongooseModels) { this.options.models = 'mongoose'; }
57+
else if (this.filters.sequelizeModels) { this.options.models = 'sequelize'; }
58+
else { delete this.options.models; }
59+
return promptCb(this.options);
60+
}
61+
}
62+
1663
var name = this.name;
1764

1865
var base = this.config.get('routesBase') || '/api/';
@@ -46,73 +93,58 @@ Generator.prototype.prompting = function askFor() {
4693
}
4794
];
4895

49-
this.prompt(prompts, function (props) {
50-
if(props.route.charAt(0) !== '/') {
51-
props.route = '/' + props.route;
52-
}
53-
54-
this.route = props.route;
55-
56-
if (props.models) {
57-
delete this.filters.mongoose;
58-
delete this.filters.mongooseModels;
59-
delete this.filters.sequelize;
60-
delete this.filters.sequelizeModels;
96+
this.prompt(prompts, promptCb);
97+
};
6198

62-
this.filters[props.models] = true;
63-
this.filters[props.models + 'Models'] = true;
64-
}
65-
done();
66-
}.bind(this));
99+
Generator.prototype.configuring = function config() {
100+
this.routeDest = path.join(this.options.endpointDirectory ||
101+
this.config.get('endpointDirectory') || 'server/api/', this.name);
67102
};
68103

69104
Generator.prototype.writing = function createFiles() {
70-
var dest = this.config.get('endpointDirectory') || 'server/api/' + this.name;
71105
this.sourceRoot(path.join(__dirname, './templates'));
72-
ngUtil.processDirectory(this, '.', dest);
106+
ngUtil.processDirectory(this, '.', this.routeDest);
73107
};
74108

75109
Generator.prototype.end = function registerEndpoint() {
76110
if(this.config.get('insertRoutes')) {
111+
var routesFile = this.config.get('registerRoutesFile');
112+
var reqPath = this.relativeRequire(this.routeDest, routesFile);
77113
var routeConfig = {
78-
file: this.config.get('registerRoutesFile'),
114+
file: routesFile,
79115
needle: this.config.get('routesNeedle'),
80116
splicable: [
81-
"app.use(\'" + this.route +"\', require(\'./api/" + this.name + "\'));"
117+
"app.use(\'" + this.route +"\', require(\'" + reqPath + "\'));"
82118
]
83119
};
84120
ngUtil.rewriteFile(routeConfig);
85121
}
86122

87-
if (this.filters.socketio) {
88-
if(this.config.get('insertSockets')) {
89-
var socketConfig = {
90-
file: this.config.get('registerSocketsFile'),
91-
needle: this.config.get('socketsNeedle'),
92-
splicable: [
93-
"require(\'../api/" + this.name + '/' + this.name + ".socket\').register(socket);"
94-
]
95-
};
96-
ngUtil.rewriteFile(socketConfig);
97-
}
123+
if (this.filters.socketio && this.config.get('insertSockets')) {
124+
var socketsFile = this.config.get('registerSocketsFile');
125+
var reqPath = this.relativeRequire(this.routeDest + '/' + this.basename +
126+
'.socket', socketsFile);
127+
var socketConfig = {
128+
file: socketsFile,
129+
needle: this.config.get('socketsNeedle'),
130+
splicable: [
131+
"require(\'" + reqPath + "\').register(socket);"
132+
]
133+
};
134+
ngUtil.rewriteFile(socketConfig);
98135
}
99136

100-
if (this.filters.sequelize) {
101-
if (this.config.get('insertModels')) {
102-
var modelConfig = {
103-
file: this.config.get('registerModelsFile'),
104-
needle: this.config.get('modelsNeedle'),
105-
splicable: [
106-
"db." + this.classedName + " = db.sequelize.import(path.join(\n" +
107-
" config.root,\n" +
108-
" 'server',\n" +
109-
" 'api',\n" +
110-
" '" + this.name + "',\n" +
111-
" '" + this.name + ".model'\n" +
112-
"));"
113-
]
114-
};
115-
ngUtil.rewriteFile(modelConfig);
116-
}
137+
if (this.filters.sequelize && this.config.get('insertModels')) {
138+
var modelsFile = this.config.get('registerModelsFile');
139+
var reqPath = this.relativeRequire(this.routeDest + '/' + this.basename +
140+
'.model', modelsFile);
141+
var modelConfig = {
142+
file: modelsFile,
143+
needle: this.config.get('modelsNeedle'),
144+
splicable: [
145+
"db." + this.classedName + " = db.sequelize.import(\'" + reqPath +"\');"
146+
]
147+
};
148+
ngUtil.rewriteFile(modelConfig);
117149
}
118150
};

Diff for: endpoint/templates/name.controller.js renamed to endpoint/templates/basename.controller.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
'use strict';<% if (filters.models) { %>
1111

1212
var _ = require('lodash');<% if (filters.mongooseModels) { %>
13-
var <%= classedName %> = require('./<%= name %>.model');<% } if (filters.sequelizeModels) { %>
14-
var sqldb = require('../../sqldb');
13+
var <%= classedName %> = require('./<%= basename %>.model');<% } if (filters.sequelizeModels) { %>
14+
var sqldb = require('<%= relativeRequire(config.get('registerModelsFile')) %>');
1515
var <%= classedName %> = sqldb.<%= classedName %>;<% } %>
1616

1717
function handleError(res, statusCode) {
@@ -64,7 +64,7 @@ function removeEntity(res) {
6464
};
6565
}<% } %>
6666

67-
// Gets a list of <%= name %>s
67+
// Gets a list of <%= classedName %>s
6868
exports.index = function(req, res) {<% if (!filters.models) { %>
6969
res.json([]);<% } else { %>
7070
<% if (filters.mongooseModels) { %><%= classedName %>.findAsync()<% }
@@ -73,7 +73,7 @@ exports.index = function(req, res) {<% if (!filters.models) { %>
7373
.catch(handleError(res));<% } %>
7474
};<% if (filters.models) { %>
7575

76-
// Gets a single <%= name %> from the DB
76+
// Gets a single <%= classedName %> from the DB
7777
exports.show = function(req, res) {
7878
<% if (filters.mongooseModels) { %><%= classedName %>.findByIdAsync(req.params.id)<% }
7979
if (filters.sequelizeModels) { %><%= classedName %>.find({
@@ -86,15 +86,15 @@ exports.show = function(req, res) {
8686
.catch(handleError(res));
8787
};
8888

89-
// Creates a new <%= name %> in the DB
89+
// Creates a new <%= classedName %> in the DB
9090
exports.create = function(req, res) {
9191
<% if (filters.mongooseModels) { %><%= classedName %>.createAsync(req.body)<% }
9292
if (filters.sequelizeModels) { %><%= classedName %>.create(req.body)<% } %>
9393
.then(responseWithResult(res, 201))
9494
.catch(handleError(res));
9595
};
9696

97-
// Updates an existing <%= name %> in the DB
97+
// Updates an existing <%= classedName %> in the DB
9898
exports.update = function(req, res) {
9999
if (req.body._id) {
100100
delete req.body._id;
@@ -111,7 +111,7 @@ exports.update = function(req, res) {
111111
.catch(handleError(res));
112112
};
113113

114-
// Deletes a <%= name %> from the DB
114+
// Deletes a <%= classedName %> from the DB
115115
exports.destroy = function(req, res) {
116116
<% if (filters.mongooseModels) { %><%= classedName %>.findByIdAsync(req.params.id)<% }
117117
if (filters.sequelizeModels) { %><%= classedName %>.find({

Diff for: endpoint/templates/name.events(models).js renamed to endpoint/templates/basename.events(models).js

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
'use strict';
66

77
var EventEmitter = require('events').EventEmitter;<% if (filters.mongooseModels) { %>
8-
var <%= classedName %> = require('./<%= name %>.model');<% } if (filters.sequelizeModels) { %>
9-
var <%= classedName %> = require('../../sqldb').<%= classedName %>;<% } %>
8+
var <%= classedName %> = require('./<%= basename %>.model');<% } if (filters.sequelizeModels) { %>
9+
var <%= classedName %> = require('<%= relativeRequire(config.get('registerModelsFile')) %>').<%= classedName %>;<% } %>
1010
var <%= classedName %>Events = new EventEmitter();
1111

1212
// Set max event listeners (0 == unlimited)

Diff for: endpoint/templates/name.integration.js renamed to endpoint/templates/basename.integration.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
var app = require('../../app');
3+
var app = require('<%= relativeRequire('server/app') %>');
44
var request = require('supertest');<% if(filters.models) { %>
55

66
var new<%= classedName %>;<% } %>
@@ -36,7 +36,7 @@ describe('<%= classedName %> API:', function() {
3636
.post('<%= route %>')
3737
.send({
3838
name: 'New <%= classedName %>',
39-
info: 'This is the brand new <%= name %>!!!'
39+
info: 'This is the brand new <%= cameledName %>!!!'
4040
})
4141
.expect(201)
4242
.expect('Content-Type', /json/)
@@ -49,9 +49,9 @@ describe('<%= classedName %> API:', function() {
4949
});
5050
});
5151

52-
it('should respond with the newly created <%= name %>', function() {
52+
it('should respond with the newly created <%= cameledName %>', function() {
5353
new<%= classedName %>.name.should.equal('New <%= classedName %>');
54-
new<%= classedName %>.info.should.equal('This is the brand new <%= name %>!!!');
54+
new<%= classedName %>.info.should.equal('This is the brand new <%= cameledName %>!!!');
5555
});
5656

5757
});
@@ -77,9 +77,9 @@ describe('<%= classedName %> API:', function() {
7777
<%= cameledName %> = {};
7878
});
7979

80-
it('should respond with the requested <%= name %>', function() {
80+
it('should respond with the requested <%= cameledName %>', function() {
8181
<%= cameledName %>.name.should.equal('New <%= classedName %>');
82-
<%= cameledName %>.info.should.equal('This is the brand new <%= name %>!!!');
82+
<%= cameledName %>.info.should.equal('This is the brand new <%= cameledName %>!!!');
8383
});
8484

8585
});
@@ -92,7 +92,7 @@ describe('<%= classedName %> API:', function() {
9292
.put('<%= route %>/' + new<%= classedName %>._id)
9393
.send({
9494
name: 'Updated <%= classedName %>',
95-
info: 'This is the updated <%= name %>!!!'
95+
info: 'This is the updated <%= cameledName %>!!!'
9696
})
9797
.expect(200)
9898
.expect('Content-Type', /json/)
@@ -109,9 +109,9 @@ describe('<%= classedName %> API:', function() {
109109
updated<%= classedName %> = {};
110110
});
111111

112-
it('should respond with the updated <%= name %>', function() {
112+
it('should respond with the updated <%= cameledName %>', function() {
113113
updated<%= classedName %>.name.should.equal('Updated <%= classedName %>');
114-
updated<%= classedName %>.info.should.equal('This is the updated <%= name %>!!!');
114+
updated<%= classedName %>.info.should.equal('This is the updated <%= cameledName %>!!!');
115115
});
116116

117117
});
@@ -130,7 +130,7 @@ describe('<%= classedName %> API:', function() {
130130
});
131131
});
132132

133-
it('should respond with 404 when <%= name %> does not exist', function(done) {
133+
it('should respond with 404 when <%= cameledName %> does not exist', function(done) {
134134
request(app)
135135
.delete('<%= route %>/' + new<%= classedName %>._id)
136136
.expect(404)

Diff for: endpoint/templates/name.socket(socketio).js renamed to endpoint/templates/basename.socket(socketio).js

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
'use strict';
66

7-
var <%= classedName %>Events = require('./<%= name %>.events');
7+
var <%= classedName %>Events = require('./<%= basename %>.events');
88

99
// Model events to emit
1010
var events = ['save', 'remove'];
@@ -13,7 +13,7 @@ exports.register = function(socket) {
1313
// Bind model events to socket events
1414
for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
1515
var event = events[i];
16-
var listener = createListener('<%= name %>:' + event, socket);
16+
var listener = createListener('<%= cameledName %>:' + event, socket);
1717

1818
<%= classedName %>Events.on(event, listener);
1919
socket.on('disconnect', removeListener(event, listener));

0 commit comments

Comments
 (0)