@lcap/asl
Version:
NetEase Application Specific Language
439 lines • 14.9 kB
JavaScript
"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