from __future__ import annotations from dataclasses import dataclass from typing import Any from iti.storage import StorageManager from iti.tasks import task_registry from .base import ExchangeTaskKind @dataclass(frozen=True) class ExchangeTaskContext: task_kind: ExchangeTaskKind template_id: str version: str storage_key: str | None = None payload: dict[str, Any] | None = None @dataclass(frozen=True) class ExchangeTaskResult: success_count: int = 0 failed_count: int = 0 message: str | None = None result_payload: dict[str, Any] | None = None def register_exchange_task( *, name: str, handler, schedule: str | None = None, description: str | None = None, ): return task_registry.register( name=name, handler=handler, schedule=schedule, description=description, ) def wrap_exchange_task(handler): def runner(context: ExchangeTaskContext): return handler(context) return runner def get_exchange_storage(app): base_config = dict(getattr(app.state.config, "file_storage", {}) or {}) exchange_config = dict(getattr(app.state.config, "exchange_storage", {}) or {}) base_config.update(exchange_config) default_storage = getattr(app.state.config, "exchange_default_storage", None) if default_storage and "DEFAULT_STORAGE_TYPE" not in exchange_config: base_config["DEFAULT_STORAGE_TYPE"] = default_storage base_dir = getattr(app.state.config, "base_dir", None) return StorageManager.get_storage(config=base_config, base_dir=base_dir)