mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 03:56:43 +08:00
72 lines
2.4 KiB
Python
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()
|