54 lines
1.6 KiB
Python
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
|