| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- """
- API WorkflowRun Repository Protocol
-
- This module defines the protocol for service-layer WorkflowRun operations.
- The repository provides an abstraction layer for WorkflowRun database operations
- used by service classes, separating service-layer concerns from core domain logic.
-
- Key Features:
- - Paginated workflow run queries with filtering
- - Bulk deletion operations with OSS backup support
- - Multi-tenant data isolation
- - Expired record cleanup with data retention
- - Service-layer specific query patterns
-
- Usage:
- This protocol should be used by service classes that need to perform
- WorkflowRun database operations. It provides a clean interface that
- hides implementation details and supports dependency injection.
-
- Example:
- ```python
- from repositories.dify_api_repository_factory import DifyAPIRepositoryFactory
-
- session_maker = sessionmaker(bind=db.engine, expire_on_commit=False)
- repo = DifyAPIRepositoryFactory.create_api_workflow_run_repository(session_maker)
-
- # Get paginated workflow runs
- runs = repo.get_paginated_workflow_runs(
- tenant_id="tenant-123",
- app_id="app-456",
- triggered_from="debugging",
- limit=20
- )
- ```
- """
-
- from collections.abc import Sequence
- from datetime import datetime
- from typing import Optional, Protocol
-
- from core.workflow.repositories.workflow_execution_repository import WorkflowExecutionRepository
- from libs.infinite_scroll_pagination import InfiniteScrollPagination
- from models.workflow import WorkflowRun
-
-
- class APIWorkflowRunRepository(WorkflowExecutionRepository, Protocol):
- """
- Protocol for service-layer WorkflowRun repository operations.
-
- This protocol defines the interface for WorkflowRun database operations
- that are specific to service-layer needs, including pagination, filtering,
- and bulk operations with data backup support.
- """
-
- def get_paginated_workflow_runs(
- self,
- tenant_id: str,
- app_id: str,
- triggered_from: str,
- limit: int = 20,
- last_id: Optional[str] = None,
- ) -> InfiniteScrollPagination:
- """
- Get paginated workflow runs with filtering.
-
- Retrieves workflow runs for a specific app and trigger source with
- cursor-based pagination support. Used primarily for debugging and
- workflow run listing in the UI.
-
- Args:
- tenant_id: Tenant identifier for multi-tenant isolation
- app_id: Application identifier
- triggered_from: Filter by trigger source (e.g., "debugging", "app-run")
- limit: Maximum number of records to return (default: 20)
- last_id: Cursor for pagination - ID of the last record from previous page
-
- Returns:
- InfiniteScrollPagination object containing:
- - data: List of WorkflowRun objects
- - limit: Applied limit
- - has_more: Boolean indicating if more records exist
-
- Raises:
- ValueError: If last_id is provided but the corresponding record doesn't exist
- """
- ...
-
- def get_workflow_run_by_id(
- self,
- tenant_id: str,
- app_id: str,
- run_id: str,
- ) -> Optional[WorkflowRun]:
- """
- Get a specific workflow run by ID.
-
- Retrieves a single workflow run with tenant and app isolation.
- Used for workflow run detail views and execution tracking.
-
- Args:
- tenant_id: Tenant identifier for multi-tenant isolation
- app_id: Application identifier
- run_id: Workflow run identifier
-
- Returns:
- WorkflowRun object if found, None otherwise
- """
- ...
-
- def get_expired_runs_batch(
- self,
- tenant_id: str,
- before_date: datetime,
- batch_size: int = 1000,
- ) -> Sequence[WorkflowRun]:
- """
- Get a batch of expired workflow runs for cleanup.
-
- Retrieves workflow runs created before the specified date for
- cleanup operations. Used by scheduled tasks to remove old data
- while maintaining data retention policies.
-
- Args:
- tenant_id: Tenant identifier for multi-tenant isolation
- before_date: Only return runs created before this date
- batch_size: Maximum number of records to return
-
- Returns:
- Sequence of WorkflowRun objects to be processed for cleanup
- """
- ...
-
- def delete_runs_by_ids(
- self,
- run_ids: Sequence[str],
- ) -> int:
- """
- Delete workflow runs by their IDs.
-
- Performs bulk deletion of workflow runs by ID. This method should
- be used after backing up the data to OSS storage for retention.
-
- Args:
- run_ids: Sequence of workflow run IDs to delete
-
- Returns:
- Number of records actually deleted
-
- Note:
- This method performs hard deletion. Ensure data is backed up
- to OSS storage before calling this method for compliance with
- data retention policies.
- """
- ...
-
- def delete_runs_by_app(
- self,
- tenant_id: str,
- app_id: str,
- batch_size: int = 1000,
- ) -> int:
- """
- Delete all workflow runs for a specific app.
-
- Performs bulk deletion of all workflow runs associated with an app.
- Used during app cleanup operations. Processes records in batches
- to avoid memory issues and long-running transactions.
-
- Args:
- tenant_id: Tenant identifier for multi-tenant isolation
- app_id: Application identifier
- batch_size: Number of records to process in each batch
-
- Returns:
- Total number of records deleted across all batches
-
- Note:
- This method performs hard deletion without backup. Use with caution
- and ensure proper data retention policies are followed.
- """
- ...
|