"""Base executor class for all task types.""" from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Any, Optional from app.utils.logger import get_logger @dataclass class ExecutionResult: """Result of task execution.""" success: bool data: dict[str, Any] error: Optional[str] = None duration_ms: Optional[float] = None class BaseExecutor(ABC): """Abstract base class for task executors. All executors must implement the execute() method. """ def __init__(self): self.logger = get_logger(self.__class__.__name__) @property @abstractmethod def task_type(self) -> str: """Return the task type this executor handles.""" pass @abstractmethod async def execute(self, payload: dict[str, Any]) -> ExecutionResult: """Execute the task with the given payload. Args: payload: Task-specific payload data Returns: ExecutionResult with success status and result data """ pass def validate_payload(self, payload: dict[str, Any], required_fields: list[str]) -> None: """Validate that required fields are present in payload. Args: payload: Task payload required_fields: List of required field names Raises: ValueError: If a required field is missing """ missing = [f for f in required_fields if f not in payload] if missing: raise ValueError(f"Missing required fields: {', '.join(missing)}")