UNPKG

baucis-decorator-guests

Version:

Automatically creates unauthenticated users as guests and reserves guest names.

93 lines (84 loc) 2.16 kB
'use strict'; // 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); } }); }); }