Files
nocobase/packages/plugins/@nocobase/plugin-mobile/src/server/plugin.ts
T

91 lines
2.6 KiB
TypeScript

/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { Model } from '@nocobase/database';
import { Plugin } from '@nocobase/server';
export class PluginMobileServer extends Plugin {
async load() {
this.registerActionHandlers();
this.bindNewMenuToRoles();
this.setACL();
}
setACL() {
this.app.acl.registerSnippet({
name: `ui.mobile`,
actions: ['mobileRoutes:create', 'mobileRoutes:update', 'mobileRoutes:move', 'mobileRoutes:destroy'],
});
this.app.acl.registerSnippet({
name: `pm.mobile`,
actions: ['mobileRoutes:list', 'roles.mobileRoutes:*'],
});
this.app.acl.allow('mobileRoutes', 'listAccessible', 'loggedIn');
}
/**
* used to implement: roles with permission (allowNewMobileMenu is true) can directly access the newly created menu
*/
bindNewMenuToRoles() {
this.app.db.on('roles.beforeCreate', async (instance: Model) => {
instance.set('allowNewMobileMenu', ['admin', 'member'].includes(instance.name));
});
this.app.db.on('mobileRoutes.afterCreate', async (instance: Model, { transaction }) => {
const addNewMenuRoles = await this.app.db.getRepository('roles').find({
filter: {
allowNewMobileMenu: true,
},
transaction,
});
// @ts-ignore
await this.app.db.getRepository('mobileRoutes.roles', instance.id).add({
tk: addNewMenuRoles.map((role) => role.name),
transaction,
});
});
}
registerActionHandlers() {
this.app.resourceManager.registerActionHandler('mobileRoutes:listAccessible', async (ctx, next) => {
const mobileRoutesRepository = ctx.db.getRepository('mobileRoutes');
const rolesRepository = ctx.db.getRepository('roles');
if (ctx.state.currentRole === 'root') {
ctx.body = await mobileRoutesRepository.find({
tree: true,
...ctx.query,
});
return await next();
}
const role = await rolesRepository.findOne({
filterByTk: ctx.state.currentRole,
appends: ['mobileRoutes'],
});
const mobileRoutesId = role.get('mobileRoutes').map((item) => item.id);
ctx.body = await mobileRoutesRepository.find({
tree: true,
...ctx.query,
filter: {
id: mobileRoutesId,
},
});
await next();
});
}
}
export default PluginMobileServer;