PMFlow/backend/app/utils/project_members.py

54 lines
1.6 KiB
Python

from __future__ import annotations
from sqlalchemy import and_, select
from sqlalchemy.ext.asyncio import AsyncSession
from ..models import UserProject
from ..services.project_member_service import resolve_project_member_ids
async def ensure_project_default_members(
db: AsyncSession,
*,
tenant_id: int,
project_id: int,
owner_id: int | None,
assigned_role: str | None,
requested_member_user_ids: list[int] | None = None,
) -> list[int]:
member_ids = set(
await resolve_project_member_ids(
db,
tenant_id=int(tenant_id),
owner_id=int(owner_id) if owner_id is not None else None,
assigned_role=assigned_role,
requested_member_user_ids=requested_member_user_ids or [],
require_requested_members=False,
include_owner=True,
)
)
existing_rows = await db.execute(
select(UserProject.user_id).where(
and_(
UserProject.tenant_id == int(tenant_id),
UserProject.project_id == int(project_id),
)
)
)
existing_member_ids = {int(user_id) for user_id in existing_rows.scalars().all()}
for user_id in sorted(member_ids - existing_member_ids):
db.add(
UserProject(
tenant_id=int(tenant_id),
user_id=int(user_id),
project_id=int(project_id),
)
)
all_member_ids = sorted(member_ids.union(existing_member_ids))
if not all_member_ids:
raise ValueError("项目成员为空,已拒绝写入")
return all_member_ids