Skip to content

Commit 91657d7

Browse files
committed
feat(model): abstract model events to a standard EventEmitter
closes #857, #490
1 parent 2a1f37a commit 91657d7

File tree

4 files changed

+108
-23
lines changed

4 files changed

+108
-23
lines changed

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

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* User model events
3+
*/
4+
5+
'use strict';
6+
7+
var EventEmitter = require('events').EventEmitter;<% if (filters.mongooseModels) { %>
8+
var User = require('./user.model');<% } if (filters.sequelizeModels) { %>
9+
var User = require('../../sqldb').User;<% } %>
10+
var UserEvents = new EventEmitter();
11+
12+
// Set max event listeners (0 == unlimited)
13+
UserEvents.setMaxListeners(0);
14+
15+
// Model events<% if (filters.mongooseModels) { %>
16+
var events = {
17+
'save': 'save',
18+
'remove': 'remove'
19+
};<% } if (filters.sequelizeModels) { %>
20+
var events = {
21+
'afterCreate': 'save',
22+
'afterUpdate': 'save',
23+
'afterDestroy': 'remove'
24+
};<% } %>
25+
26+
// Register the event emitter to the model events
27+
for (var e in events) {
28+
var event = events[e];<% if (filters.mongooseModels) { %>
29+
User.schema.post(e, emitEvent(event));<% } if (filters.sequelizeModels) { %>
30+
User.hook(e, emitEvent(event));<% } %>
31+
}
32+
33+
function emitEvent(event) {
34+
return function(doc<% if (filters.sequelizeModels) { %>, options, done<% } %>) {
35+
UserEvents.emit(event + ':' + doc._id, doc);
36+
UserEvents.emit(event, doc);<% if (filters.sequelizeModels) { %>
37+
done(null);<% } %>
38+
}
39+
}
40+
41+
module.exports = UserEvents;

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

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* <%= classedName %> model events
3+
*/
4+
5+
'use strict';
6+
7+
var EventEmitter = require('events').EventEmitter;<% if (filters.mongooseModels) { %>
8+
var <%= classedName %> = require('./<%= name %>.model');<% } if (filters.sequelizeModels) { %>
9+
var <%= classedName %> = require('../../sqldb').<%= classedName %>;<% } %>
10+
var <%= classedName %>Events = new EventEmitter();
11+
12+
// Set max event listeners (0 == unlimited)
13+
<%= classedName %>Events.setMaxListeners(0);
14+
15+
// Model events<% if (filters.mongooseModels) { %>
16+
var events = {
17+
'save': 'save',
18+
'remove': 'remove'
19+
};<% } if (filters.sequelizeModels) { %>
20+
var events = {
21+
'afterCreate': 'save',
22+
'afterUpdate': 'save',
23+
'afterDestroy': 'remove'
24+
};<% } %>
25+
26+
// Register the event emitter to the model events
27+
for (var e in events) {
28+
var event = events[e];<% if (filters.mongooseModels) { %>
29+
<%= classedName %>.schema.post(e, emitEvent(event));<% } if (filters.sequelizeModels) { %>
30+
<%= classedName %>.hook(e, emitEvent(event));<% } %>
31+
}
32+
33+
function emitEvent(event) {
34+
return function(doc<% if (filters.sequelizeModels) { %>, options, done<% } %>) {
35+
<%= classedName %>Events.emit(event + ':' + doc._id, doc);
36+
<%= classedName %>Events.emit(event, doc);<% if (filters.sequelizeModels) { %>
37+
done(null);<% } %>
38+
}
39+
}
40+
41+
module.exports = <%= classedName %>Events;

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

+24-23
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,32 @@
33
*/
44

55
'use strict';
6-
<% if (filters.mongoose) { %>
7-
var <%= classedName %> = require('./<%= name %>.model');<% } %><% if (filters.sequelize) { %>
8-
var <%= classedName %> = require('../../sqldb').<%= classedName %>;<% } %>
9-
10-
exports.register = function(socket) {<% if (filters.sequelize) { %>
11-
<%= classedName %>.hook('afterCreate', function(doc, fields, fn) {
12-
onSave(socket, doc);
13-
fn(null);
14-
});<% } %>
15-
<% if (filters.mongoose) { %><%= classedName %>.schema.post('save', function(doc) {<% }
16-
if (filters.sequelize) { %><%= classedName %>.hook('afterUpdate', function(doc, fields, fn) {<% } %>
17-
onSave(socket, doc);<% if (filters.sequelize) { %>
18-
fn(null);<% } %>
19-
});
20-
<% if (filters.mongoose) { %><%= classedName %>.schema.post('remove', function(doc) {<% }
21-
if (filters.sequelize) { %><%= classedName %>.hook('afterDestroy', function(doc, fields, fn) {<% } %>
22-
onRemove(socket, doc);<% if (filters.sequelize) { %>
23-
fn(null);<% } %>
24-
});
6+
7+
var <%= classedName %>Events = require('./<%= name %>.events');
8+
9+
// Model events to emit
10+
var events = ['save', 'remove'];
11+
12+
exports.register = function(socket) {
13+
// Bind model events to socket events
14+
for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
15+
var event = events[i];
16+
var listener = createListener('<%= name %>:' + event, socket);
17+
18+
<%= classedName %>Events.on(event, listener);
19+
socket.on('disconnect', removeListener(event, listener));
20+
}
2521
};
2622

27-
function onSave(socket, doc, cb) {
28-
socket.emit('<%= name %>:save', doc);
23+
24+
function createListener(event, socket) {
25+
return function(doc) {
26+
socket.emit(event, doc);
27+
};
2928
}
3029

31-
function onRemove(socket, doc, cb) {
32-
socket.emit('<%= name %>:remove', doc);
30+
function removeListener(event, listener) {
31+
return function() {
32+
<%= classedName %>Events.removeListener(event, listener);
33+
};
3334
}

Diff for: test/test-file-creation.js

+2
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ describe('angular-fullstack generator', function () {
235235
if (models) {
236236
files = files.concat([
237237
'server/api/thing/thing.model.js',
238+
'server/api/thing/thing.events.js',
238239
'server/config/seed.js'
239240
]);
240241
}
@@ -270,6 +271,7 @@ describe('angular-fullstack generator', function () {
270271
'server/api/user/user.integration.js',
271272
'server/api/user/user.model.js',
272273
'server/api/user/user.model.spec.js',
274+
'server/api/user/user.events.js',
273275
'server/auth/index.js',
274276
'server/auth/auth.service.js',
275277
'server/auth/local/index.js',

0 commit comments

Comments
 (0)