Skip to main content
Glama
resource_dtos.py8.62 kB
"""资源管理相关的DTO类。 定义资源操作、API创建、组管理等的数据传输对象。 """ from __future__ import annotations from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any, Dict, List, Optional from datetime import datetime if TYPE_CHECKING: from .api_dtos import ApiEndpointInfo @dataclass class ResourceOperationRequest: """资源操作请求对象。""" operation: str # 操作类型: 'copy', 'move', 'delete' resource_id: Optional[str] = None resource_ids: Optional[List[str]] = None # 批量操作时使用 target_id: Optional[str] = None # copy/move操作的目标ID group_id: Optional[str] = None # 分组ID,用于过滤 def validate(self) -> bool: """验证请求参数。""" # 必须指定操作类型 if not self.operation: return False # 不同操作的必需参数 if self.operation in ['copy', 'move']: if not self.resource_id or not self.target_id: return False elif self.operation == 'delete': if not self.resource_id and not self.resource_ids: return False return True def get_validation_errors(self) -> list[str]: """获取验证错误信息。""" errors = [] if not self.operation: errors.append("操作类型不能为空") if self.operation in ['copy', 'move']: if not self.resource_id: errors.append("资源ID不能为空") if not self.target_id: errors.append("目标ID不能为空") elif self.operation == 'delete': if not self.resource_id and not self.resource_ids: errors.append("必须提供资源ID或资源ID列表") return errors @dataclass class ApiCreationRequest: """API创建/更新请求对象。""" group_id: Optional[str] = None name: Optional[str] = None method: str = "GET" path: Optional[str] = None script: Optional[str] = None id: Optional[str] = None # 更新时使用 description: Optional[str] = None parameters: Optional[str] = None # JSON字符串 headers: Optional[str] = None # JSON字符串 paths: Optional[str] = None # JSON字符串 request_body: Optional[str] = None request_body_definition: Optional[str] = None # JSON字符串 response_body: Optional[str] = None response_body_definition: Optional[str] = None # JSON字符串 options: Optional[str] = None # JSON字符串 created_at: Optional[datetime] = field(default_factory=datetime.now) updated_at: Optional[datetime] = field(default_factory=datetime.now) def validate(self) -> bool: """验证API创建请求。""" # 创建操作必需字段 if not self.id: # 创建操作 required_fields = [self.group_id, self.name, self.path, self.script] if not all(required_fields): return False # method必须有效 valid_methods = {"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"} if self.method.upper() not in valid_methods: return False return True def get_validation_errors(self) -> list[str]: """获取验证错误信息。""" errors = [] if not self.id: # 创建操作 if not self.group_id: errors.append("分组ID不能为空") if not self.name: errors.append("API名称不能为空") if not self.path: errors.append("API路径不能为空") if not self.script: errors.append("脚本内容不能为空") valid_methods = {"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"} if self.method.upper() not in valid_methods: errors.append(f"不支持的HTTP方法: {self.method}") return errors def to_dict(self) -> Dict[str, Any]: """转换为字典格式。""" result = {} for key, value in self.__dict__.items(): if value is not None: if isinstance(value, datetime): result[key] = value.isoformat() else: result[key] = value return result def to_api_endpoint_info(self) -> 'ApiEndpointInfo': """转换为API端点信息对象。""" # 动态导入以避免循环依赖 from . import api_dtos ApiEndpointInfo = api_dtos.ApiEndpointInfo return ApiEndpointInfo( id=self.id, method=self.method, path=self.path, name=self.name, group_id=self.group_id, description=self.description, script=self.script, request_body=self.request_body, response_body=self.response_body, # JSON字段会在服务层解析 ) @dataclass class GroupCreationRequest: """分组创建/更新请求对象。""" name: Optional[str] = None id: Optional[str] = None # 更新时使用 parent_id: str = "0" type: str = "api" # 'api', 'function', 'task', 'datasource' path: Optional[str] = None options: Optional[str] = None # JSON字符串 def validate(self) -> bool: """验证分组创建请求。""" # 创建操作必需名称 if not self.id and not self.name: return False # 类型必须有效 valid_types = {"api", "function", "task", "datasource"} if self.type not in valid_types: return False return True def get_validation_errors(self) -> list[str]: """获取验证错误信息。""" errors = [] if not self.id and not self.name: errors.append("分组名称不能为空") valid_types = {"api", "function", "task", "datasource"} if self.type not in valid_types: errors.append(f"不支持的分组类型: {self.type}") return errors @dataclass class LockStatusRequest: """锁定状态操作请求对象。""" resource_id: str action: str # 'read', 'lock', 'unlock' def validate(self) -> bool: """验证锁定状态请求。""" if not self.resource_id: return False if self.action not in ['read', 'lock', 'unlock']: return False return True def get_validation_errors(self) -> list[str]: """获取验证错误信息。""" errors = [] if not self.resource_id: errors.append("资源ID不能为空") if self.action not in ['read', 'lock', 'unlock']: errors.append(f"不支持的操作类型: {self.action}") return errors @dataclass class LockStatusResponse: """锁定状态操作响应对象。""" success: bool = False resource_id: str = "" action: str = "" is_locked: Optional[bool] = None # 只有read操作时才返回 message: str = "" details: Optional[Dict[str, Any]] = None created_at: Optional[datetime] = field(default_factory=datetime.now) updated_at: Optional[datetime] = field(default_factory=datetime.now) def to_dict(self) -> Dict[str, Any]: """转换为字典格式。""" result = {} for key, value in self.__dict__.items(): if value is not None: if isinstance(value, datetime): result[key] = value.isoformat() else: result[key] = value return result @dataclass class ResourceOperationResponse: """资源操作响应对象。""" success: bool = False operation: str = "" resource_id: Optional[str] = None resource_ids: Optional[List[str]] = None # 批量操作时使用 target_id: Optional[str] = None message: str = "" affected_count: int = 0 details: Optional[Dict[str, Any]] = None created_at: Optional[datetime] = field(default_factory=datetime.now) updated_at: Optional[datetime] = field(default_factory=datetime.now) def to_dict(self) -> Dict[str, Any]: """转换为字典格式。""" result = {} for key, value in self.__dict__.items(): if value is not None: if isinstance(value, datetime): result[key] = value.isoformat() else: result[key] = value return result @property def has_error(self) -> bool: """检查是否有错误。""" return not self.success

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Dwsy/magic-api-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server