role.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. 'use strict';
  2. const assert = require('assert');
  3. const _ = require('lodash');
  4. const moment = require('moment');
  5. const { ObjectId } = require('mongoose').Types;
  6. const { CrudService } = require('naf-framework-mongoose/lib/service');
  7. const { BusinessError, ErrorCode } = require('naf-core').Error;
  8. class RoleService extends CrudService {
  9. constructor(ctx) {
  10. super(ctx, 'role');
  11. this.model = this.ctx.model.Role;
  12. this.Menumodel = this.ctx.model.Menu;
  13. }
  14. async update(data) {
  15. const { menu, id } = data;
  16. // 将有子目录的目录删除掉,保存
  17. let haveChild = await this.Menumodel.find({ _id: menu.map(i => ObjectId(i)) });
  18. haveChild = JSON.parse(JSON.stringify(haveChild));
  19. // 过滤出子目录是父级目录的目录项
  20. const nmenu = haveChild.filter(f => !haveChild.find(cf => cf.pid === f._id));
  21. data.menu = nmenu.map(i => i._id);
  22. const res = await this.model.update({ _id: id }, data);
  23. return res;
  24. }
  25. async getRoleMenuTree({ project, type, userid }) {
  26. assert(project, '缺少需要查找的项目信息');
  27. assert(type, '缺少需要查找角色代码');
  28. // 找到这个角色的所有权限
  29. const res = await this.model.findOne({ project, type });
  30. if (!res) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定角色');
  31. let { menu } = res;
  32. // console.log(res);
  33. const object = {};
  34. // // 找到用户的角色对应的权限
  35. let roleMenu = await this.Menumodel.find({ project }).sort({ sort: -1 });
  36. if (roleMenu.length > 0) {
  37. // 将用户角色部分得到权限限制住,不允许改,必须有
  38. roleMenu = JSON.parse(JSON.stringify(roleMenu));
  39. roleMenu = roleMenu.map(i => {
  40. const { _id } = i;
  41. if (menu.includes(_id)) i.disabled = true;
  42. return i;
  43. });
  44. // 需要查看所有有子目录的目录,子目录disabled是否全为true,全为true,则他自己也是true,否则不用变
  45. // 整理成树状图格式
  46. roleMenu = await this.ctx.service.menu.toFindChildren(roleMenu);
  47. }
  48. object.menu = roleMenu;
  49. // 如果有userid,说明还需要找到这个用户的特有的权限,合并到selected中
  50. if (userid) {
  51. const umRes = await this.ctx.service.userMenu.findUserMenu({ project, userid });
  52. if (umRes) {
  53. const { menu: uMenu } = umRes;
  54. menu = [ ...menu, ...uMenu ];
  55. }
  56. }
  57. object.selected = menu;
  58. return object;
  59. }
  60. }
  61. module.exports = RoleService;