user-menu.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 UserMenuService extends CrudService {
  9. constructor(ctx) {
  10. super(ctx, 'usermenu');
  11. this.model = this.ctx.model.UserMenu;
  12. this.Rolemodel = this.ctx.model.Role;
  13. this.Menumodel = this.ctx.model.Menu;
  14. }
  15. async create(data) {
  16. const { project, userid } = data;
  17. let res;
  18. res = await this.model.findOne({ project, userid });
  19. if (res) {
  20. res = await this.model.update({ project, userid }, data);
  21. } else {
  22. res = await this.model.create(data);
  23. }
  24. return res;
  25. }
  26. async findUserMenu({ project, userid }) {
  27. assert(project, '缺少需要查找的项目信息');
  28. assert(userid, '缺少用户信息');
  29. const res = await this.model.findOne({ project, userid });
  30. return res;
  31. }
  32. async getUserMenu({ project, type, userid }) {
  33. assert(project, '缺少需要查找的项目信息');
  34. assert(type, '缺少需要查找角色代码');
  35. assert(userid, '缺少需要查找用户信息');
  36. // 找到这个角色的权限,找到用户权限,合并在一起
  37. // 找到这个角色的所有权限
  38. const menuids = [];
  39. const res = await this.Rolemodel.findOne({ project, type });
  40. if (!res) { throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定角色'); }
  41. const { menu: roleMenu, params } = res;
  42. // roleMenu只存id
  43. menuids.push(...roleMenu);
  44. // 找到用户的特殊权限
  45. if (userid !== 'dev') {
  46. const umidsRes = await this.ctx.service.userMenu.findUserMenu({ project, userid });
  47. if (umidsRes) {
  48. const { menu: uMenuids } = umidsRes;
  49. // uMenuids只存id
  50. menuids.push(...uMenuids);
  51. }
  52. }
  53. // 找到所有菜单的父级,下面过滤用,把父级目录拿出来(不单纯是根目录)
  54. const parentIdsRes = await this.Menumodel.find({ _id: menuids.map(i => ObjectId(i)) }, 'pid');
  55. let parentIds = parentIdsRes.map(i => i.pid);
  56. parentIds = _.compact(parentIds);
  57. menuids.push(...parentIds);
  58. // 找到该项目的所有的权限
  59. const allMenu = await this.Menumodel.find({ project, disabled: false }).sort({ sort: -1 });
  60. // 需要将根目录整理出来,将
  61. const dup = allMenu.filter(f => menuids.find(um => ObjectId(um).equals(f._id)));
  62. const userMenu = await this.ctx.service.menu.toFindChildren(dup);
  63. return { menu: userMenu, params };
  64. }
  65. }
  66. module.exports = UserMenuService;