Files
MoviePilot/app/startup/workflow.py
T

72 lines
2.4 KiB
Python

"""工作流执行状态事务适配器。"""
from collections.abc import Callable
from typing import Any, TypeVar
from sqlalchemy.orm import Session
from app.application.workflow import WorkflowExecutionCommand
from app.db.oper.workflow import WorkflowOper
from app.db.uow import SqlAlchemyUnitOfWork
_Result = TypeVar("_Result")
class TransactionalWorkflowExecutionService:
"""为每次工作流执行状态写入创建独立短会话和 UnitOfWork。"""
def __init__(self, session_factory: Callable[[], Session]) -> None:
"""保存由启动组合根提供的同步 Session 工厂。"""
self._session_factory = session_factory
def start(self, workflow_id: int) -> bool:
"""以独立事务提交运行中状态。"""
return self._run(lambda command: command.start(workflow_id))
def success(self, workflow_id: int, result: str | None = None) -> bool:
"""以独立事务提交成功状态。"""
return self._run(lambda command: command.success(workflow_id, result))
def fail(self, workflow_id: int, result: str) -> bool:
"""以独立事务提交失败状态。"""
return self._run(lambda command: command.fail(workflow_id, result))
def step(
self,
workflow_id: int,
action_id: str,
context: dict[str, Any],
execution_state: dict[str, Any] | None = None,
) -> bool:
"""以独立事务提交动作进度。"""
return self._run(
lambda command: command.step(
workflow_id,
action_id,
context,
execution_state,
)
)
def reset(self, workflow_id: int, reset_count: bool = False) -> bool:
"""以独立事务提交执行状态重置。"""
return self._run(
lambda command: command.reset(workflow_id, reset_count)
)
def _run(
self,
operation: Callable[[WorkflowExecutionCommand], _Result],
) -> _Result:
"""创建短会话并把提交/回滚交给 Application command。"""
session = self._session_factory()
try:
command = WorkflowExecutionCommand(
repository=WorkflowOper(db=session),
unit_of_work=SqlAlchemyUnitOfWork(session),
)
return operation(command)
finally:
session.close()