""" 移除成员 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)}"