416ade4842
- 新增 rbac_permissions 统一权限/组织归属聚合端点 - sync_event_name_to_nickname 脚本:事件名同步用户昵称 - im router/client、rbac_enterprise/opc/org/public 增强 - compute_catalog、nginx 配置、env.example 更新
79 lines
3.0 KiB
Python
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,
|
|
}
|