# ============================================================================= # 企微IT智能服务台 — RBAC 角色种子数据 (v0.7.1 task #86) # ============================================================================= # 启动时调用,把 5 角色 + 权限矩阵写入 roles 表 # 兼容"角色已存在"的场景: 不重复插入,但更新 permissions # ============================================================================= import logging import uuid from datetime import datetime from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.role import Role from app.services.rbac_service import ( ROLE_METADATA, get_role_default_permissions, ) logger = logging.getLogger(__name__) async def seed_rbac_roles(db: AsyncSession) -> int: """种子 RBAC 5 角色。 行为: 1. 遍历 ROLE_METADATA 2. 角色不存在 → 创建(UUID + 默认 permissions) 3. 角色存在 → 更新 display_name / description / permissions (不动 is_default,避免影响手动设置) Returns: int: 新建角色数 """ created_count = 0 for role_name, meta in ROLE_METADATA.items(): # 查询是否已存在 stmt = select(Role).where(Role.name == role_name) result = await db.execute(stmt) role = result.scalars().first() permissions = get_role_default_permissions(role_name) if role: # 更新现有角色(不动 is_default,防止覆盖手动设置) role.display_name = meta["display_name"] role.description = meta["description"] role.permissions = permissions role.updated_at = datetime.now() logger.debug(f"更新角色: {role_name} ({len(permissions)} 项权限)") else: # 创建新角色 role = Role( id=str(uuid.uuid4()), name=role_name, display_name=meta["display_name"], description=meta["description"], permissions=permissions, is_default=(meta["is_default"] == "true"), created_at=datetime.now(), updated_at=datetime.now(), ) db.add(role) created_count += 1 logger.info(f"创建角色: {role_name} ({len(permissions)} 项权限)") await db.commit() logger.info(f"RBAC 角色种子完成: 新建 {created_count} 个") return created_count