|
|
@@ -0,0 +1,300 @@
|
|
|
+/*
|
|
|
+Copyright (C) 2023-2026 QuantumNous
|
|
|
+
|
|
|
+This program is free software: you can redistribute it and/or modify
|
|
|
+it under the terms of the GNU Affero General Public License as
|
|
|
+published by the Free Software Foundation, either version 3 of the
|
|
|
+License, or (at your option) any later version.
|
|
|
+
|
|
|
+This program is distributed in the hope that it will be useful,
|
|
|
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
+GNU Affero General Public License for more details.
|
|
|
+
|
|
|
+You should have received a copy of the GNU Affero General Public License
|
|
|
+along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
+
|
|
|
+For commercial licensing, please contact support@quantumnous.com
|
|
|
+*/
|
|
|
+
|
|
|
+/* ------------------------------------------------------------------ */
|
|
|
+/* Module-level permission data (flat list, for resource step) */
|
|
|
+/* ------------------------------------------------------------------ */
|
|
|
+
|
|
|
+/** A selectable menu module shown on the resource configuration step. */
|
|
|
+export interface PermissionModule {
|
|
|
+ /** Module name used as the checkbox label (already localized in zh). */
|
|
|
+ moduleName: string
|
|
|
+ /** Module code, e.g. `route.dashboard.view`. */
|
|
|
+ moduleCode: string
|
|
|
+ /** English label for the module. */
|
|
|
+ moduleLabel: string
|
|
|
+ /** When 1 the module is root-only: checked & disabled by default. */
|
|
|
+ isOnlyOpenForRoot: boolean
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Static list of permission modules sourced from
|
|
|
+ * `docs/permission-identifiers.json`.
|
|
|
+ */
|
|
|
+export const PERMISSION_MODULES: PermissionModule[] = [
|
|
|
+ { moduleName: '数据看板', moduleCode: 'route.dashboard.view', moduleLabel: 'Dashboard', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '配额管理', moduleCode: 'route.quota.view', moduleLabel: 'Quota Management', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '渠道管理', moduleCode: 'route.channel.view', moduleLabel: 'Provider Channels', isOnlyOpenForRoot: true },
|
|
|
+ { moduleName: '模型管理', moduleCode: 'route.models.view', moduleLabel: 'Model Management', isOnlyOpenForRoot: true },
|
|
|
+ { moduleName: '模型定价', moduleCode: 'route.model-pricing.view', moduleLabel: 'Model Pricing', isOnlyOpenForRoot: true },
|
|
|
+ { moduleName: '分组管理', moduleCode: 'route.groups.view', moduleLabel: 'Group Management', isOnlyOpenForRoot: true },
|
|
|
+ { moduleName: '企业列表', moduleCode: 'route.tenant.view', moduleLabel: 'Tenants', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '个人资料', moduleCode: 'route.profile.view', moduleLabel: 'Profile', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: 'API密钥', moduleCode: 'route.keys.view', moduleLabel: 'API Keys', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '模型列表', moduleCode: 'route.pricing.view', moduleLabel: 'Models', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '调用日志', moduleCode: 'route.usage-logs.view', moduleLabel: 'API Logs', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '审计日志', moduleCode: 'route.audit-logs.view', moduleLabel: 'Audit Logs', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '用户管理', moduleCode: 'route.user.view', moduleLabel: 'Users', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '角色管理', moduleCode: 'route.role.view', moduleLabel: 'Roles & Permissions', isOnlyOpenForRoot: false },
|
|
|
+ { moduleName: '系统信息', moduleCode: 'route.settings.view', moduleLabel: 'System Information', isOnlyOpenForRoot: true },
|
|
|
+]
|
|
|
+
|
|
|
+/** Default enabled module codes: all modules enabled by default. */
|
|
|
+export const DEFAULT_ENABLED_MODULE_CODES = PERMISSION_MODULES.map(
|
|
|
+ (m) => m.moduleCode
|
|
|
+)
|
|
|
+
|
|
|
+/* ------------------------------------------------------------------ */
|
|
|
+/* Permission tree with children (for role step) */
|
|
|
+/* ------------------------------------------------------------------ */
|
|
|
+
|
|
|
+/** A button-level permission inside a module. */
|
|
|
+export interface PermissionChildItem {
|
|
|
+ permName: string
|
|
|
+ frontPermCode: string
|
|
|
+ permLabel: string
|
|
|
+}
|
|
|
+
|
|
|
+/** A permission module with its child (button) permissions. */
|
|
|
+export interface PermissionModuleItem extends PermissionModule {
|
|
|
+ forRoleTemplateType: number
|
|
|
+ children: PermissionChildItem[]
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Full permission tree sourced from `docs/permission-identifiers.json`,
|
|
|
+ * including button-level children.
|
|
|
+ */
|
|
|
+export const PERMISSION_TREE: PermissionModuleItem[] = [
|
|
|
+ {
|
|
|
+ moduleName: '数据看板', moduleCode: 'route.dashboard.view', moduleLabel: 'Dashboard',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 10,
|
|
|
+ children: [{ permName: '查看', frontPermCode: 'dashboard.view', permLabel: 'View Dashboard' }],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '配额管理', moduleCode: 'route.quota.view', moduleLabel: 'Quota Management',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 10,
|
|
|
+ children: [{ permName: '查看', frontPermCode: 'quota.view', permLabel: 'View Quota Management' }],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '渠道管理', moduleCode: 'route.channel.view', moduleLabel: 'Provider Channels',
|
|
|
+ isOnlyOpenForRoot: true, forRoleTemplateType: 20,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'channel.view', permLabel: 'View Provider Channels' },
|
|
|
+ { permName: '新增', frontPermCode: 'channel.create', permLabel: 'Create Provider Channel' },
|
|
|
+ { permName: '编辑', frontPermCode: 'channel.update', permLabel: 'Update Provider Channel' },
|
|
|
+ { permName: '删除', frontPermCode: 'channel.delete', permLabel: 'Delete Provider Channel' },
|
|
|
+ { permName: '禁用', frontPermCode: 'channel.disable', permLabel: 'Disable Provider Channel' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '模型管理', moduleCode: 'route.models.view', moduleLabel: 'Model Management',
|
|
|
+ isOnlyOpenForRoot: true, forRoleTemplateType: 20,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'models.view', permLabel: 'View Model Management' },
|
|
|
+ { permName: '编辑', frontPermCode: 'models.update', permLabel: 'Update Model' },
|
|
|
+ { permName: '禁用', frontPermCode: 'models.disable', permLabel: 'Disable Model' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '模型定价', moduleCode: 'route.model-pricing.view', moduleLabel: 'Model Pricing',
|
|
|
+ isOnlyOpenForRoot: true, forRoleTemplateType: 20,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'model-pricing.view', permLabel: 'View Model Pricing' },
|
|
|
+ { permName: '新增', frontPermCode: 'model-pricing.add', permLabel: 'Add Model Pricing' },
|
|
|
+ { permName: '编辑', frontPermCode: 'model-pricing.edit', permLabel: 'Edit Model Pricing' },
|
|
|
+ { permName: '删除', frontPermCode: 'model-pricing.delete', permLabel: 'Delete Model Pricing' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '分组管理', moduleCode: 'route.groups.view', moduleLabel: 'Group Management',
|
|
|
+ isOnlyOpenForRoot: true, forRoleTemplateType: 20,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'groups.view', permLabel: 'View Group Management' },
|
|
|
+ { permName: '新增', frontPermCode: 'groups.create', permLabel: 'Create Group' },
|
|
|
+ { permName: '编辑', frontPermCode: 'groups.update', permLabel: 'Update Group' },
|
|
|
+ { permName: '删除', frontPermCode: 'groups.delete', permLabel: 'Delete Group' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '企业列表', moduleCode: 'route.tenant.view', moduleLabel: 'Tenants',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 20,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'tenant.view', permLabel: 'View Tenants' },
|
|
|
+ { permName: '新增', frontPermCode: 'tenant.create', permLabel: 'Create Tenant' },
|
|
|
+ { permName: '编辑', frontPermCode: 'tenant.update', permLabel: 'Update Tenant' },
|
|
|
+ { permName: '禁用', frontPermCode: 'tenant.disable', permLabel: 'Disable Tenant' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '个人资料', moduleCode: 'route.profile.view', moduleLabel: 'Profile',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 10,
|
|
|
+ children: [{ permName: '查看', frontPermCode: 'profile.view', permLabel: 'View Profile' }],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: 'API密钥', moduleCode: 'route.keys.view', moduleLabel: 'API Keys',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 10,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'keys.view', permLabel: 'View API Keys' },
|
|
|
+ { permName: '新增', frontPermCode: 'keys.create', permLabel: 'Create API Key' },
|
|
|
+ { permName: '编辑', frontPermCode: 'keys.update', permLabel: 'Update API Key' },
|
|
|
+ { permName: '删除', frontPermCode: 'keys.delete', permLabel: 'Delete API Key' },
|
|
|
+ { permName: '禁用', frontPermCode: 'keys.disable', permLabel: 'Disable API Key' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '模型列表', moduleCode: 'route.pricing.view', moduleLabel: 'Models',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 10,
|
|
|
+ children: [{ permName: '查看', frontPermCode: 'pricing.view', permLabel: 'View Models' }],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '调用日志', moduleCode: 'route.usage-logs.view', moduleLabel: 'API Logs',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 10,
|
|
|
+ children: [
|
|
|
+ { permName: '查看(仅自己)', frontPermCode: 'usage-logs.view', permLabel: 'View API Logs' },
|
|
|
+ { permName: '查看(全部数据)', frontPermCode: 'usage-logs.all', permLabel: 'View All API Logs' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '审计日志', moduleCode: 'route.audit-logs.view', moduleLabel: 'Audit Logs',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 10,
|
|
|
+ children: [
|
|
|
+ { permName: '查看(仅自己)', frontPermCode: 'audit-logs.view', permLabel: 'View Audit Logs' },
|
|
|
+ { permName: '查看(全部数据)', frontPermCode: 'audit-logs.all', permLabel: 'View All Audit Logs' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '用户管理', moduleCode: 'route.user.view', moduleLabel: 'Users',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 20,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'user.view', permLabel: 'View Users' },
|
|
|
+ { permName: '新增', frontPermCode: 'user.create', permLabel: 'Create User' },
|
|
|
+ { permName: '编辑', frontPermCode: 'user.update', permLabel: 'Update User' },
|
|
|
+ { permName: '删除', frontPermCode: 'user.delete', permLabel: 'Delete User' },
|
|
|
+ { permName: '禁用', frontPermCode: 'user.disable', permLabel: 'Disable User' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '角色管理', moduleCode: 'route.role.view', moduleLabel: 'Roles & Permissions',
|
|
|
+ isOnlyOpenForRoot: false, forRoleTemplateType: 30,
|
|
|
+ children: [
|
|
|
+ { permName: '查看', frontPermCode: 'role.view', permLabel: 'View Roles & Permissions' },
|
|
|
+ { permName: '新增', frontPermCode: 'role.create', permLabel: 'Create Role' },
|
|
|
+ { permName: '编辑', frontPermCode: 'role.update', permLabel: 'Update Role' },
|
|
|
+ { permName: '删除', frontPermCode: 'role.delete', permLabel: 'Delete Role' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ moduleName: '系统信息', moduleCode: 'route.settings.view', moduleLabel: 'System Information',
|
|
|
+ isOnlyOpenForRoot: true, forRoleTemplateType: 20,
|
|
|
+ children: [{ permName: '查看', frontPermCode: 'settings.view', permLabel: 'View System Information' }],
|
|
|
+ },
|
|
|
+]
|
|
|
+
|
|
|
+/* ------------------------------------------------------------------ */
|
|
|
+/* Default roles */
|
|
|
+/* ------------------------------------------------------------------ */
|
|
|
+
|
|
|
+/** A default role displayed on the role configuration step. */
|
|
|
+export interface DefaultRoleConfig {
|
|
|
+ /** Stable identifier for the role. */
|
|
|
+ key: string
|
|
|
+ /** Display name (Chinese). */
|
|
|
+ name: string
|
|
|
+ /** Display name (English). */
|
|
|
+ nameEn: string
|
|
|
+ /** Description (Chinese). */
|
|
|
+ description: string
|
|
|
+ /** Description (English). */
|
|
|
+ descriptionEn: string
|
|
|
+ /** When true the role's permissions cannot be modified. */
|
|
|
+ isLocked: boolean
|
|
|
+ /**
|
|
|
+ * Default permission map: moduleCode -> array of frontPermCode values
|
|
|
+ * for the enabled children.
|
|
|
+ */
|
|
|
+ permissions: Record<string, string[]>
|
|
|
+}
|
|
|
+
|
|
|
+/** Build a permission map where every module has all its children enabled. */
|
|
|
+function allPermissions(modules: PermissionModuleItem[]): Record<string, string[]> {
|
|
|
+ const result: Record<string, string[]> = {}
|
|
|
+ for (const mod of modules) {
|
|
|
+ result[mod.moduleCode] = mod.children.map((c) => c.frontPermCode)
|
|
|
+ }
|
|
|
+ return result
|
|
|
+}
|
|
|
+
|
|
|
+/** Build a view-only permission map for the given modules. */
|
|
|
+function viewOnlyPermissions(modules: PermissionModuleItem[]): Record<string, string[]> {
|
|
|
+ const result: Record<string, string[]> = {}
|
|
|
+ for (const mod of modules) {
|
|
|
+ const viewChildren = mod.children.filter(
|
|
|
+ (c) => c.permName === '查看' || c.permName.startsWith('查看')
|
|
|
+ )
|
|
|
+ if (viewChildren.length > 0) {
|
|
|
+ result[mod.moduleCode] = viewChildren.map((c) => c.frontPermCode)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result
|
|
|
+}
|
|
|
+
|
|
|
+/** Admin-level modules: forRoleTemplateType 10 + 20 + 30. */
|
|
|
+const ADMIN_MODULES = PERMISSION_TREE.filter(
|
|
|
+ (m) => m.forRoleTemplateType <= 30
|
|
|
+)
|
|
|
+
|
|
|
+/** User-level modules: forRoleTemplateType 10 only. */
|
|
|
+const USER_MODULES = PERMISSION_TREE.filter(
|
|
|
+ (m) => m.forRoleTemplateType === 10
|
|
|
+)
|
|
|
+
|
|
|
+/**
|
|
|
+ * Three default roles pre-configured with sensible permission sets.
|
|
|
+ * Root is locked; admin and common-user are editable.
|
|
|
+ */
|
|
|
+export const DEFAULT_ROLES: DefaultRoleConfig[] = [
|
|
|
+ {
|
|
|
+ key: 'root',
|
|
|
+ name: '超级管理员',
|
|
|
+ nameEn: 'Super Admin',
|
|
|
+ description: '拥有系统全部权限,不可修改',
|
|
|
+ descriptionEn: 'Full system access, locked',
|
|
|
+ isLocked: true,
|
|
|
+ permissions: allPermissions(PERMISSION_TREE),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'admin',
|
|
|
+ name: '管理员',
|
|
|
+ nameEn: 'Admin',
|
|
|
+ description: '拥有管理模块的全部权限',
|
|
|
+ descriptionEn: 'Full management module access',
|
|
|
+ isLocked: false,
|
|
|
+ permissions: allPermissions(ADMIN_MODULES),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'common',
|
|
|
+ name: '普通用户',
|
|
|
+ nameEn: 'Common User',
|
|
|
+ description: '仅拥有基础查看权限',
|
|
|
+ descriptionEn: 'Basic view-only access',
|
|
|
+ isLocked: false,
|
|
|
+ permissions: viewOnlyPermissions(USER_MODULES),
|
|
|
+ },
|
|
|
+]
|