'use strict'; const assert = require('assert'); const _ = require('lodash'); const moment = require('moment'); const { ObjectId } = require('mongoose').Types; const { CrudService } = require('naf-framework-mongoose/lib/service'); const { BusinessError, ErrorCode } = require('naf-core').Error; class RoleService extends CrudService { constructor(ctx) { super(ctx, 'role'); this.model = this.ctx.model.Role; this.Menumodel = this.ctx.model.Menu; } async update(data) { const { menu, id } = data; // 将有子目录的目录删除掉,保存 let haveChild = await this.Menumodel.find({ _id: menu.map(i => ObjectId(i)) }); haveChild = JSON.parse(JSON.stringify(haveChild)); // 过滤出子目录是父级目录的目录项 const nmenu = haveChild.filter(f => !haveChild.find(cf => cf.pid === f._id)); data.menu = nmenu.map(i => i._id); const res = await this.model.update({ _id: id }, data); return res; } async getRoleMenuTree({ project, type, userid }) { assert(project, '缺少需要查找的项目信息'); assert(type, '缺少需要查找角色代码'); // 找到这个角色的所有权限 const res = await this.model.findOne({ project, type }); if (!res) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定角色'); let { menu } = res; // console.log(res); const object = {}; // // 找到用户的角色对应的权限 let roleMenu = await this.Menumodel.find({ project }).sort({ sort: -1 }); if (roleMenu.length > 0) { // 将用户角色部分得到权限限制住,不允许改,必须有 roleMenu = JSON.parse(JSON.stringify(roleMenu)); roleMenu = roleMenu.map(i => { const { _id } = i; if (menu.includes(_id)) i.disabled = true; return i; }); // 需要查看所有有子目录的目录,子目录disabled是否全为true,全为true,则他自己也是true,否则不用变 // 整理成树状图格式 roleMenu = await this.ctx.service.menu.toFindChildren(roleMenu); } object.menu = roleMenu; // 如果有userid,说明还需要找到这个用户的特有的权限,合并到selected中 if (userid) { const umRes = await this.ctx.service.userMenu.findUserMenu({ project, userid }); if (umRes) { const { menu: uMenu } = umRes; menu = [ ...menu, ...uMenu ]; } } object.selected = menu; return object; } } module.exports = RoleService;