UNPKG

kibana-with-account

Version:

kibana-with-account is develop based kibana project

598 lines (482 loc) 13.7 kB
var Async = require('async'); var Joi = require('joi'); var Hoek = require('hoek'); var AuthPlugin = require('../auth'); exports.register = function (server, options, next) { options = Hoek.applyToDefaults({basePath: ''}, options); server.route({ method: 'GET', path: options.basePath + '/accounts', config: { auth: { strategy: 'session', scope: 'admin' }, validate: { query: { username: Joi.string().allow(''), fields: Joi.string(), sort: Joi.string().default('_id'), limit: Joi.number().default(20), page: Joi.number().default(1) } } }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; var query = {}; if (request.query.username) { query['user.name'] = new RegExp('^.*?' + request.query.username + '.*$', 'i'); } var fields = request.query.fields; var sort = request.query.sort; var limit = request.query.limit; var page = request.query.page; Account.pagedFind(query, fields, sort, limit, page, function (err, results) { if (err) { return reply(err); } reply(results); }); } }); server.route({ method: 'GET', path: options.basePath + '/accounts/{id}', config: { auth: { strategy: 'session', scope: 'admin' } }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; Account.findById(request.params.id, function (err, account) { if (err) { return reply(err); } if (!account) { return reply({message: 'Document not found.'}).code(404); } reply(account); }); } }); server.route({ method: 'GET', path: options.basePath + '/accounts/my', config: { auth: { strategy: 'session', scope: 'account' } }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; var id = request.auth.credentials.roles.account._id.toString(); var fields = Account.fieldsAdapter('user name timeCreated'); Account.findById(id, fields, function (err, account) { if (err) { return reply(err); } if (!account) { return reply({message: 'Document not found. That is strange.'}).code(404); } reply(account); }); } }); server.route({ method: 'POST', path: options.basePath + '/accounts', config: { auth: { strategy: 'session', scope: 'admin' }, validate: { payload: { name: Joi.string().required() } } }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; var name = request.payload.name; Account.create(name, function (err, account) { if (err) { return reply(err); } reply(account); }); } }); server.route({ method: 'PUT', path: options.basePath + '/accounts/{id}', config: { auth: { strategy: 'session', scope: 'admin' }, validate: { payload: { nameFirst: Joi.string().required(), nameMiddle: Joi.string().allow('', null), nameLast: Joi.string().required() } } }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; var id = request.params.id; var update = { $set: { name: { first: request.payload.nameFirst, middle: request.payload.nameMiddle, last: request.payload.nameLast } } }; Account.findByIdAndUpdate(id, update, function (err, account) { if (err) { return reply(err); } if (!account) { return reply({message: 'Document not found.'}).code(404); } reply(account); }); } }); server.route({ method: 'PUT', path: options.basePath + '/accounts/my', config: { auth: { strategy: 'session', scope: 'account' }, validate: { payload: { nameFirst: Joi.string().required(), nameMiddle: Joi.string().allow(''), nameLast: Joi.string().required() } } }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; var id = request.auth.credentials.roles.account._id.toString(); var update = { $set: { name: { first: request.payload.nameFirst, middle: request.payload.nameMiddle, last: request.payload.nameLast } } }; var findOptions = { fields: Account.fieldsAdapter('user name timeCreated') }; Account.findByIdAndUpdate(id, update, findOptions, function (err, account) { if (err) { return reply(err); } reply(account); }); } }); server.route({ method: 'PUT', path: options.basePath + '/accounts/{id}/user', config: { auth: { strategy: 'session', scope: 'admin' }, validate: { payload: { username: Joi.string().lowercase().required() } }, pre: [{ assign: 'account', method: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; Account.findById(request.params.id, function (err, account) { if (err) { return reply(err); } if (!account) { return reply({message: 'Document not found.'}).takeover().code(404); } reply(account); }); } }, { assign: 'user', method: function (request, reply) { var User = request.server.plugins['hapi-mongo-models'].User; User.findByUsername(request.payload.username, function (err, user) { if (err) { return reply(err); } if (!user) { return reply({message: 'User document not found.'}).takeover().code(404); } if (user.roles && user.roles.account && user.roles.account.id !== request.params.id) { var response = { message: 'User is already linked to another account. Unlink first.' }; return reply(response).takeover().code(409); } reply(user); }); } }, { assign: 'userCheck', method: function (request, reply) { if (request.pre.account.user && request.pre.account.user.id !== request.pre.user._id.toString()) { var response = { message: 'Account is already linked to another user. Unlink first.' }; return reply(response).takeover().code(409); } reply(true); } }] }, handler: function (request, reply) { Async.auto({ account: function (done) { var Account = request.server.plugins['hapi-mongo-models'].Account; var id = request.params.id; var update = { $set: { user: { id: request.pre.user._id.toString(), name: request.pre.user.username } } }; Account.findByIdAndUpdate(id, update, done); }, user: function (done) { var User = request.server.plugins['hapi-mongo-models'].User; var id = request.pre.user._id; var update = { $set: { 'roles.account': { id: request.pre.account._id.toString(), name: request.pre.account.name.first + ' ' + request.pre.account.name.last } } }; User.findByIdAndUpdate(id, update, done); } }, function (err, results) { if (err) { return reply(err); } reply(results.account); }); } }); server.route({ method: 'DELETE', path: options.basePath + '/accounts/{id}/user', config: { auth: { strategy: 'session', scope: 'admin' }, pre: [{ assign: 'account', method: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; Account.findById(request.params.id, function (err, account) { if (err) { return reply(err); } if (!account) { return reply({message: 'Document not found.'}).takeover().code(404); } if (!account.user || !account.user.id) { return reply(account).takeover(); } reply(account); }); } }, { assign: 'user', method: function (request, reply) { var User = request.server.plugins['hapi-mongo-models'].User; User.findById(request.pre.account.user.id, function (err, user) { if (err) { return reply(err); } if (!user) { return reply({message: 'User document not found.'}).takeover().code(404); } reply(user); }); } }] }, handler: function (request, reply) { Async.auto({ account: function (done) { var Account = request.server.plugins['hapi-mongo-models'].Account; var id = request.params.id; var update = { $unset: { user: undefined } }; Account.findByIdAndUpdate(id, update, done); }, user: function (done) { var User = request.server.plugins['hapi-mongo-models'].User; var id = request.pre.user._id.toString(); var update = { $unset: { 'roles.account': undefined } }; User.findByIdAndUpdate(id, update, done); } }, function (err, results) { if (err) { return reply(err); } reply(results.account); }); } }); server.route({ method: 'POST', path: options.basePath + '/accounts/{id}/notes', config: { auth: { strategy: 'session', scope: 'admin' }, validate: { payload: { data: Joi.string().required() } } }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; var id = request.params.id; var update = { $push: { notes: { data: request.payload.data, timeCreated: new Date(), userCreated: { id: request.auth.credentials.user._id.toString(), name: request.auth.credentials.user.username } } } }; Account.findByIdAndUpdate(id, update, function (err, account) { if (err) { return reply(err); } reply(account); }); } }); server.route({ method: 'POST', path: options.basePath + '/accounts/{id}/status', config: { auth: { strategy: 'session', scope: 'admin' }, validate: { payload: { status: Joi.string().required() } }, pre: [{ assign: 'status', method: function (request, reply) { var Status = request.server.plugins['hapi-mongo-models'].Status; Status.findById(request.payload.status, function (err, status) { if (err) { return reply(err); } reply(status); }); } }] }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; var id = request.params.id; var newStatus = { id: request.pre.status._id.toString(), name: request.pre.status.name, timeCreated: new Date(), userCreated: { id: request.auth.credentials.user._id.toString(), name: request.auth.credentials.user.username } }; var update = { $set: { 'status.current': newStatus }, $push: { 'status.log': newStatus } }; Account.findByIdAndUpdate(id, update, function (err, account) { if (err) { return reply(err); } reply(account); }); } }); server.route({ method: 'DELETE', path: options.basePath + '/accounts/{id}', config: { auth: { strategy: 'session', scope: 'admin' }, pre: [ AuthPlugin.preware.ensureAdminGroup('root') ] }, handler: function (request, reply) { var Account = request.server.plugins['hapi-mongo-models'].Account; Account.findByIdAndDelete(request.params.id, function (err, account) { if (err) { return reply(err); } if (!account) { return reply({message: 'Document not found.'}).code(404); } reply({message: 'Success.'}); }); } }); next(); }; exports.register.attributes = { name: 'account' };