| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- """
- Repository factory for dynamically creating repository instances based on configuration.
-
- This module provides a Django-like settings system for repository implementations,
- allowing users to configure different repository backends through string paths.
- """
-
- from typing import Union
-
- from sqlalchemy.engine import Engine
- from sqlalchemy.orm import sessionmaker
-
- from configs import dify_config
- from core.workflow.repositories.workflow_execution_repository import WorkflowExecutionRepository
- from core.workflow.repositories.workflow_node_execution_repository import WorkflowNodeExecutionRepository
- from libs.module_loading import import_string
- from models import Account, EndUser
- from models.enums import WorkflowRunTriggeredFrom
- from models.workflow import WorkflowNodeExecutionTriggeredFrom
-
-
- class RepositoryImportError(Exception):
- """Raised when a repository implementation cannot be imported or instantiated."""
-
- pass
-
-
- class DifyCoreRepositoryFactory:
- """
- Factory for creating repository instances based on configuration.
-
- This factory supports Django-like settings where repository implementations
- are specified as module paths (e.g., 'module.submodule.ClassName').
- """
-
- @classmethod
- def create_workflow_execution_repository(
- cls,
- session_factory: Union[sessionmaker, Engine],
- user: Union[Account, EndUser],
- app_id: str,
- triggered_from: WorkflowRunTriggeredFrom,
- ) -> WorkflowExecutionRepository:
- """
- Create a WorkflowExecutionRepository instance based on configuration.
-
- Args:
- session_factory: SQLAlchemy sessionmaker or engine
- user: Account or EndUser object
- app_id: Application ID
- triggered_from: Source of the execution trigger
-
- Returns:
- Configured WorkflowExecutionRepository instance
-
- Raises:
- RepositoryImportError: If the configured repository cannot be created
- """
- class_path = dify_config.CORE_WORKFLOW_EXECUTION_REPOSITORY
-
- try:
- repository_class = import_string(class_path)
- return repository_class( # type: ignore[no-any-return]
- session_factory=session_factory,
- user=user,
- app_id=app_id,
- triggered_from=triggered_from,
- )
- except (ImportError, Exception) as e:
- raise RepositoryImportError(f"Failed to create WorkflowExecutionRepository from '{class_path}': {e}") from e
-
- @classmethod
- def create_workflow_node_execution_repository(
- cls,
- session_factory: Union[sessionmaker, Engine],
- user: Union[Account, EndUser],
- app_id: str,
- triggered_from: WorkflowNodeExecutionTriggeredFrom,
- ) -> WorkflowNodeExecutionRepository:
- """
- Create a WorkflowNodeExecutionRepository instance based on configuration.
-
- Args:
- session_factory: SQLAlchemy sessionmaker or engine
- user: Account or EndUser object
- app_id: Application ID
- triggered_from: Source of the execution trigger
-
- Returns:
- Configured WorkflowNodeExecutionRepository instance
-
- Raises:
- RepositoryImportError: If the configured repository cannot be created
- """
- class_path = dify_config.CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY
-
- try:
- repository_class = import_string(class_path)
- return repository_class( # type: ignore[no-any-return]
- session_factory=session_factory,
- user=user,
- app_id=app_id,
- triggered_from=triggered_from,
- )
- except (ImportError, Exception) as e:
- raise RepositoryImportError(
- f"Failed to create WorkflowNodeExecutionRepository from '{class_path}': {e}"
- ) from e
|