145 lines
4.3 KiB
TypeScript
145 lines
4.3 KiB
TypeScript
import { PrismaClient } from '@prisma/client';
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
const permissions = [
|
|
['dashboard.view', 'dashboard', 'view', '查看 Dashboard 指标'],
|
|
['customers.view', 'customers', 'view', '查看客户'],
|
|
['customers.manage', 'customers', 'manage', '管理客户'],
|
|
['customer_gateways.view', 'customer_gateways', 'view', '查看客户网关'],
|
|
['customer_gateways.manage', 'customer_gateways', 'manage', '管理客户网关和策略'],
|
|
['vendors.view', 'vendors', 'view', '查看供应商'],
|
|
['vendors.manage', 'vendors', 'manage', '管理供应商'],
|
|
['vendor_gateways.view', 'vendor_gateways', 'view', '查看落地网关'],
|
|
['vendor_gateways.manage', 'vendor_gateways', 'manage', '管理落地网关'],
|
|
['line_groups.view', 'line_groups', 'view', '查看落地线路组'],
|
|
['line_groups.manage', 'line_groups', 'manage', '管理落地线路组'],
|
|
['recharges.view', 'recharges', 'view', '查看充值流水'],
|
|
['recharges.manage', 'recharges', 'manage', '执行客户或供应商充值'],
|
|
['cdr.view', 'cdr', 'view', '查看话单'],
|
|
['recordings.play', 'recordings', 'play', '播放录音'],
|
|
['quality.view', 'quality', 'view', '查看质检任务'],
|
|
['quality.manage', 'quality', 'manage', '保存质检结果'],
|
|
['users.view', 'users', 'view', '查看用户'],
|
|
['users.manage', 'users', 'manage', '管理用户'],
|
|
['roles.view', 'roles', 'view', '查看角色权限'],
|
|
['roles.manage', 'roles', 'manage', '管理角色权限'],
|
|
['audit.view', 'audit', 'view', '查看操作日志']
|
|
] as const;
|
|
|
|
const roles = [
|
|
{
|
|
id: 'ROLE_SUPER_ADMIN',
|
|
name: '超级管理员',
|
|
description: '系统内置最高权限角色',
|
|
permissionIds: permissions.map(([id]) => id)
|
|
},
|
|
{
|
|
id: 'ROLE_OPERATOR',
|
|
name: '运营管理员',
|
|
description: '客户、网关、线路和话单运营',
|
|
permissionIds: [
|
|
'dashboard.view',
|
|
'customers.view',
|
|
'customers.manage',
|
|
'customer_gateways.view',
|
|
'customer_gateways.manage',
|
|
'vendors.view',
|
|
'vendor_gateways.view',
|
|
'line_groups.view',
|
|
'line_groups.manage',
|
|
'cdr.view',
|
|
'recordings.play'
|
|
]
|
|
},
|
|
{
|
|
id: 'ROLE_FINANCE',
|
|
name: '财务',
|
|
description: '充值、余额和财务流水',
|
|
permissionIds: ['dashboard.view', 'customers.view', 'vendors.view', 'recharges.view', 'recharges.manage', 'cdr.view']
|
|
},
|
|
{
|
|
id: 'ROLE_QUALITY',
|
|
name: '质检',
|
|
description: '录音抽检和质检结果维护',
|
|
permissionIds: ['dashboard.view', 'cdr.view', 'recordings.play', 'quality.view', 'quality.manage']
|
|
},
|
|
{
|
|
id: 'ROLE_TECH_OPS',
|
|
name: '技术运维',
|
|
description: '网关、线路、信令和审计排障',
|
|
permissionIds: [
|
|
'dashboard.view',
|
|
'customer_gateways.view',
|
|
'vendors.view',
|
|
'vendor_gateways.view',
|
|
'vendor_gateways.manage',
|
|
'line_groups.view',
|
|
'cdr.view',
|
|
'recordings.play',
|
|
'audit.view'
|
|
]
|
|
}
|
|
];
|
|
|
|
async function main(): Promise<void> {
|
|
await prisma.$transaction(
|
|
async (tx) => {
|
|
for (const [id, module, action, description] of permissions) {
|
|
await tx.permission.upsert({
|
|
where: { id },
|
|
update: { module, action, description },
|
|
create: { id, module, action, description }
|
|
});
|
|
}
|
|
|
|
for (const role of roles) {
|
|
await tx.role.upsert({
|
|
where: { id: role.id },
|
|
update: {
|
|
name: role.name,
|
|
description: role.description,
|
|
builtIn: true,
|
|
status: 'ENABLED'
|
|
},
|
|
create: {
|
|
id: role.id,
|
|
name: role.name,
|
|
description: role.description,
|
|
builtIn: true,
|
|
status: 'ENABLED'
|
|
}
|
|
});
|
|
|
|
for (const permissionId of role.permissionIds) {
|
|
await tx.rolePermission.upsert({
|
|
where: {
|
|
roleId_permissionId: {
|
|
roleId: role.id,
|
|
permissionId
|
|
}
|
|
},
|
|
update: {},
|
|
create: {
|
|
roleId: role.id,
|
|
permissionId
|
|
}
|
|
});
|
|
}
|
|
}
|
|
},
|
|
{
|
|
timeout: 30000
|
|
}
|
|
);
|
|
}
|
|
|
|
main()
|
|
.finally(async () => {
|
|
await prisma.$disconnect();
|
|
})
|
|
.catch((error) => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|