fix: import workspace member

This commit is contained in:
tao.chen
2026-08-07 19:25:04 +08:00
parent 45808192e0
commit 7b4b752109
+20 -4
View File
@@ -854,19 +854,35 @@ async def add_member(
status.HTTP_422_UNPROCESSABLE_ENTITY, status.HTTP_422_UNPROCESSABLE_ENTITY,
"用户的平台角色行不存在或已被删除", "用户的平台角色行不存在或已被删除",
) )
duplicate = await session.scalar( # ``WorkspaceMembers`` 的主键是 ``(workspace_id, user_id)`` 复合 PK,
select(WorkspaceMembers.user_id).where( # 而 ``remove_member`` / ``delete_platform_employee`` 都是软删除 (保留行,
# 仅置 ``is_deleted=1``). 因此这里必须按主键查整行,而不是只看活跃行:
# 否则软删行会被 active-duplicate 检查漏过,然后 INSERT 直接撞 PK.
existing = await session.scalar(
select(WorkspaceMembers).where(
WorkspaceMembers.workspace_id == workspace_id, WorkspaceMembers.workspace_id == workspace_id,
WorkspaceMembers.user_id == payload.user_id, WorkspaceMembers.user_id == payload.user_id,
WorkspaceMembers.is_deleted == 0,
) )
) )
if duplicate is not None: if existing is not None:
if existing.is_deleted == 0:
raise HTTPException( raise HTTPException(
status.HTTP_409_CONFLICT, status.HTTP_409_CONFLICT,
"用户已是该 workspace 成员;workspace 角色继承自平台角色," "用户已是该 workspace 成员;workspace 角色继承自平台角色,"
"要变更请 PATCH /api/v1/platform/employees/{user_id} 修改 role_code", "要变更请 PATCH /api/v1/platform/employees/{user_id} 修改 role_code",
) )
# 复活软删除行. 保留 ``joined_at`` 作为历史记录;``role_id`` 重新继承
# 当前用户的平台角色 (用户在中间可能改过 platform_role);清掉
# ``deleted_at`` 标记本轮已不在软删状态.
existing.is_deleted = 0
existing.deleted_at = None
existing.role_id = role.role_id
existing.member_status = "active"
await session.flush()
await session.refresh(existing)
return _envelope(
context.request_id, member_payload(user, role, existing),
)
membership = WorkspaceMembers( membership = WorkspaceMembers(
workspace_id=workspace_id, workspace_id=workspace_id,
user_id=payload.user_id, user_id=payload.user_id,