Files
server-core/app/api/routers/rbac_permissions.py
T
Pine 416ade4842 feat: 统一权限聚合端点 + 事件名同步昵称 + IM/企业路由补强
- 新增 rbac_permissions 统一权限/组织归属聚合端点
- sync_event_name_to_nickname 脚本:事件名同步用户昵称
- im router/client、rbac_enterprise/opc/org/public 增强
- compute_catalog、nginx 配置、env.example 更新
2026-09-11 21:15:36 +08:00

79 lines
3.0 KiB
Python

# -*- coding: utf-8 -*-
"""统一权限聚合端点:前端一次性拉取当前用户的完整权限与组织归属。"""
from __future__ import annotations
import logging
from fastapi import APIRouter, Depends
from sqlalchemy import select
from ..dependencies import get_db, get_current_user
from ...infrastructure.models import Organization, OrganizationMember, ParkTenant
from ...infrastructure.repositories import Database
from ...park import tenants as tnt
log = logging.getLogger("rbac.permissions")
router = APIRouter(tags=["permissions"])
@router.get("/permissions/me", summary="当前用户完整权限聚合")
async def my_permissions(
db: Database = Depends(get_db),
user: dict = Depends(get_current_user),
):
"""聚合角色/能力/权限码 + 园区/企业/机构三类归属,供前端一次性渲染。"""
uid = user["id"]
caps = user.get("capabilities") or []
# 园区管理员:park_tenants.operator_user_id 指向当前用户
park_admin_rows = (await db.session.execute(
select(ParkTenant.id, ParkTenant.name).where(ParkTenant.operator_user_id == uid)
)).all()
park_admin_of = [{"id": r[0], "name": r[1] or ""} for r in park_admin_rows]
# 企业成员/管理员:company_members WHERE user_id = uid(补企业名称)
company_admin_of: list[dict] = []
company_member_of: list[dict] = []
for m in await db.company_members.list_by_user(uid):
co = await tnt.get_company(m["company_id"])
item = {
"company_id": m["company_id"],
"company_name": (co or {}).get("name", ""),
"is_admin": bool(m.get("is_admin")),
"member_type": m.get("member_type", ""),
"status": m.get("status", ""),
}
company_member_of.append(item)
if item["is_admin"]:
company_admin_of.append(item)
# 机构(载体)成员:organization_members WHERE user_id = uid(补机构名称/类型)
org_member_of: list[dict] = []
for m in (await db.session.scalars(
select(OrganizationMember).where(OrganizationMember.user_id == uid))).all():
org = await db.session.get(Organization, m.org_id)
org_member_of.append({
"org_id": m.org_id,
"name": org.name if org else "",
"type": org.type if org else "",
"role": m.role,
"is_admin": bool(m.is_admin),
"status": m.status,
})
return {
"user_id": uid,
"role": user.get("role"),
"sub_role": user.get("sub_role"),
"capabilities": caps,
"permissions": user.get("permissions", []),
"is_operator": user.get("role") == "operator" or "operator" in caps,
"is_carrier": user.get("role") == "carrier" or "carrier" in caps,
"is_enterprise_admin": "enterprise" in caps,
"park_admin_of": park_admin_of,
"company_admin_of": company_admin_of,
"company_member_of": company_member_of,
"org_member_of": org_member_of,
}