UNPKG

@lcap/asl

Version:

NetEase Application Specific Language

439 lines 14.9 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Nuims = void 0; const decorators_1 = require("../decorators"); const __1 = require(".."); const nuims_1 = __importDefault(require("../../service/nuims")); const roleName2Permission = new Map(); class Nuims { /** * @param source 需要合并的部分参数 */ constructor(source) { /** * App Name */ this.domainName = undefined; /** * 上报权限后的资源id */ this.resourceId = undefined; /** * view */ this.view = undefined; /** * element */ this.element = undefined; const { domainName } = source; Object.assign(this, source); if (!domainName) { throw new Error('Nuims need domainName!'); } } async getInitRoles() { let isCreated = false; let resource = await this.getResource(); if (!resource) { isCreated = true; resource = await this.createResource(); } const { ResourceId, ResourceValue } = resource; Object.assign(this, { resourceId: ResourceId }); const roles = await this.getRoles(); const initRoles = await Promise.all(roles.map(async (role) => { const roleItem = role; let permission = await this.getDefaultPermissionForRole(role); if (permission) { permission.PermissionValue = permission.PermissionValue || `${role.RoleName}-default-permission`; } else { permission = await this.createDefaultPermission(role); await this.bindRolesAndPermissions(role, permission); } roleName2Permission.set(role.RoleName, permission); // 创建 /dashboard 资源时自动关联 DEV-AdminRole 权限 if (isCreated && (ResourceValue === '/dashboard' || ((ResourceValue === '/index' || ResourceValue === '/user') && __1.config.scope === 'h5')) && role.RoleName === 'DEV-AdminRole') { await this.attachPermissionResourceAction(); } roleItem.permission = permission; const resources = await this.getResourcesFromPermission(permission); roleItem.checked = !!resources.find((resource) => resource.ResourceId === ResourceId); roleItem.toggling = false; return roleItem; })); return initRoles; } /** * 绑定dev权限 * 用于用户创建页面、子页面的时候 * @returns */ async attachDevRole() { // 获取权限树资源Id let resource = await this.getResource(); if (!resource) { resource = await this.createResource(); } Object.assign(this, { resourceId: resource.ResourceId }); // 处理角色与默认权限 await this.handleDefaultPermisssionForRole(); // 绑定Dev role权限与资源 await this.attachPermissionResourceAction(); } async handleDefaultPermisssionForRole() { // 获取角色列表 const roles = await this.getRoles(); // 遍历角色列表,如果角色没有关联的默认权限,创建默认权限 const promises = roles.map(async (role) => { let permission = await this.getDefaultPermissionForRole(role); if (permission) { permission.PermissionValue = permission.PermissionValue || `${role.RoleName}-default-permission`; } else { permission = await this.createDefaultPermission(role); await this.bindRolesAndPermissions(role, permission); } roleName2Permission.set(role.RoleName, permission); }); await Promise.all(promises); } /** * 获取当前资源 */ async getResource() { const resourceValue = this.getResourceValue(); const resource = await this.getResourceFromResourceValue(resourceValue); return resource; } /** * 创建资源 */ async createResource() { const resourceValue = this.getResourceValue(); await this.createResourceFromResourceValue(resourceValue); const resource = await this.getResourceFromResourceValue(resourceValue); return resource; } /** * 批量创建资源,创建当前 View / Element 及其子页面/元素关联的所有资源 */ async createResources() { if (this.element) { this.createElementResources(this.element); } } /** * 批量创建资源,创建 Element 及其子元素关联的所有资源 */ createElementResources(element) { this.createResourceFromResourceValue(this.getResourceValueFromElement(element)); const { children } = element; if (children.length) { children.forEach((child) => { this.createElementResources(child); }); } } /** * 删除当前 View / Element 及其子页面/元素关联的所有资源 */ deleteResources() { if (this.element) { this.deleteElementResources(this.element); } else { this.deleteViewResources(this.view); } } /** * 批量删除资源,删除 View 及其子页面关联的所有资源 */ deleteViewResources(view) { const { children, tempPath } = view; this.deleteResourceFromResourceValue(tempPath); if (children.length) { children.forEach((child) => { this.deleteViewResources(child); }); } } /** * 批量删除资源,删除 Element 及其子元素关联的所有资源 */ deleteElementResources(element) { this.deleteResourceFromResourceValue(this.getResourceValueFromElement(element)); const { children } = element; if (children.length) { children.forEach((child) => { this.deleteElementResources(child); }); } } /** * 根据 resourceValue 获取关联资源 */ async getResourceFromResourceValue(resourceValue) { if (!resourceValue) return; const { Data: resources } = await nuims_1.default.getResources({ query: { Limit: 1000, }, body: { filter: { DomainName: this.domainName, ResourceValue: resourceValue, ResourceType: 'ui', }, }, }); return resources.find((item) => item.ResourceValue === resourceValue); } /** * 根据 resourceValue 创建关联资源 */ async createResourceFromResourceValue(resourceValue) { if (!resourceValue) return; await nuims_1.default.createResources({ body: [{ DomainName: this.domainName, ResourceValue: resourceValue, ResourceType: 'ui', Description: this.getDescription(), }], }); } /** * 根据 resourceValue 删除关联资源 */ async deleteResourceFromResourceValue(resourceValue) { if (!resourceValue) return; try { await nuims_1.default.deleteResources({ body: [{ DomainName: this.domainName, ResourceValue: resourceValue, ResourceType: 'ui', }], config: { noErrorTip: true }, }); } catch (error) { console.error(error); } } /** * 根据 resourceValue 编辑关联资源 */ async editResourceFromResourceValue(resourceValue) { if (!resourceValue) return; const oldResource = await this.getResourceFromResourceValue(resourceValue); if (!oldResource) { return; } const { ResourceId } = oldResource; Object.assign(this, { resourceId: ResourceId }); await nuims_1.default.editResources({ body: [{ ResourceId, ResourceValue: this.getResourceValue() }], config: { noErrorTip: true }, }); } /** * 根据 Permission 获取关联资源 */ async getResourcesFromPermission(permission) { const res = await nuims_1.default.getPermissionResources({ query: { Limit: 1000, }, body: { DomainName: this.domainName, PermissionValue: permission.PermissionValue, filter: {}, }, }); return res.Data; } getResourceValueFromElement(element) { return element.name ? `${element.view.tempPath}/${element.name}` : null; } getResourceValue() { return this.element ? this.getResourceValueFromElement(this.element) : this.view.tempPath; } getDescription() { return this.element ? this.element.view.title : this.view.title; } /** * 获取角色列表 */ async getRoles() { const res = await nuims_1.default.getRoles({ query: { DomainName: this.domainName, }, }); return res.Data; } /** * 1.创建角色 * 2.创建角色的默认权限 * 3.绑定角色和权限 */ async createDefaultRoleFromRoleName(roleName) { if (!roleName) return; const res = await nuims_1.default.createRole({ body: { DomainName: this.domainName, RoleName: roleName, }, }); const role = res.Data; const permission = await this.createDefaultPermission(role); await this.bindRolesAndPermissions(role, permission); } async getDefaultPermissionForRole(role) { const { RoleName } = role; if (roleName2Permission.has(RoleName)) return roleName2Permission.get(RoleName); const permissionValue = `${RoleName}-default-permission`; const res = await nuims_1.default.getPermissionsForRole({ query: { Limit: 1000, }, body: { DomainName: this.domainName, RoleName, Filter: { PermissionValue: permissionValue, }, }, }); return res.Data[0]; } getPermissionResources(permission) { const { PermissionValue } = permission; return nuims_1.default.getPermissionResources({ query: { Limit: 1000, }, body: { DomainName: this.domainName, PermissionValue, filter: {}, }, }).then((res) => res.Data); } /** * 为角色创建默认权限 */ async createDefaultPermission(role) { const { RoleName } = role; if (!RoleName) return; const { domainName } = this; const permissionValue = `${RoleName}-default-permission`; const permission = await nuims_1.default.getPermissions({ body: { filter: { DomainName: domainName, PermissionValue: permissionValue, }, }, }).then((res) => res.Data[0]); if (permission) return permission; const res = await nuims_1.default.createPermission({ body: { DomainName: domainName, PermissionValue: permissionValue, }, }); return Object.assign({ DomainName: domainName, PermissionValue: permissionValue }, res.Data); } /** * 关联角色和权限 */ bindRolesAndPermissions(role, permission) { const { RoleId } = role; const { PermissionId } = permission; return nuims_1.default.bindRolesAndPermissions({ body: { RoleIdList: [RoleId], PermissionIdList: [PermissionId], }, }); } /** * 绑定权限和资源 */ async attachPermissionResourceAction() { const permission = roleName2Permission.get('DEV-AdminRole'); const { PermissionId } = permission; // 查找权限绑定的资源,如果该资源未绑定才需要调绑定接口 const resources = await this.getPermissionResources(permission); const checked = !!resources.find((item) => item.ResourceId === this.resourceId); if (checked) { return; } try { await this.attachPermissionResource(PermissionId); } catch (err) { } } /** * 解绑权限和资源 */ async attachPermissionResource(permissionId) { await nuims_1.default.attachPermissionResourceAction({ body: { PermissionId: permissionId, ResourceIdActionList: [{ ResourceId: this.resourceId }], }, config: { noErrorTip: true, }, }); } async detachPermissionResource(permissionId) { await nuims_1.default.detachPermissionResourceAction({ body: { PermissionId: permissionId, ResourceIdActionList: [{ ResourceId: this.resourceId }], }, config: { noErrorTip: true, }, }); } } __decorate([ decorators_1.immutable() ], Nuims.prototype, "domainName", void 0); __decorate([ decorators_1.immutable() ], Nuims.prototype, "resourceId", void 0); __decorate([ decorators_1.immutable() ], Nuims.prototype, "view", void 0); __decorate([ decorators_1.immutable() ], Nuims.prototype, "element", void 0); exports.Nuims = Nuims; exports.default = Nuims; //# sourceMappingURL=Nuims.js.map