172 lines
5.4 KiB
Python
172 lines
5.4 KiB
Python
"""
|
||
移除成员 Use Case
|
||
"""
|
||
|
||
from typing import Optional
|
||
|
||
from packages.domain.entities import WorkspaceMemberRole
|
||
|
||
|
||
class RemoveMemberRequest:
|
||
"""移除成员请求"""
|
||
|
||
def __init__(
|
||
self,
|
||
workspace_id: str,
|
||
requester_user_id: str,
|
||
target_user_id: str,
|
||
):
|
||
self.workspace_id = workspace_id
|
||
self.requester_user_id = requester_user_id
|
||
self.target_user_id = target_user_id
|
||
|
||
|
||
class RemoveMemberUseCase:
|
||
"""移除成员用例"""
|
||
|
||
def __init__(
|
||
self,
|
||
workspace_repository,
|
||
workspace_member_repository,
|
||
):
|
||
self.workspace_repository = workspace_repository
|
||
self.workspace_member_repository = workspace_member_repository
|
||
|
||
def execute(self, request: RemoveMemberRequest) -> tuple[bool, Optional[str]]:
|
||
"""
|
||
执行移除成员
|
||
|
||
Args:
|
||
request: 移除请求
|
||
|
||
Returns:
|
||
(是否成功, 错误信息)
|
||
"""
|
||
try:
|
||
# 1. 验证输入
|
||
if not request.workspace_id:
|
||
return False, "Workspace ID is required"
|
||
|
||
if not request.requester_user_id:
|
||
return False, "Requester user ID is required"
|
||
|
||
if not request.target_user_id:
|
||
return False, "Target user ID is required"
|
||
|
||
# 2. 验证 Workspace 存在
|
||
workspace = self.workspace_repository.find_by_id(request.workspace_id)
|
||
if not workspace:
|
||
return False, "Workspace not found"
|
||
|
||
# 3. 验证请求者是成员且有权限
|
||
requester_member = self.workspace_member_repository.find_by_workspace_and_user(
|
||
request.workspace_id,
|
||
request.requester_user_id,
|
||
)
|
||
if not requester_member:
|
||
return False, "You are not a member of this workspace"
|
||
|
||
if requester_member.role not in [
|
||
WorkspaceMemberRole.OWNER,
|
||
WorkspaceMemberRole.ADMIN,
|
||
]:
|
||
return False, "Only owners and admins can remove members"
|
||
|
||
# 4. 验证目标成员存在
|
||
target_member = self.workspace_member_repository.find_by_workspace_and_user(
|
||
request.workspace_id,
|
||
request.target_user_id,
|
||
)
|
||
if not target_member:
|
||
return False, "Target user is not a member of this workspace"
|
||
|
||
# 5. 不能移除自己(应该用离开 workspace 的功能)
|
||
if request.requester_user_id == request.target_user_id:
|
||
return False, "Cannot remove yourself. Use leave workspace instead."
|
||
|
||
# 6. 不能移除 owner
|
||
if target_member.role == WorkspaceMemberRole.OWNER:
|
||
return False, "Cannot remove the workspace owner"
|
||
|
||
# 7. Admin 不能移除另一个 Admin(只有 owner 可以)
|
||
if requester_member.role == WorkspaceMemberRole.ADMIN and target_member.role == WorkspaceMemberRole.ADMIN:
|
||
return False, "Admins cannot remove other admins"
|
||
|
||
# 8. 删除成员记录
|
||
success = self.workspace_member_repository.delete(target_member.id)
|
||
if not success:
|
||
return False, "Failed to remove member"
|
||
|
||
return True, None
|
||
|
||
except Exception as e:
|
||
return False, f"Failed to remove member: {str(e)}"
|
||
|
||
|
||
class LeaveWorkspaceRequest:
|
||
"""离开 Workspace 请求"""
|
||
|
||
def __init__(self, workspace_id: str, user_id: str):
|
||
self.workspace_id = workspace_id
|
||
self.user_id = user_id
|
||
|
||
|
||
class LeaveWorkspaceUseCase:
|
||
"""离开 Workspace 用例"""
|
||
|
||
def __init__(
|
||
self,
|
||
workspace_repository,
|
||
workspace_member_repository,
|
||
):
|
||
self.workspace_repository = workspace_repository
|
||
self.workspace_member_repository = workspace_member_repository
|
||
|
||
def execute(self, request: LeaveWorkspaceRequest) -> tuple[bool, Optional[str]]:
|
||
"""
|
||
执行离开 Workspace
|
||
|
||
Args:
|
||
request: 离开请求
|
||
|
||
Returns:
|
||
(是否成功, 错误信息)
|
||
"""
|
||
try:
|
||
# 1. 验证输入
|
||
if not request.workspace_id:
|
||
return False, "Workspace ID is required"
|
||
|
||
if not request.user_id:
|
||
return False, "User ID is required"
|
||
|
||
# 2. 验证 Workspace 存在
|
||
workspace = self.workspace_repository.find_by_id(request.workspace_id)
|
||
if not workspace:
|
||
return False, "Workspace not found"
|
||
|
||
# 3. 验证用户是成员
|
||
member = self.workspace_member_repository.find_by_workspace_and_user(
|
||
request.workspace_id,
|
||
request.user_id,
|
||
)
|
||
if not member:
|
||
return False, "You are not a member of this workspace"
|
||
|
||
# 4. Owner 不能离开(需要先转移 ownership 或删除 workspace)
|
||
if member.role == WorkspaceMemberRole.OWNER:
|
||
return (
|
||
False,
|
||
"Owner cannot leave workspace. Transfer ownership or delete workspace first.",
|
||
)
|
||
|
||
# 5. 删除成员记录
|
||
success = self.workspace_member_repository.delete(member.id)
|
||
if not success:
|
||
return False, "Failed to leave workspace"
|
||
|
||
return True, None
|
||
|
||
except Exception as e:
|
||
return False, f"Failed to leave workspace: {str(e)}"
|