Skip to content

Commit 51153e0

Browse files
committed
add endpoint sub generator
1 parent 07fa212 commit 51153e0

File tree

9 files changed

+157
-5
lines changed

9 files changed

+157
-5
lines changed

app/templates/server/routes.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ var errors = require('./components/errors/errors');
99
module.exports = function(app) {
1010

1111
// Use component routing
12-
<% if (filters.auth) { %>app.use('/auth', require('./auth'));
13-
14-
<% } %>app.use('/api/things', require('./api/thing'));
12+
app.use('/api/things', require('./api/thing'));
1513
<% if (filters.auth) { %>app.use('/api/users', require('./api/user'));<% } %>
16-
14+
<% if (filters.auth) { %>app.use('/auth', require('./auth'));
15+
<% } %>
1716
// All undefined asset or api routes should return a 404
1817
app.route('/:url(api|auth|components|app|bower_components|assets)/*')
1918
.get(errors[404]);

endpoint/index.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
var path = require('path');
3+
var yeoman = require('yeoman-generator');
4+
var util = require('util');
5+
var ngUtil = require('../util');
6+
var ScriptBase = require('../script-base.js');
7+
8+
var Generator = module.exports = function Generator() {
9+
ScriptBase.apply(this, arguments);
10+
};
11+
12+
util.inherits(Generator, ScriptBase);
13+
14+
Generator.prototype.createFiles = function createFiles() {
15+
var dest = this.config.get('endpointDirectory') || 'server/api/' + this.name;
16+
this.sourceRoot(path.join(__dirname, './templates'));
17+
ngUtil.processDirectory(this, '.', dest);
18+
};

endpoint/templates/index.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
3+
var express = require('express');
4+
var controller = require('./<%= name %>.controller');
5+
6+
var router = express.Router();
7+
8+
router.get('/', controller.index);<% if(filters.mongoose) { %>
9+
router.get('/:id', controller.show);
10+
router.post('/', controller.create);
11+
router.put('/:id', controller.update);
12+
router.patch('/:id', controller.update);
13+
router.delete('/:id', controller.destroy);<% } %>
14+
15+
module.exports = router;

endpoint/templates/name.controller.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
'use strict';
2+
3+
var _ = require('lodash');<% if (filters.mongoose) { %>
4+
var <%= classedName %> = require('./<%= name %>.model');<% } %>
5+
6+
// Get list of <%= name %>s
7+
exports.index = function(req, res) {<% if (!filters.mongoose) { %>
8+
res.json([]);<% } %><% if (filters.mongoose) { %>
9+
<%= classedName %>.find(function (err, <%= name %>s) {
10+
if(err) { return handleError(res, err); }
11+
return res.json(200, <%= name %>s);
12+
});<% } %>
13+
};<% if (filters.mongoose) { %>
14+
15+
// Get a single <%= name %>
16+
exports.show = function(req, res) {
17+
<%= classedName %>.findById(req.params.id, function (err, <%= name %>) {
18+
if(err) { return handleError(res, err); }
19+
if(!<%= name %>) { return res.send(404); }
20+
return res.json(<%= name %>);
21+
});
22+
};
23+
24+
// Creates a new <%= name %> in the DB.
25+
exports.create = function(req, res) {
26+
<%= classedName %>.create(req.body, function(err, <%= name %>) {
27+
if(err) { return handleError(res, err); }
28+
return res.json(201, <%= name %>);
29+
});
30+
};
31+
32+
// Updates an existing <%= name %> in the DB.
33+
exports.update = function(req, res) {
34+
if(req.body._id) { delete req.body._id; }
35+
<%= classedName %>.findById(req.params.id, function (err, <%= name %>) {
36+
if (err) { return handleError(err); }
37+
if(!<%= name %>) { return res.send(404); }
38+
var updated = _.merge(<%= name %>, req.body);
39+
updated.save(function (err) {
40+
if (err) { return handleError(err); }
41+
return res.json(200, <%= name %>);
42+
});
43+
});
44+
};
45+
46+
// Deletes a <%= name %> from the DB.
47+
exports.destroy = function(req, res) {
48+
<%= classedName %>.findById(req.params.id, function (err, <%= name %>) {
49+
if(err) { return handleError(res, err); }
50+
if(!<%= name %>) { return res.send(404); }
51+
<%= name %>.remove(function(err) {
52+
if(err) { return handleError(res, err); }
53+
return res.send(204);
54+
});
55+
});
56+
};
57+
58+
function handleError(res, err) {
59+
return res.send(500, err);
60+
}<% } %>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
'use strict';
2+
3+
var mongoose = require('mongoose'),
4+
Schema = mongoose.Schema;
5+
6+
var <%= classedName %>Schema = new Schema({
7+
name: String,
8+
info: String,
9+
active: Boolean
10+
});
11+
12+
module.exports = mongoose.model('<%= classedName %>', <%= classedName %>Schema);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Broadcast updates to client when the model changes
3+
*/
4+
5+
'use strict';
6+
7+
var <%= name %> = require('./%<= name %>.model');
8+
9+
exports.register = function(socket) {
10+
<%= name %>.schema.post('save', function (doc) {
11+
onSave(socket, doc);
12+
});
13+
<%= name %>.schema.post('remove', function (doc) {
14+
onRemove(socket, doc);
15+
});
16+
}
17+
18+
function onSave(socket, doc, cb) {
19+
socket.emit('<%= name %>:save', doc);
20+
}
21+
22+
function onRemove(socket, doc, cb) {
23+
socket.emit('<%= name %>:remove', doc);
24+
}

endpoint/templates/name.spec.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
3+
var should = require('should');
4+
var app = require('../../app');
5+
var request = require('supertest');
6+
7+
describe('GET /api/<%= name %>s', function() {
8+
9+
it('should respond with JSON array', function(done) {
10+
request(app)
11+
.get('/api/things')
12+
.expect(200)
13+
.expect('Content-Type', /json/)
14+
.end(function(err, res) {
15+
if (err) return done(err);
16+
res.body.should.be.instanceof(Array);
17+
done();
18+
});
19+
});
20+
});

script-base.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ var Generator = module.exports = function Generator() {
1818
this.cameledName = this._.camelize(this.name);
1919
this.classedName = this._.classify(this.name);
2020

21-
this.sourceRoot(path.join(__dirname, sourceRoot));
21+
this.filters = this.config.get('filters');
22+
this.sourceRoot(path.join(__dirname, '/templates'));
2223
};
2324

2425
util.inherits(Generator, yeoman.generators.NamedBase);

util.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ function processDirectory (self, source, destination) {
108108

109109
files.forEach(function(f) {
110110
var filteredFile = filterFile(f);
111+
if(self.name) {
112+
filteredFile.name = filteredFile.name.replace('name', self.name);
113+
}
111114
var name = filteredFile.name;
112115
var copy = false, stripped;
113116

0 commit comments

Comments
 (0)