""" 创建 Workspace Use Case """ from datetime import datetime, timezone from typing import Optional from uuid import uuid4 from packages.domain.entities import Workspace, WorkspaceMember, WorkspaceMemberRole class CreateWorkspaceRequest: """创建工作空间请求""" def __init__( self, name: str, owner_user_id: str, subscription_plan: str = "free", ): self.name = name.strip() self.owner_user_id = owner_user_id self.subscription_plan = subscription_plan class CreateWorkspaceResponse: """创建工作空间响应""" def __init__( self, workspace_id: str, name: str, subscription_plan: str, max_projects: int, max_storage_gb: int, ): self.workspace_id = workspace_id self.name = name self.subscription_plan = subscription_plan self.max_projects = max_projects self.max_storage_gb = max_storage_gb class CreateWorkspaceUseCase: """创建工作空间用例""" # 订阅计划配额配置 PLAN_QUOTAS = { "free": {"max_projects": 3, "max_storage_gb": 10}, "pro": {"max_projects": 999999, "max_storage_gb": 100}, # 999999 表示无限 "enterprise": {"max_projects": 999999, "max_storage_gb": 1000}, } def __init__( self, workspace_repository, workspace_member_repository, user_repository, ): self.workspace_repository = workspace_repository self.workspace_member_repository = workspace_member_repository self.user_repository = user_repository def execute(self, request: CreateWorkspaceRequest) -> tuple[Optional[CreateWorkspaceResponse], Optional[str]]: """ 执行创建工作空间 Args: request: 创建请求 Returns: (响应, 错误信息) """ try: # 1. 验证输入 if not request.name: return None, "Workspace name is required" if len(request.name) > 100: return None, "Workspace name is too long (max 100 characters)" if not request.owner_user_id: return None, "Owner user ID is required" # 2. 验证用户存在 owner = self.user_repository.find_by_id(request.owner_user_id) if not owner: return None, "Owner user not found" # 3. 验证订阅计划 if request.subscription_plan not in self.PLAN_QUOTAS: return None, f"Invalid subscription plan: {request.subscription_plan}" # 4. 获取配额 quota = self.PLAN_QUOTAS[request.subscription_plan] # 5. 创建 Workspace workspace = Workspace( id=uuid4().hex, name=request.name, owner_user_id=request.owner_user_id, subscription_plan=request.subscription_plan, subscription_status="active", max_projects=quota["max_projects"], max_storage_gb=quota["max_storage_gb"], used_storage_gb=0.0, created_at=datetime.now(timezone.utc), ) # 6. 保存 Workspace self.workspace_repository.save(workspace) # 7. 创建 Owner 成员记录 owner_member = WorkspaceMember( id=uuid4().hex, workspace_id=workspace.id, user_id=request.owner_user_id, role=WorkspaceMemberRole.OWNER, invited_by=None, # Owner 不需要邀请 joined_at=datetime.now(timezone.utc), ) self.workspace_member_repository.save(owner_member) # 8. 返回响应 return ( CreateWorkspaceResponse( workspace_id=workspace.id, name=workspace.name, subscription_plan=workspace.subscription_plan, max_projects=workspace.max_projects, max_storage_gb=workspace.max_storage_gb, ), None, ) except Exception as e: return None, f"Failed to create workspace: {str(e)}"