UNPKG

we-plugin-acl

Version:

Role-based access control (RBAC) for We.js framework

264 lines (234 loc) 6.07 kB
/** * Roles controller */ module.exports = { /** * Action for register one user role * * @apiName role.create * @apiGroup role * * @apiParam {String} `name` Role name * @apiParam {String} `description` Descrição do role * * @module Controller * * @param {Object} `req` Express.js request * @param {Object} `res` Express.js response * * @successResponse 201 */ create(req, res) { const name = req.body.name, description = req.body.description; if (req.method == 'POST') { req.we.acl.createRole({ name: name, description: description, permissions: [] }, (err, role)=> { if (err) { req.we.log.error('role:create: error on create role', err); res.serverError(); } else { if (res.locals.redirectTo) { return res.goTo(res.locals.redirectTo); } res.ok(role); } }); } else { res.ok(); } }, /** * Action for find all roles in this system * * @apiName role.find * @apiGroup role * * @param {Object} req Express.js request * @param {Object} res Express.js response * * @module Controller * * @successResponse 200 */ find(req, res, next) { res.locals.data = {}; res.locals.redirectTo = req.we.utils.getRedirectUrl(req, res); for (let name in req.we.acl.roles) { if (!req.we.acl.roles[name].isSystemRole) res.locals.data[name] = req.we.acl.roles[name]; } if (req.method == 'POST' && req.body.action == 'create') { return req.we.controllers.role.create(req, res, next); } else if (req.method == 'POST' && req.body.action == 'delete') { return req.we.controllers.role.delete(req, res, next); } res.ok(); }, /** * Action for update user roles * * @apiName role.updateUserRoles * @apiGroup role * * @apiParam {Array} `userRoles` New user roles name array * * @module Controller * * @param {Object} `req` Express.js request * @param {Object} `res` Express.js response * * @successResponse 200 */ updateUserRoles(req, res, next) { const we = req.we; we.db.models.user .findOne({ where: { id: req.params.userId } }) .nodeify( (err, u)=> { if (err) return res.queryError(err); if (!u) { next(); return null; } res.locals.data = u; if (req.method == 'POST') { const rolesToSave = []; let rn; const UR = req.body.userRoles; // get role object related to id and skip invalid ids if (we.utils._.isArray(UR)) { // multiple roles for (rn in we.acl.roles) { if ( UR.indexOf( we.acl.roles[rn].name ) > -1 || UR.indexOf( rn ) > -1 ) { rolesToSave.push(rn); } } } else { // single role for (rn in we.acl.roles) { if (UR == we.acl.roles[rn].name) { rolesToSave.push(rn); break; } } } res.locals.rolesTable = buildUserRolesVar(res, u, we); u.setRoles(rolesToSave) .nodeify( (err)=> { if (err) return res.queryError(err); res.addMessage('success', 'role.updateUserRoles.success'); res.status(200).send(); }); } else { res.locals.roles = we.acl.roles; res.locals.rolesTable = buildUserRolesVar(res, u, we); res.ok(); } }); }, /** * Add one permission to role action * * @apiName role.addPermissionToRole * @apiGroup role * * @module Controller * * @param {Object} `req` Express.js request * @param {Object} `res` Express.js response * * @successResponse 200 */ addPermissionToRole(req, res, next) { const we = req.we; if ( !we.acl.roles[req.params.roleName] || !we.acl.permissions[req.params.permissionName] ) return next(); we.acl.addPermissionToRole(req.params.roleName, req.params.permissionName, (err)=> { if (err) return res.serverError(err); res.ok(we.acl.roles[req.params.roleName]); }); }, /** * Remove permission from role action * * @apiName role.removePermissionFromRole * @apiGroup role * * @module Controller * * @param {Object} `req` Express.js request * @param {Object} `res` Express.js response * * @successResponse 204 */ removePermissionFromRole(req, res, next) { const we = req.we; if (!we.acl.roles[req.params.roleName]) { we.log.warn('Role not found: ',req.params.roleName); return next(); } if (!we.acl.permissions[req.params.permissionName]) { we.log.warn('Permission not found: ',req.params.permissionName); return next(); } we.acl.removePermissionFromRole(req.params.roleName, req.params.permissionName, (err)=> { if (err) return res.serverError(err); res.deleted(); }); }, /** * Delete one role * * @apiName role.delete * @apiGroup role * * @module Controller * * @param {Object} `req` Express.js request * @param {Object} `res` Express.js response * * @successResponse 200 */ delete(req, res) { req.we.acl.deleteRole(req.body.name, (err)=> { if (err) { req.we.log.error('role:delete: error on delete role', err); return res.serverError(); } if (res.locals.redirectTo) return res.goTo(res.locals.redirectTo); return res.ok(); }); } }; /** * Build user roles Var */ function buildUserRolesVar(res, u, we) { let checked, rolesTable = []; for (let roleName in we.acl.roles) { checked = false; for (let i = 0; i < u.roles.length; i++) { if (u.roles[i] === roleName) { checked = true; break; } } rolesTable.push({ name: roleName, checked: checked, role: we.acl.roles[roleName] }); } return rolesTable; }