c82f430986
- RoadshowService:路演发布审核规则(operator 免审/政务范围免审/其余需审) - OrgService:my_orgs 批量查消除 N+1、成员管理(admin 校验) - 新增 Repository:Org.list_by_ids、OrgMember.list_for_user/get - rbac_investor/rbac_org 接线,路由瘦身
41 lines
1.8 KiB
Python
41 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""业务层 · 组织机构服务(成员管理,消除 N+1)。"""
|
|
from __future__ import annotations
|
|
|
|
from fastapi import HTTPException
|
|
|
|
from ..infrastructure.repositories import Database
|
|
|
|
|
|
class OrgService:
|
|
"""机构/组织成员管理。"""
|
|
|
|
def __init__(self, db: Database):
|
|
self.db = db
|
|
|
|
async def my_orgs(self, user_id: str) -> dict:
|
|
"""返回当前账号挂靠的所有机构及成员角色(支持一账号多机构,批量查避免 N+1)。"""
|
|
members = await self.db.org_members.list_for_user(user_id)
|
|
org_ids = [m["org_id"] for m in members]
|
|
orgs = {o["id"]: o for o in await self.db.orgs.list_by_ids(org_ids)} if org_ids else {}
|
|
return {"items": [
|
|
{"org": orgs[m["org_id"]], "member_role": m["role"], "is_admin": m["is_admin"]}
|
|
for m in members if m["org_id"] in orgs
|
|
]}
|
|
|
|
async def add_member(self, org_id: str, username: str, role: str, actor: dict) -> dict:
|
|
"""添加机构成员(须机构 admin,用户名解析为 user_id)。"""
|
|
org = await self.db.orgs.get(org_id)
|
|
if org is None:
|
|
raise HTTPException(status_code=404, detail="机构不存在")
|
|
actor_members = await self.db.org_members.list_for_org(org_id)
|
|
if not any(m["user_id"] == actor["id"] and m["is_admin"] for m in actor_members):
|
|
raise HTTPException(status_code=403, detail="仅机构管理员可添加成员")
|
|
user = await self.db.users.get_by_username(username)
|
|
if user is None:
|
|
raise HTTPException(status_code=404, detail="用户不存在")
|
|
existing = await self.db.org_members.get(org_id, user["id"])
|
|
if existing:
|
|
return existing
|
|
return await self.db.org_members.add_member(org_id, user["id"], role)
|