baucis-decorator-guests
Version:
Automatically creates unauthenticated users as guests and reserves guest names.
93 lines (84 loc) • 2.16 kB
JavaScript
;
// modules
var baucis = require('baucis');
var mongoose = require('mongoose');
var ObjectId = mongoose.Types.ObjectId;
var auth = require('baucis-decorator-auth');
/**
* Automatically creates unauthenticated users as guests, and reserves guest
* names.
*
* @param {Object} app Express application
* @api public
*/
exports = module.exports = guests;
function guests (app) {
return function () {
// if not logged in, create guest
app.use(function (req, res, next) {
if (req.session.userId) {
next();
} else {
createGuest.call(this, function (err, props) {
if (err) {
next(err);
} else {
auth.setUserId.call(this, req.session, props);
next();
}
});
}
}.bind(this));
// reserve Guest names
this.request('post put', function (req, res, next) {
if (/^Guest[0-9]+$/i.test(req.body && req.body.name)) {
next(baucis.Error.Forbidden({message: 'Guest names are reserved.'}));
} else {
next();
}
});
}
}
/**
* Creates a guest.
*
* @param {Function} callback
* @api public
*/
exports.createGuest = createGuest;
function createGuest (callback) {
var Model = this.model();
Model.count(function (err, count) {
var guest;
var guestId;
var guestLevel;
var guestProps;
if (err) {
console.log('Error getting guest count:', err);
callback(err);
return;
}
guestId = ObjectId();
guestLevel = 0;
guestProps = {};
guestProps._id = guestId;
guestProps.createdBy = guestId;
guestProps.modifiedBy = guestId;
guestProps.name = 'Guest'+count;
guestProps.email = guestId+'@loggur.com';
guestProps.editors = [guestId];
guestProps.level = guestLevel;
guest = new Model(guestProps);
guest.save(function (err, userDoc) {
if (!err && userDoc.id != guestId) {
err = new Error('ID mismatch?');
}
if (err) {
console.log('Error creating guest:', err);
callback(err);
} else {
callback(null, userDoc);
}
});
});
}