refactor(api): TOML 配置 SSOT、统一错误契约、Auth/事务加固与可观测性 (#33)

配置 SSOT(TOML + .env)
统一错误契约
Auth 与事务边界
Redis / Celery 可靠性:业务 Redis(DB/0)与 Celery broker/backend(DB/1)显式拆分;连接池、sync client
可观测性(OpenTelemetry + LGTM)
This commit is contained in:
Sully
2026-05-22 13:44:50 +08:00
committed by GitHub
parent f09ae248f9
commit 53e0065e3e
298 changed files with 15247 additions and 4344 deletions

View File

@@ -30,6 +30,7 @@ from app.features.payment import models as _payment_models # noqa: F401
from app.features.story import models as _story_models # noqa: F401
from app.features.user import models as _user_models # noqa: F401
from app.features.user.models import User
from app.features.memoir.constants import memoir
from app.tasks.memoir_tasks import (
_persist_phase2_route_defer,
_wake_deferred_segments_for_category,
@@ -185,7 +186,7 @@ def test_pipeline_does_not_defer_when_disabled(
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""关闭开关后,旧行为:直接写 new_story不再延迟"""
monkeypatch.setattr(settings, "memoir_route_defer_enabled", False)
monkeypatch.setattr(memoir, "route_defer_enabled", False)
seg = SimpleNamespace(id="seg-no-defer", user_input_text="一句简短的口述")
decide_return = StoryRouteDecision(
@@ -298,8 +299,8 @@ def test_persist_phase2_route_defer_marks_segment_and_schedules_next(
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""首次延迟:写入 defer 元数据并安排下一次 timeout未达上限"""
monkeypatch.setattr(settings, "memoir_route_defer_seconds", 30.0)
monkeypatch.setattr(settings, "memoir_route_defer_max_attempts", 3)
monkeypatch.setattr(memoir, "route_defer_seconds", 30.0)
monkeypatch.setattr(memoir, "route_defer_max_attempts", 3)
db = sqlite_session_factory()
seg = _seed_user_segment(
@@ -345,8 +346,8 @@ def test_persist_phase2_route_defer_stops_scheduling_at_max_attempts(
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""达到 max_attempts 后不再继续派发 timeoutsegment 仍保留 defer 元数据。"""
monkeypatch.setattr(settings, "memoir_route_defer_seconds", 30.0)
monkeypatch.setattr(settings, "memoir_route_defer_max_attempts", 2)
monkeypatch.setattr(memoir, "route_defer_seconds", 30.0)
monkeypatch.setattr(memoir, "route_defer_max_attempts", 2)
db = sqlite_session_factory()
seg = _seed_user_segment(