139 lines
4.2 KiB
Python
139 lines
4.2 KiB
Python
"""
|
|
创建 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)}"
|