refactor(task): 拆分 TaskService 并重构任务生命周期

- 将 task 公共协议/上下文/异常/schema 下沉到 core,并迁移 polling 目录
- 新增 execute/submit/video 子模块,拆分同步执行、异步提交流程、错误处理与视频任务操作
- 收敛 TaskService 为门面编排,内部委派到 SyncTaskExecutionService、AsyncTaskSubmitService、VideoTaskOperationsService
- 重构 main 生命周期管理:引入 LifecycleState,拆分启动与关闭流程
- 删除未使用的 TaskExecuteFacadeService 与 TaskSubmitFacadeService

Closes #201

Co-authored-by: AAEE86 <ppk0227@hotmail.com>
This commit is contained in:
fawney19
2026-03-07 15:33:29 +08:00
parent 4cd6e0d10f
commit 239238fe47
47 changed files with 3988 additions and 2447 deletions

View File

@@ -1,10 +1,12 @@
from types import SimpleNamespace
from types import SimpleNamespace
from typing import cast
from unittest.mock import AsyncMock, MagicMock
import pytest
from src.core.api_format.conversion.internal_video import InternalVideoPollResult, VideoStatus
from src.services.task.impl.video_poller import VideoTaskPollerAdapter
from src.models.database import VideoTask
from src.services.task.video.poller_adapter import VideoTaskPollerAdapter
@pytest.mark.asyncio
@@ -13,11 +15,14 @@ async def test_poll_task_status_routes_gemini_video_to_gemini(
) -> None:
adapter = VideoTaskPollerAdapter()
task = SimpleNamespace(
endpoint_id="e1",
key_id="k1",
provider_api_format="gemini:video",
external_task_id="operations/123",
task = cast(
VideoTask,
SimpleNamespace(
endpoint_id="e1",
key_id="k1",
provider_api_format="gemini:video",
external_task_id="operations/123",
),
)
endpoint = SimpleNamespace(id="e1", base_url="https://example.com", api_format="gemini:video")
key = SimpleNamespace(id="k1", api_key="enc")
@@ -25,12 +30,12 @@ async def test_poll_task_status_routes_gemini_video_to_gemini(
monkeypatch.setattr(adapter, "_get_endpoint", lambda _db, _id: endpoint)
monkeypatch.setattr(adapter, "_get_key", lambda _db, _id: key)
monkeypatch.setattr(
"src.services.task.impl.video_poller.crypto_service.decrypt", lambda _v: "decrypted"
"src.services.task.video.poller_adapter.crypto_service.decrypt", lambda _v: "decrypted"
)
auth_info = SimpleNamespace(auth_header="authorization", auth_value="Bearer x")
monkeypatch.setattr(
"src.services.task.impl.video_poller.get_provider_auth",
"src.services.task.video.poller_adapter.get_provider_auth",
AsyncMock(return_value=auth_info),
)