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