Develop #16
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user