role.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. const createError = require('http-errors');
  2. const express = require('express');
  3. const router = express.Router();
  4. const models = require('../../../models');
  5. const utils = require('../../../libs/utils');
  6. const auth = require('../../../libs/auth');
  7. const isOwner = (item, req) => item.user && item.user._id == req.session.user._id;
  8. router.get('/pager/headers', auth.need('read:own', 'role'), utils.pager.getHeadersBuilder(models.Role));
  9. router.get('/pager', auth.need('read:own', 'role'), (req, res, next) => {
  10. (async () => {
  11. let ac = await auth.getAc(req);
  12. if (!ac.can('user').readAny('role').granted) {
  13. req.query.base = { user: req.session.user._id };
  14. }
  15. next();
  16. })().catch(next)
  17. }, utils.pager.getListBuilder(models.Role, [{ path: 'user', select: 'username' }], isOwner));
  18. router.get('/options', auth.need('read:own', 'user'), function (req, res, next) {
  19. (async function () {
  20. let ac = await auth.getAc(req);
  21. if (ac.can('user').createAny('user').granted) { //all roles
  22. let roles = await models.Role.find().select('name').lean()
  23. res.json(roles.map(r => ({ label: r.name, value: r._id })));
  24. } else {
  25. //用户创建的角色
  26. let roles = await models.Role.find({ user: req.session.user._id }).select('name').lean()
  27. //用户拥有的角色
  28. let userDoc = await models.User.findById(req.session.user._id).populate({ path: 'roles', select: 'name' }).lean();
  29. roles = roles.concat(userDoc.roles);
  30. console.log('roles:', roles);
  31. //去除重复
  32. let result = roles.filter((role, index) => {
  33. let myIndex = roles.findIndex(r => r._id.equals(role._id));
  34. console.log(index, myIndex);
  35. return myIndex === index;
  36. }).map(r => ({ label: r.name, value: r._id }))
  37. res.json(result);
  38. }
  39. })().catch(next);
  40. });
  41. // 直接取角色对应的用户列表
  42. router.get('/options2', auth.need('read:own', 'user'), function (req, res, next) {
  43. (async function () {
  44. let ac = await auth.getAc(req);
  45. if (ac.can('user').createAny('user').granted) { //all roles
  46. let roles = await models.Role.find().select('name').lean()
  47. for (let ro of roles) {
  48. let users = await models.UserRole.find({ 'role': ro._id }).lean() || [];
  49. users = users.map(e => e.user);
  50. ro.users = users;
  51. }
  52. res.json(roles.map(r => ({ label: r.name, value: r.users })));
  53. }
  54. })().catch(next);
  55. });
  56. router.post('/', auth.need('create:own', 'role'), function (req, res, next) {
  57. (async function () {
  58. //await utils.async.delay(500);
  59. let data = req.body;
  60. let { name, grants } = data;
  61. if (!name || !grants)
  62. throw createError(400, '参数错误');
  63. let user = req.session.user._id;
  64. let role = models.Role({ name, grants, user })
  65. role = await role.save();
  66. res.json({ msg: 'ok' });
  67. })().catch(next);
  68. });
  69. router.patch('/:id', auth.need('update:own', 'role'), function (req, res, next) {
  70. (async function () {
  71. //await utils.async.delay(500);
  72. let { id } = req.params;
  73. utils.validators.validateId(id);
  74. let role = await models.Role.findById(id);
  75. if (!role) throw createError(404, '角色不存在');
  76. let ac = await auth.getAc(req);
  77. if (!ac.can('user').updateAny('role').granted && role.user != req.session.user._id) {
  78. throw createError(403, '没有权限');
  79. }
  80. let { name, grants } = req.body;
  81. if (!name || !grants)
  82. throw createError(400, '参数错误');
  83. role.set({ name, grants });
  84. role = await role.save();
  85. res.json({ msg: 'ok' });
  86. })().catch(next);
  87. });
  88. router.delete('/:id', auth.need('delete:own', 'role'), function (req, res, next) {
  89. (async function () {
  90. //await utils.async.delay(500);
  91. let { id } = req.params;
  92. utils.validators.validateId(id);
  93. let role = await models.Role.findById(id);
  94. if (!role) throw createError(404, '角色不存在');
  95. let ac = await auth.getAc(req);
  96. if (!ac.can('user').deleteAny('role').granted && role.user != req.session.user._id) {
  97. throw createError(403, '没有权限');
  98. }
  99. if (!role.user)
  100. throw createError(400, '预定义角色不能删除')
  101. await role.delete();
  102. res.json(role)
  103. })().catch(next);
  104. });
  105. router.get('/:id', auth.need('read:own', 'role'), function (req, res, next) {
  106. (async function () {
  107. //await utils.async.delay(500);
  108. let { id } = req.params;
  109. utils.validators.validateId(id);
  110. let role = await models.Role.findById(id).lean();
  111. let ac = await auth.getAc(req);
  112. if (!ac.can('user').deleteAny('role').granted && role.user != req.session.user._id) {
  113. throw createError(403, '没有权限');
  114. }
  115. if (!role) throw createError(404, '角色不存在');
  116. res.json(role)
  117. })().catch(next);
  118. });
  119. router.get('/auth/config', auth.need('read:own', 'role'), function (req, res, next) {
  120. (async function () {
  121. let { resources, actions, possessions } = auth.base;
  122. res.json({ resources, actions, possessions });
  123. })().catch(next);
  124. });
  125. module.exports = router;